Go 微服务之 Go kit 介绍 - Go语言中文社区

Go 微服务之 Go kit 介绍


转自:我们go   发布时间:18-11-2509:44   

在这篇文章中,我将介绍Go kit,这是一个用于在Go中构建微服务的工具包。

Go逐渐成为构建现代分布式系统的首选语言。构建云原分布式系统时,你可能需要对各种功能专门支持,例如支持不同的传输和消息编码格式,RPC安全,日志记录,跟踪,指标和仪器,断路,速率限制,基础架构集成甚至指导在架构上。 Go因其简单性和“无魔法”方法而非常受欢迎,因此用于分布式编程的Go软件包集合(如标准库包)将比使用具有大量魔力和底层技术意见的完整框架更合适。就个人而言,我不喜欢使用带有很多意见的完整框架,但我更喜欢那些带有较少意见和更多开发人员自由的库。 Go kit通过提供用于构建微服务的分布式编程工具包来填补Go生态系统中的这一空白,这也鼓励你为分布式系统中的各个服务采用良好的设计原则。

Go kit简介

Go kit(gokit.io)是Go软件包的集合,可帮助你构建强大,可靠,可维护的微服务。Go套件提供了用于实现系统可观察性和弹性模式的组件的库,例如日志记录,度量,跟踪,速率限制和电路中断,这些是在生产中运行微服务的基本要求。关于Go套件的好处在于它是一种轻松的观点,旨在实现与不同基础架构,消息编码格式和传输层一起使用的互操作性。

除了用于构建微服务的工具包之外,它还鼓励在服务中为你的应用程序架构提供良好的设计原则。Go套件可以帮助你接受由Alistair Cockburn提出的SOLID设计原则,域驱动设计(DDD)和“六边形架构”,或者Jeffrey Palermo所谓的“洋葱架构”和来自罗伯特C.马丁的“干净架构”之类的架构方法。虽然Go套件被设计为微服务工具包,但它也非常适合构建优雅的整体结构。

Go kit 架构

基于Go套件的应用程序架构有三个主要组件:

传输层端点层服务层传输层:

当你构建基于微服务的分布式系统时,服务通常使用HTTP或gRPC等具体传输或使用NATS等pub/sub系统相互通信。Go套件中的传输层绑定到具体运输。Go套件支持使用HTTP,gRPC,NATS,AMQP和Thrift提供服务的各种传输。由于Go kit服务仅专注于实现业务逻辑,并且不了解具体传输,因此你可以为同一服务提供多个传输。例如,可以使用HTTP和gRPC公开单个Go工具包服务。

端点层:

端点是服务器和客户端的基本构建块。在Go kit中,主要消息传递模式是RPC。端点表示单个RPC方法。Go工具包服务中的每个服务方法都转换为端点,以便在服务器和客户端之间进行RPC样式通信。每个端点使用传输层通过使用HTTP或gRPC等具体传输将服务方法公开给外部世界。可以使用多个传输来公开单个端点。

服务层:

业务逻辑在服务层中实现。Go kit服务被建模为接口。服务中的业务逻辑包含核心业务逻辑,它不应具有端点或HTTP或gRPC等具体传输的任何知识,或者请求和响应消息类型的编码和解码。这将鼓励你遵循基于Go套件的服务的干净架构。每种服务方法都通过使用适配器转换为端点,并使用具体传输进行公开。由于结构简洁,可以使用多个传输来公开单个Go工具包服务。

Go套件简介以及示例

让我们通过一个示例程序深入了解Go工具包的基础知识。

服务层中业务逻辑

业务逻辑在作为接口建模的服务中实现。在这里,我们在电子商务域订购聚合上模拟我们的服务:

清单1.订单服务接口

Order服务接口使用域实体Order:

清单2.订单域实体

这是服务接口的实现:

清单3. Order服务接口的业务逻辑实现

RPC端点的请求和响应

服务方法公开为RPC端点。因此,我们需要定义用于通过RPC端点发送和接收消息的消息类型。让我们为订单服务上的RPC端点定义请求和响应类型的结构:

清单4. RPC端点的Request和Response的消息类型

将服务方法的工具包端点作为RPC端点

我们的核心业务逻辑驻留在服务中,这些服务将使用称为端点的Go工具包抽象作为RPC端点公开。

这是Go套件中的端点类型:

清单5. Go kit中的endpoint.Endpoint类型

如前所述,端点表示单个RPC方法。每个服务方法都使用适配器转换为端点(类型endpoint.Endpoint)。让我们在订单服务方法上制作Go套件端点:

清单6.将服务方法转换为endpoint.Endpoint的适配器

端点适配器将服务接口作为参数,然后转换为Go kit抽象endpoint.Endpoint,使其作为端点的单独服务方法。这些适配器函数使类型断言成为适当的请求类型,然后调用服务方法并返回响应消息。

使用HTTP传输公开服务

我们已经创建了我们的服务,然后我们创建了端点以将服务方法公开为RPC端点。现在我们需要将我们的服务暴露给外部世界,以便其他服务可以对其进行RPC调用。为了揭露我们的服务,我们需要一个具体的运输服务。Go套件支持各种传输,如HTTP,gRPC,NATS,AMQP和Thrift,开箱即用。

仅为了示例,我们使用HTTP传输来提供服务。Go套件包go-kit/kit/transport/http为使用HTTP传输提供服务提供支持。transport/http包的NewServer函数构造一个新服务器,它实现http.Handler并包装提供的端点。

以下是将Go kit端点连接到HTTP传输以通过HTTP传输服务的代码块:

清单7. Wires将套件端点转换为HTTP传输

我们通过调用 transport/http包的函数NewServer来创建http.Handler值,我们为其提供端点和函数值,用于解码请求(DecodeRequestFunc func类型的值)和编码响应值(EncodeResponseFunc函数类型的值)。

以下是Go工具包中DecodeRequestFunc和EncodeResponseFunc函数类型的定义:

清单8. DecodeRequestFunc和EncodeResponseFunc函数类型

运行HTTP服务器

最后我们运行HTTP服务器。清单9的NewService函数给出了一个http.Handler实例,它用于运行我们的HTTP服务器。

清单9.运行HTTP服务器

现在我们的服务使用HTTP传输运行。可以使用其他传输来公开相同的服务。例如,可以使用gRPC或Apache Thrift公开相同的服务。

作为介绍性文章,我们只使用了Go工具包提供的基本原语,但它为系统可观察性,弹性模式,服务发现和负载平衡等提供了许多功能。我们将在后面的帖子中讨论Go工具包的更多内容。

Go套件中的中间件

Go kit通过强制分离关注点来鼓励良好的设计原则。使用中间件实现服务和端点的交叉组件。Go kit中的中间件是一种强大的机制,可以包装服务和端点以添加功能(交叉组件),例如日志记录,断路器,速率限制,负载平衡或分布式跟踪。

这是一张来自Go kit网站的图片,该图片描绘了一个带有中间件的典型Go套件设计层的洋葱。

小心Spring Boot 微服务综合症

与Go kit一样,Spring Boot是一个用于在Java生态系统中构建微服务的工具包。但是,与Go套件不同,Spring Boot更像是一个完整的框架。尽管许多Java开发人员正在积极地使用Spring Boot框架在Java堆栈中构建微服务,但他们中的一些人认为微服务只是使用Spring Boot框架。我看到很多开发团队误解微服务只是用Spring Boot和使用Netflix OSS构建服务,而不是将微服务视为分布式系统模式。

所以请记住,使用像Go工具包或框架这样的工具包只是将你的开发引导到微服务。尽管微服务解决了扩展团队和系统的许多挑战,但由于基于微服务的系统中的数据分散在各种数据库中,因此它会产生新的问题,这有时会给业务事务和查询数据带来很多挑战。这完全取决于问题域和系统的上下文。好的一点是,虽然Go套件被设计为用于构建微服务的工具包,但你也可以使用此工具包来构建优雅的整体结构,从而为你的系统实施良好的架构设计。

Go套件的一些功能,如断路器和速率限制,可通过Istio等服务网平台获得。因此,如果你使用像Istio这样的服务网格来运行你的微服务,你可能不需要使用Go工具包中的那些东西,但是所有人将不会使用服务网格来进行服务到服务通信的带宽,因为它添加了另一层复杂。

版权声明:本文来源简书,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://www.jianshu.com/p/02de471cb1cc
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-01-07 22:11:49
  • 阅读 ( 1944 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢