go语言的优点不用赘述,那么基于go的微服务框架有吗?gokit就是一个go语言相关的微服务工具包。它自身称为toolkit,并不是framework。也就是gokit是将一系列的服务集合在一起,提供接口,从而让开发者自由组合搭建自己的微服务项目。基本上看完gokit的例子就可以动手模仿着写一个类似的小项目。gokit的结构分为:传输层、端点层、服务层。

clipboard.png

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等)
  • 路由跟踪
  • ...

这些组件大大方便了我们开发一个微服务应用。

 

 

 

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐