一 Gokit 是什么
Gokit 是用来构建微服务的一系列库,如果想在项目中引入微服务模式可以使用 Gokit,同时 Gokit 已经是生产标准。Gokit 与 Micro 相同的地方是都是微服务工具包,不过 Micro 同时是一个微服务生态系统。Micro 的目标是构建一个平台,而 Gokit 的目标是用来整合客户的平台。
二 Gokit 架构与设计
1. 核心概念
Gokit 服务分为三层:
传输层
端点层
服务层
请求在第一层(传输层)进入服务,向下流到第三层,响应采用相反的过程。
2. 传输层
传输域绑定到 HTTP 或 gRPC 等具体传输。同一个微服务同时支持多种传输是非常有用的,你可以在一个微服务中支持旧的 HTTP API 和新的 gRPC 服务。
3. 端点层
端点就像 controller 上的动作或处理程序,如果实现了两种传输层(HTTP 和 gRPC),你可以使用两种方法将请求发送到同一个端点。
4. 服务层
服务是所有业务逻辑的实现,一个服务通常将多个端点粘合在一起。在 Gokit 中服务通常使用接口建立模型,接口的实现包含业务逻辑。使用 Gokit 构建的服务应该努力遵守 CleanArchitecture 架构或 Hexagonal 架构。也就是说业务逻辑不该了解端点或传输域相关概念:服务不应该知道有关 HTTP 头或 gRPC 错误代码的任何信息。
5. 中间件
Gokit 试图使用中间件模式或装饰器模式来强制分离关注点,中间件可以包装端点或服务以添加功能,例如日志记录、速率限制、负责均衡或分布式跟踪。在端点或服务周边连接多个中间件是非常常见的。
6. GoKit 微服务是如何建模的
将所有这些概念放在一起,可以发现 Gokit 微服务模型类似洋葱,有很多层。这些层可以分为三个域,最内层的服务域是一切基于特定服务的定义以及所有业务逻辑的实现;中间的端点域是将服务的每个方法抽象为通用端点的地方;最外层的传输域是端点绑定到 HTTP 或 gRPC 等具体传输的地方。通过为服务定义接口并提供具体实现来实现核心业务逻辑,然后编写服务中间件以提供其他功能,例如日志记录、分析、检测 - 任何需要了解业务领域的内容。Gokit 提供端点和传输域中间件,用于速率限制、断路、负载均衡和分布式追踪等功能 - 所有这些通常都与业务无关。简而言之,Gokit 试图通过合理使用中间件模式来强制分离关注点。
7. 依赖注入
Gokit 鼓励用户将服务设计为多个交互组件,包括多个单用途中间件。经验告诉我们,在微服务中定义和连接组件图的最易理解、可维护和富有表现力的方法是在 main 方法中显示和声明性组合。
控制反转是其他框架的共同特征,通过依赖注入或服务定位模式实现。但是在 Gokit 中,应该在 main 函数中连接整个组件图。这中方式强化了两个优点:通过严格保持组件生命周期在 main 函数中,可以避免使用全局变量,这对测试非常重要;如果组件的作用域为 main,那么将他们作为依赖项提供给其他组件的唯一方法是将他们作为参数显示传递给其构造函数,这样可以明确依赖关系。
8. 更多细节
Gokit 支持传输协议有哪些?
HTTP、gRPC、Thrift、net/rpc,使用其他协议也非常简单。