Go Micro 创建 RPC

Go Micro 是一个插件化的 RPC 开发框架,用于使用 Go 语言快速构建微服务。

 

1. 创建 RPC 服务

使用 Go Micro 的 micro 工具创建 RPC 服务,例如创建 hello 服务。

micro new hello

micro 生成了 hello 项目,目录结构如下:

.
├── main.go
├── generate.go
├── plugin.go
├── handler
│   └── hello.go
├── subscriber
│   └── hello.go
├── proto/hello
│   └── hello.proto
├── Dockerfile
├── Makefile
└── README.md	

生成文件说明:

  • main.go: 主程序文件。
  • handler: 服务处理目录,里面包含所有的 RPC 服务的业务逻辑。
  • proto: proto 文件定义。里面包含使用 proto 语言定义的 RPC 服务描述。
  • Makefile: make 编译、创建、测试、打包等脚本。
  • Dockerfile: 将编译好的 RPC 服务打包为 Docker 的脚本。

 

2. 使用 Go Mod 管理依赖

设置新创建的 hello 项目使用 Go Mod 管理依赖包。

# 进入项目目录
$ cd hello

#运行 go mod 初始化命令
$ go mod init hello

 

3. 修改 proto 文件

进入项目的 proto 目录,里面有一个自动生成的 hello.proto 文件,编辑文件在 package 下增加 go package 路径:

syntax = "proto3";
package go.micro.srv.hello;

option go_package="proto/hello";

service Hello {
......

 

4. 编译 proto 文件

通过 make 编译 proto 文件:

make proto

编译后会在 proto/hello 目录中生成两个文件:hello.pb.go 和 hello.pb.micro.go。

 

5. main.go 说明

以下为 Go Micro 自动创建的 main.go 文件。

package main

import (
		"github.com/micro/go-micro/util/log"
		"github.com/micro/go-micro"
		"hello/handler"
		"hello/subscriber"

		hello "hello/proto/hello"
)
func main() {
	// New Service
	// 创建一个新的服务,服务名为 go.micro.srv.hello
	service := micro.NewService(
			micro.Name("go.micro.srv.hello"),
			micro.Version("latest"),
	)

	// Initialise service
	// 通过命令行参数或者插件初始化服务
	service.Init()

	// Register Handler
	// 注册业务处理组件 handler.Hello
	hello.RegisterHelloHandler(service.Server(), new(handler.Hello))

	// Register Struct as Subscriber
	// 暂且忽略,可直接去掉
	//micro.RegisterSubscriber("go.micro.srv.hello", service.Server(), new(subscriber.Hello))

	// Register Function as Subscriber
	// 暂且忽略,可直接去掉
	micro.RegisterSubscriber("go.micro.srv.hello", service.Server(), subscriber.Handler)

	// Run service
	// 运行服务
	if err := service.Run(); err != nil {
			log.Fatal(err)
	}
}

 

6. 编译运行 hello 服务

通过 make 编译项目:

make build

编译后会在 hello 目录中生成可执行文件:hello-srv。

运行 hello-srv。

./hello-srv

hello 服务开始运行,并监听端口,提供服务:

2022-01-13 03:12:28.936707 I | Transport [http] Listening on [::]:38279
2022-01-13 03:12:28.938917 I | Broker [http] Connected to [::]:35811
2022-01-13 03:12:28.945683 I | Registry [mdns] Registering node: go.micro.srv.hello-92b16f46-66bd-4b51-91c5-5da327b756f6
2022-01-13 03:12:28.977517 I | Subscribing go.micro.srv.hello-92b16f46-66bd-4b51-91c5-5da327b756f6 to topic: go.micro.srv.hello		

Go Micro 是一个插件化的 RPC 开发框架,用于使用 Go 语言快速构建微服务。测试 Go Micro 服务可以使用 micro 工具,比如调用 hello RPC 服务:$ micro call g ...