Go 微服务实战之如何使用 go-micro 写微服务应用

什么是微服务?

什么是微服务(microservice)?这是企业界正在向计算界提出的问题。一个产品的可持续性取决于它的可修改程度。

大型产品如果不能正常维护,就需要在某个时间点停机维护。而微服务架构用细化的服务取代了传统的单体服务,这些服务定义了明确的 RPC 或消息驱动的 API 边界。

微服务架构有别于更为传统的单体式方案,可将应用拆分成多个核心功能。每个功能都被称为一项服务,可以单独构建和部署,这意味着各项服务在工作(和出现故障)时不会相互影响。

微服务带来了以下好处:

  • 每个服务都可以由专注于此服务的团队独立开发。小团队可以通过在一组小的功能上工作来进行并行迭代。
  • 开发人员可以自由选择开发技术,对新的开发人员来说,可扩展性很强。
  • 微服务架构可以使每个微服务独立部署。对系统的单个组件支持持续集成(CI)和持续交付(CD)。
  • 微服务架构使得每个服务都可独立扩展。利用松耦合的架构提供更轻松的软件替换。
  • 微服务架构不与特定的技术相联系。

在谈论微服务时,编排和服务发现是微服务中非常重要的部分。像 Kubernetes 这样的工具可以用来编排和协调 Docker 容器。一般来说,微服务的最佳实践就是每个微服务有一个 Docker 容器。

服务发现是对微服务实例的 IP 地址的自动检测。这种方式消除了硬编码 IP 地址的潜在威胁,硬编码会导致服务之间缺乏联系。

Go 微服务实战之如何使用 go-micro 写微服务应用_第1张图片

单体架构与微服务架构的区别

下图描绘了单体架构和微服务架构的结构图。

图的左边就是单体架构的示意图,如图所示:单体架构将所有的功能(如 UI、日志、数据层、系统逻辑、数据库等)都集成在一个系统中,像是一个紧耦合的架构。

相反,微服务是独立的实体,每个功能都是单独的服务,如日志服务、文件服务、系统逻辑服务等,更易于修改和替换,每个服务都可以通过各种远程传输机制进行沟通,如 HTTP、REST 或者 RPC。服务之间的交换的数据格式可以是 JSON 或者 Protocol buffers, 微服务还可以处理各种请求点,如 UI 和 API 客户端。

Go 微服务实战之如何使用 go-micro 写微服务应用_第2张图片

微服务可以被任何语言实现(Java、Go、Python、 Rust、 NodeJS 等),因为其有着松耦合的性质,每个独立的服务还可以今后被任何其他新技术或业务所需要的技术所替换。

关于微服务的相关知识就简单介绍到这,感兴趣的同学可以看看文末的推荐阅读部分,都是非常好的微服务学习资料。

Go Micro 介绍

优秀微服务框架一览

Java 社区中有着非常著名的框架用于构建微服务系统。如:

  • Spring: Spring Boot 是用于编写微服务的流行 Java 框架。
  • Spring Cloud:基于 Spring Boot,为微服务体系开发中的架构问题,提供了一整套的解决方案——服务注册与发现,服务消费,服务保护与熔断,网关,分布式调用追踪,分布式配置管理等。
  • Dropwizard:一个开源的 RESTful 快速开发框架,对微服务的开发也极其友好,而且性能很强
  • Micronaut:是一个现代的、基于 JVM 的全栈微服务框架,旨在构建模块化、易于测试的微服务应用程序
  • Apache Dubbo:由阿里巴巴开源的分布式服务化治理框架,是一款微服务框架,为大规模微服务实践提供高性能 RPC 通信、流量治理、可观测性等解决方案,涵盖 Java、Golang 等多种语言 SDK 实现。

以上都是非常有名的微服务框架,在 Go 语言中,也有很多著名的框架(go-kitgo-kratosgo-zero 等), Go Micro 也是其中之一,截止发文 Github Star 数量达到了 19.6k。

Go 微服务实战之如何使用 go-micro 写微服务应用_第3张图片

Go Micro 是一个基于 RPC 的可插拔库,它提供了在 Go 中编写微服务的基本构建块。它使用 consul 实现服务发现,但可以换成 etcd、zookeeper 或任何能够满足该接口的其他实现。通过 http 或使用 proto-rpc 或 json-rpc 进行通信,

Go Micro 解决了构建可扩展系统的关键要求。它采用微服务架构模式并将其转换为一组充当平台构建块的工具。Micro 处理分布式系统的复杂性,并提供开发人员已经理解的简单抽象。

Go Micro 提供了 RPC 实现和事件驱动架构(EDAs),可以向其添加任何外部功能。如果你想换掉底层技术,代码重写率为零。

Go Micro 特点

Go Micro 的主要特点有:

  • RPC Client/Server:基于 RPC 的请求/响应,支持双向流。为同步通信提供了一个抽象层,向一个服务提出的请求将被自动处理、负载均衡、拨号和流化。
  • 服务发现: 自动服务注册和名称解析。服务发现是微服务开发的核心。当服务 A 需要与服务 B 对话时,它需要该服务的位置。默认的发现机制(zeroconf 系统)是多播 DNS(mdns)机制。
  • 负载均衡:客户端负载均衡建立在服务发现的基础上。一旦我们有了一个服务的任何数量的实例的地址,我们现在需要一种方法来决定哪个节点的路由。我们使用随机散列的负载均衡来提供跨服务的均匀分布,并在出现问题时重试一个不同的节点。
  • 信息编码:基于内容类型的动态信息编码。客户端和服务器将与内容类型一起使用编解码器,为你无缝编码和解码 Go 类型。任何种类的消息都可以被编码并从不同的客户端发送。客户端和服务器默认会处理这个问题。这包括默认的 protobuf 和 json 格式。
  • 信息同步:发布/订阅(PubSub) 是作为异步通信和事件驱动架构的第一类公民而建立的。事件通知是微服务开发的一个核心模式。默认的消息传递系统是一个 HTTP 事件消息代理。
  • 事件流: PubSub 对于异步通知来说是很好的,但对于更高级的用例,事件流是首选。提供持久性存储,从网络中的 offset(片偏移量) 和 acking(确认字符) 中进行消费。 Go Micro 包括对NATS Jetstream和 Redis 流的支持。
  • 同步化:分布式系统通常以最终一致的方式构建。对分布式锁和领导节点的支持是作为 Sync 接口建立的。当使用最终一致的数据库或调度时,使用 Sync 接口。
  • 可插拔接口:Go Micro 对每个分布式系统的抽象都使用了 Go 接口。正因为如此,这些接口是可插拔的,使 Go Micro 与运行时间无关。您可以在底层使用任何可用技术。 例如用于翻译的编解码器,用于存储系统的 brokers。

接下来,让我们动手写一个服务。

服务接口

顶层的服务接口是构建服务的主要组件。它把 Go Micro 的所有底层包都包装成一个方便的接口。

type Service interface {
    Init(...Option)
    Options() Options
    Client() client.Client
    Server() server.Server
    Run() error
    String() string
}

go-micro 安装

使用下面的命令安装最新的 go-micro v4.9

go install go-micro.dev/v4@latest

本文在 Windows 11 安装成功如下:

Go 微服务实战之如何使用 go-micro 写微服务应用_第4张图片

使用 micro.NewService 创建一个新服务:

package main

import (
    "go-micro.dev/v4"
)

// 创建新服务
service := micro.NewService(
    micro.Name("HelloWorld")
)

// 初始化 flags
service.Init()

// 启动服务
service.Run()

其他选项可以在创建时传入:

service := micro.NewService(
    micro.Name("greeter"),
    micro.Version("latest"),
)

Options 全部参数如下图:

Go 微服务实战之如何使用 go-micro 写微服务应用_第5张图片

总结

本文介绍了微服务及其相关概念,重点比较了单体架构和微服务架构的区别,最后介绍了 Go 优秀的微服务框架之一的 Go-micro,并展示该框架的安装和使用,下一篇文章将介绍如何利用这一框架进行微服务应用的开发。敬请期待~

希望本文能对你有所帮助,如果喜欢本文,可以点个赞或关注。

这里是宇宙之一粟,下一篇文章见!

宇宙古今无有穷期,一生不过须臾,当思奋争。

推荐阅读:

本文参与了思否技术征文,欢迎正在阅读的你也加入。

你可能感兴趣的:(Go 微服务实战之如何使用 go-micro 写微服务应用)