什么是微服务(microservice)?这是企业界正在向计算界提出的问题。一个产品的可持续性取决于它的可修改程度。
大型产品如果不能正常维护,就需要在某个时间点停机维护。而微服务架构用细化的服务取代了传统的单体服务,这些服务定义了明确的 RPC 或消息驱动的 API 边界。
微服务架构有别于更为传统的单体式方案,可将应用拆分成多个核心功能。每个功能都被称为一项服务,可以单独构建和部署,这意味着各项服务在工作(和出现故障)时不会相互影响。
微服务带来了以下好处:
在谈论微服务时,编排和服务发现是微服务中非常重要的部分。像 Kubernetes 这样的工具可以用来编排和协调 Docker 容器。一般来说,微服务的最佳实践就是每个微服务有一个 Docker 容器。
服务发现是对微服务实例的 IP 地址的自动检测。这种方式消除了硬编码 IP 地址的潜在威胁,硬编码会导致服务之间缺乏联系。
下图描绘了单体架构和微服务架构的结构图。
图的左边就是单体架构的示意图,如图所示:单体架构将所有的功能(如 UI、日志、数据层、系统逻辑、数据库等)都集成在一个系统中,像是一个紧耦合的架构。
相反,微服务是独立的实体,每个功能都是单独的服务,如日志服务、文件服务、系统逻辑服务等,更易于修改和替换,每个服务都可以通过各种远程传输机制进行沟通,如 HTTP、REST 或者 RPC。服务之间的交换的数据格式可以是 JSON 或者 Protocol buffers, 微服务还可以处理各种请求点,如 UI 和 API 客户端。
微服务可以被任何语言实现(Java、Go、Python、 Rust、 NodeJS 等),因为其有着松耦合的性质,每个独立的服务还可以今后被任何其他新技术或业务所需要的技术所替换。
Java 社区中有着非常著名的框架用于构建微服务系统。如:
以上都是非常有名的微服务框架,在 Go 语言中,也有很多著名的框架(go-kit、go-kratos、go-zero 等), Go Micro 也是其中之一,截止发文 Github Star 数量达到了 19.6k。
Go Micro 是一个基于 RPC 的可插拔库,它提供了在 Go 中编写微服务的基本构建块。它使用 consul 实现服务发现,但可以换成 etcd、zookeeper 或任何能够满足该接口的其他实现。通过 http 或使用 proto-rpc 或 json-rpc 进行通信,
Go Micro 解决了构建可扩展系统的关键要求。它采用微服务架构模式并将其转换为一组充当平台构建块的工具。Micro 处理分布式系统的复杂性,并提供开发人员已经理解的简单抽象。
Go Micro 提供了 RPC 实现和事件驱动架构(EDAs),可以向其添加任何外部功能。如果你想换掉底层技术,代码重写率为零。
Go Micro 的主要特点有:
使用下面的命令安装最新的 go-micro v4.9
go install go-micro.dev/v4@latest
本文在 Windows 11 安装成功如下:
使用 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,并展示该框架的安装和使用,下一篇文章将介绍如何利用这一框架进行微服务应用的开发