micro/go-micro 介绍与源代码分析(一)

写在前面

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

p1

上图按层次罗列了 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 程序, 则该程序已经具备:

扫描二维码关注公众号,回复: 8631901 查看本文章
  • 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 长连接保持等等,各种应用需求

官方相关的文档:

micro/go-micro 插件

官方 github 地址: https://github.com/micro/go-plugins

这个 github 库有很多第 3 方给 go-micro 实现的七大模块可替换插件

更详细的内容,后续专门一章介绍之

包括:

  • 插件可插拔原理
  • 目前已有插件介绍

其他说明

本文粗略介绍了下 micro/go-micro ,后续章节开始做源码分析,待续

发布了129 篇原创文章 · 获赞 73 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/u013272009/article/details/93315904