学习Golang之服务器框架编写 – 开篇

写在前面的废话

最近几年一直关注Golang(后面简称Go)的发展,最开始翻看了很多关于Go独特优点以及如何解决传统C/C++程序员痛点的文章,这几年也断断续续的使用Go写一些工具来辅助开发或者服务器事务处理,一方面是在实践中学习Go,另一方面是体验一下Go的“妙处”,看看是不是真说的那么神。但从目前来看收效并不明显,或者说自己没有明显感觉到Go的魅力,归结原因还是对Go使用程度不够。

纸上得来终觉浅,绝知此事要躬行。所以我决定使用Go来造一个服务器框架的轮子。在此之前见过太多的服务器框架,凡是和“框架”两字沾边,必然有一些个人偏好或者选择倾向(从模块结构,代码组织,使用方式等几个角度),而且一般都是针对某种特定场景的框架,比如Http服务、游戏服务、微服务等等。

所以这个轮子也逃不出“凡是”:它会带有一些个人偏好,并且倾向于游戏服务,甚至因为个人经验水平有限会有一些不成熟的设计。不管怎么说,欢迎一起讨论学习。

目前来说初步的功能已经实现,包括一些基本的功能测试用例,后续除了未知BUG的修改,还会出一版完整的使用样例,扩容一下CS通信相关,以及接口易用性的调试修改。

Github地址:https://github.com/lanyutc/blue

简单介绍

框架所包含的内容分成核心辅助两大块,其中:

核心内容:
  • 网络通信
  • 名字发现服务
  • 基于名字发现的RPC
辅助内容:
  • 日志功能
  • 关键设置配置化
  • UID生成服务

内容列举的比较粗,后面我会陆续的写一些相关博文来对每块内容进行细节说明,每篇内容的核心无外乎三个点:一、它是干什么的;二、它是如何运作的;三、为什么要这么设计。

其实这是经典的What,How,Why三部曲。既然是轮子,What是清晰的,How是殊途同归的,Why涉及到思考的过程,所以我会把内容的重点往Why做倾斜,与How相辅相成。

总体思路

首先需要解释一点:我并不想弄一个大而全的东西,只提供必要的内容,如上文提到的核心内容。

这里其实有一些见仁见智,提供名字发现服务的主要原因是想将其与RPC组合起来,让调用者不用关心被调服务的IP,并且通过暴露出来的RPC调用方式组合成自己的策略。它的好处是:1、屏蔽了IP:Port对应的调用配置,减少出错几率;2、在加减服务或者服务异常的时候,做到自动发现、自动屏蔽。

我更喜欢把一个服务器看成对外对内两部分,对外理解成传统的CS通信,通俗点讲就是服务器与不可信的客户端之前通信;对内就是内部服务调用,即服务器与服务器之间的调用,用RPC实现(当然也可以用传统的CS思想来实现,但是现在一般不这么做了)。所以说RPC是必须的,与其相辅相成的名字发现服务也成了必须。

 

参考了以下成熟框架一些设计与思路:

https://github.com/TarsCloud/TarsGo

https://github.com/name5566/leaf

https://github.com/davyxu/cellnet

 

最后,框架的名字叫blue,没什么特别的寓意,个人偏好的首次体现:D

(全文结束)


转载文章请注明出处:漫漫路 - lanindex.com

Leave a Comment

Your email address will not be published.

鄂公网安备42018502003990号