【go-kit教程】go-kit初识
# go-kit简介
go-kit 本身不是一个框架,而是一套微服务工具集,是框架的底层,可以用go-kit 做适应自己平台的框架。它的设计目标是帮助开发者构建健壮、可维护、可测试的分布式系统。go-kit 的核心理念是通过可组合的组件来实现微服务的功能,这些组件包括服务发现、负载均衡、请求追踪、日志记录、监控等等。go-kit还提供了一种基于中间件的设计模式,使开发人员能够构建可插拔的组件,从而更容易地构建和维护可扩展的分布式应用程序。
go-kit 的设计目标是简单、灵活、可扩展。它提供了一些基本的组件,如服务端点(endpoint)、传输层(transport)、服务发现、负载均衡等,这些组件可以通过接口进行组合,并且可以根据实际需求进行扩展和定制。
go-kit采用了微服务架构的理念,将应用程序分解为一组小型服务,每个服务都具有单独的职责。每个服务都是独立的,可以独立部署、升级和扩展。通过这种方式,go-kit可以帮助开发人员更容易地构建可扩展的应用程序。
github仓库:https://github.com/go-kit/kit
官网店址:https://gokit.io/
# go-kit架构设计
由于其灵活的设计, 通过使用 go-kit,开发者可以快速地构建出符合分布式系统要求的微服务应用,同时也能够方便地对已有的应用进行升级和维护。
go-kit 采用三层架构方式,自上而下分别为:Transport、Endpoint、Service。
日后开发应严格遵守此规范
Transport
层主要负责与传输协议HTTP,GRPC,THRIFT等相关的逻辑;Endpoint
层主要负责request/response格式的转换,以及公用拦截器相关的逻辑;Endpoint 是 go-kit 中最重要的组件之一,它用于封装服务操作的输入和输出。通过 Endpoint,开发者可以将一个服务拆分成多个小的可复用的操作,这些操作可以独立地进行测试、扩展和部署。Service
层则专注于业务逻辑,就是我们的业务类、接口等相关信息存放。Service 是业务逻辑的实现,它是 Endpoint 的实现者。Service 负责处理具体的业务逻辑,通过 Endpoint 将其暴露出去供其他服务进行调用。
+-----------+ Request -->| Transport |--> Endpoint --> Service +-----------+ ^ | Response <------+ // 求从 Transport 组件进入,然后被传递到 Endpoint 组件。Endpoint 组件封装了服务操作的输入和输出,通过调用 Service 组件来处理具体的业务逻辑,并将结果返回给 Endpoint 组件。最后,Endpoint 组件将结果返回给 Transport 组件,由 Transport 组件发送回客户端。
1
2
3
4
5
6
7
8这种架构设计的好处是,Transport 组件和 Service 组件可以独立地开发和部署,而 Endpoint 组件则充当了它们之间的桥梁,负责将请求和响应进行转换和协调。同时,Endpoint 组件的封装性使得它可以在不同的 Transport 组件之间进行转换,从而使得服务的调用方更加灵活。
# go-kit构建微服务步骤
- 定义业务逻辑和数据模型:定义服务接口和数据模型,包括请求和响应数据结构。
- 实现服务:根据定义的接口和数据模型实现服务,包括服务接口和业务逻辑实现。
- 创建 endpoint:创建 endpoint 对象,将业务逻辑封装成 endpoint。
- 创建 transport:创建 transport 对象,处理网络传输,包括编码、解码和传输数据。
- 创建服务实例:创建服务实例,将 endpoint 和 transport 组装起来,创建服务实例。
- 创建中间件:创建中间件对象,实现一些通用的逻辑,例如认证、授权、限流、熔断、追踪、日志等。
- 组装中间件和服务实例:将中间件对象和服务实例组装起来,形成一个完整的服务实例。
# go-kit和go-micro的区别
- 设计思想不同:go-kit 的设计思想主要是基于 Go 语言的原生语言和库,它的组件和工具更加灵活和可扩展;而 go-micro 的设计思想主要是基于插件式架构。
- 组件数量不同:go-kit 的组件数量相对较少,主要包括 Endpoint、Transport、Service、Middleware、Circuit Breaker、Service Discovery 和 Load Balancer 等;而 go-micro 的组件数量较多,主要包括服务注册中心、负载均衡、消息队列、反向代理、数据存储、服务监控等。
- 接入方式不同:go-kit 的接入方式主要是手工编写代码,开发者需要手动实现 Endpoint、Transport、Service 等组件;而 go-micro 的接入方式主要是使用插件,开发者只需要选择需要的插件即可完成微服务的开发和部署。
- 性能表现不同:由于 go-kit 的设计思想更加注重灵活性和可扩展性,因此它在性能方面可能会更好;而 go-micro 的设计思想更加注重易用性和部署性,因此它在开发效率方面可能会更好。