写在前面
micro/go-micro 是一个微服务开发框架
,github 地址: https://github.com/micro/go-micro
micro/go-micro 非常合理的抽象提炼了微服务开发中必涉及到的八大模块,以及能使这些模块可插拔,制定化
micro/go-micro 具有不少经典的框架开发时涉及的编码范例,是不可多得的 golang 编程代码参考与学习资料
同时,micro/go-micro 几大模块的默认实现,均停留在范例阶段,生产环境中需谨慎
因此,可以在熟练掌握 micro/go-micro 源码的基础上,开发适合自己项目的某些模块插件
则可以使自己开发框架的品质:
- 兼具良好的代码架构
- 品质得到很好提升
micro/go-micro 代码架构
1. 代码架构
代码架构如下(摘自官方Readme.md)
上图按层次罗列了 micro/go-micro 的八大模块,以及这些模块间的关系
说明如下:
模块 | 说明 | 默认实现 |
---|---|---|
Service | 表示一个微服务,包括了 Client 、 Server 对象,提供了统一、简明的使用面板 | 不可插拔 |
Client | 表示一个与其他微服务通信的客户端对象,可插拔 | rpc |
Server | 表示一个微服务的服务器端对象,可插拔 | rpc |
Broker | 用于消息发布/订阅,Server 、 Client 均持有其对象,可插拔 | http |
Codec | 用于定义消息的序列化、反序列化,可插拔 | protobuf |
Registry | 服务发现模块,可插拔 | mdns |
Selector | 负载均衡模块,可插拔 | registry |
Transport | 底层网络通信模块,可插拔 | http |
2. micro/go-micro 微服务
上图右侧,12 行代码示例,编译成 1 程序, 则该程序已经具备:
- 以
helloworld
作为该微服务的名称,被其他微服务所识别 - 能与其他微服务交互
- 只需要填写自己的业务逻辑,即可提供服务
micro/go-micro 已经帮你做了诸如:
- 服务发现
- 自动注册接入服务器组内
- 服务器组内互链、通信(同步消息、发布/订阅)
- 消息序列化、反序列化
- 负载均衡
micro/go-micro 使用例子
官方 github 库: https://github.com/micro/examples 中,包括了所有 go-micro 用法
这里简单摘录一个服务器/客户端代码,给读者有个感性的认识:
1. server 例子
摘自: https://github.com/micro/examples/blob/master/greeter/srv/main.go
// 处理 Hello 消息
type Say struct{}
func (s *Say) Hello(ctx context.Context, req *hello.Request, rsp *hello.Response) error {
log.Print("Received Say.Hello request")
rsp.Msg = "Hello " + req.Name
return nil
}
func main() {
service := micro.NewService(
micro.Name("go.micro.srv.greeter"), // go.micro.srv.greeter 是该微服务的名称
micro.RegisterTTL(time.Second*30), // 服务发现的一些参数设置,可无视
micro.RegisterInterval(time.Second*10), // 服务发现的一些参数设置,可无视
)
// optionally setup command line usage
service.Init() // 解析命令行,安装插件
// Register Handlers
hello.RegisterSayHandler(service.Server(), new(Say)) // 注册 `处理 Hello 消息`
// Run server
if err := service.Run(); err != nil { // 开始提供服务
log.Fatal(err)
}
}
2. client 例子
摘自: https://github.com/micro/examples/blob/master/greeter/cli/main.go
func main() {
// create a new service
service := micro.NewService() // 作为匿名微服务启动
// parse command line flags
service.Init() // 解析命令行参数,并安装插件
// Use the generated client stub
cl := hello.NewSayService("go.micro.srv.greeter", service.Client()) // 创建访问 go.micro.srv.greeter 微服务的客户端对象
// Make request
rsp, err := cl.Hello(context.Background(), &hello.Request{ // 发起请求处理,同步等待
Name: "John",
})
if err != nil {
fmt.Println(err)
return
}
fmt.Println(rsp.Msg) // 打印结果
}
micro/go-micro 与终端交互
前面介绍的所有内容,均停留在服务器组内,微服务间的通信、交互
终端(如游戏客户端)需要能识别 micro/go-micro 内部协议(Codec 插件内容)才能达成与 micro/go-micro 微服务交互
micro/go-micro 的策略以下 2 种方案之一:
-
使用默认的 micro 工具集,前置 micro api/proxy/web 代理服务器,对外提供 HTTP 服务
+---------------+ +-----------------------+ +-----------------+ | client/http | <-------> | micro api/proxy/web | <-------> | micro service | +---------------+ +-----------------------+ +-----------------+
-
使用 grpc-gateway ,将基于 go-grpc 的 micro service, 前置 grpc-gateway 代理服务器,对外提供 HTTP 服务
+---------------+ +-----------------------+ +------------------------------+ | client/http | <-------> | grpc-gateway | <-------> | micro service (use go-grpc) | +---------------+ +-----------------------+ +------------------------------+
针对游戏客户端,还可以以下其他方法:
- 提供自己的 Codec 插件,并让终端对接协议
- 编写自己的 gateway 服务,以便提供诸如 grpc 代理、tcp 长连接保持等等,各种应用需求
官方相关的文档:
- https://micro.mu/docs/cn/go-api.html
- https://github.com/micro/examples/tree/master/api
- https://github.com/micro/examples/tree/master/grpc/gateway
micro/go-micro 插件
官方 github 地址: https://github.com/micro/go-plugins
这个 github 库有很多第 3 方给 go-micro 实现的七大模块可替换插件
更详细的内容,后续专门一章介绍之
包括:
- 插件可插拔原理
- 目前已有插件介绍
其他说明
本文粗略介绍了下 micro/go-micro ,后续章节开始做源码分析,待续