go-kit实践之0:gokit介绍——原理分析
go语言的优点不用赘述,那么基于go的微服务框架有吗?gokit就是一个go语言相关的微服务工具包。它自身称为toolkit,并不是framework。也就是gokit是将一系列的服务集合在一起,提供接口,从而让开发者自由组合搭建自己的微服务项目。基本上看完gokit的例子就可以动手模仿着写一个类似的小项目。gokit的结构分为:传输层、端点层、服务层。transport(传输层):当...
go语言的优点不用赘述,那么基于go的微服务框架有吗?gokit就是一个go语言相关的微服务工具包。它自身称为toolkit
,并不是framework
。也就是gokit是将一系列的服务集合在一起,提供接口,从而让开发者自由组合搭建自己的微服务项目。基本上看完gokit的例子就可以动手模仿着写一个类似的小项目。gokit的结构分为:传输层、端点层、服务层。
transport(传输层):
当你构建基于微服务的分布式系统时,服务通常使用HTTP或gRPC等具体传输或使用NATS等pub/sub系统相互通信。Go套件中的传输层绑定到具体运输。Go套件支持使用HTTP,gRPC,NATS,AMQP和Thrift提供服务的各种传输。由于Go kit服务仅专注于实现业务逻辑,并且不了解具体传输,因此你可以为同一服务提供多个传输。例如,可以使用HTTP和gRPC公开单个Go工具包服务。
决定用哪种方式提供服务请求,一般就是 http,rpc
endpoint(端点层):
端点是服务器和客户端的基本构建块。在Go kit中,主要消息传递模式是RPC。端点表示单个RPC方法。Go工具包服务中的每个服务方法都转换为端点,以便在服务器和客户端之间进行RPC样式通信。每个端点使用传输层通过使用HTTP或gRPC等具体传输将服务方法公开给外部世界。可以使用多个传输来公开单个端点。
是gokit最重要的一个层,是一个抽象的接收请求返回响应的函数类型。在这个定义的类型里面会去调用service层的方法,组装成response返回。而gokit中的所有中间件组件都是通过装饰者设计模式注入的。
//原型:
// Endpoint is the fundamental building block of servers and clients.
// It represents a single RPC method.
type Endpoint func(ctx context.Context, request interface{}) (response interface{}, err error)
//使用方法:
func(log Logger, in endpoint.Endpoint) endpoint.Endpoint {
return func(ctx context.Context, req interface{}) (interface{}, error) {
logger.Log("input", toJSON(req))
resp, err := in(ctx, req)
logger.Log("output", toJSON(resp), "err", err)
return resp, err
}
}
service(服务层):
业务逻辑在服务层中实现。Go kit服务被建模为接口。服务中的业务逻辑包含核心业务逻辑,它不应具有端点或HTTP或gRPC等具体传输的任何知识,或者请求和响应消息类型的编码和解码。这将鼓励你遵循基于Go套件的服务的干净架构。每种服务方法都通过使用适配器转换为端点,并使用具体传输进行公开。由于结构简洁,可以使用多个传输来公开单个Go工具包服务。
所有的具体方法写在这里,可以理解为单体web框架中的控制器部分。
Go套件中的中间件
Go kit通过强制分离关注点来鼓励良好的设计原则。使用中间件实现服务和端点的交叉组件。Go kit中的中间件是一种强大的机制,可以包装服务和端点以添加功能(交叉组件),例如日志记录,断路器,速率限制,负载平衡或分布式跟踪。
这是一张来自Go kit网站的图片,该图片描绘了一个带有中间件的典型Go套件设计层的洋葱。
工具包
这三个层组成一个gokit微服务应用。此外,作为一个工具包,gokit为此提供了很多微服务工具组件。
- 认证组件(basic, jwt)
- 回路熔断器
- 日志组件
- 普罗米修斯监控系统
- 限流器
- 服务发现系统接口(etcd, consul等)
- 路由跟踪
- ...
这些组件大大方便了我们开发一个微服务应用。
更多推荐
所有评论(0)