go-micro 入门

go-micro是一个简化分布式开发的微服务生态系统,该系统为开发分布式应用程序提供了高效,便捷的模块构建。主要目的是简化分布式系统的开发,包括RPC和事件驱动通信,合理的默认值和可插拨的架构。

特征

  • 身份验证- Auth 是内置的,是一等公民。身份验证和授权通过为每项服务提供身份和证书来实现安全的零信任网络。这还包括基于规则的访问控制。

  • 动态配置- 从任意位置加载和热重载动态配置。配置接口提供了一种从任何来源(例如环境变量、文件、etcd)加载应用程序级配置的方法。您可以合并源,甚至可以定义后备方案。

  • 数据存储- 一个简单的数据存储接口,用于读取、写入和删除记录。它包括对插件库中许多存储后端的支持。状态和持久性成为原型设计之外的核心要求,Micro 希望将其构建到框架中。

  • 服务发现- 自动服务注册和名称解析。服务发现是微服务开发的核心。当服务 A 需要与服务 B 通信时,它需要该服务的位置。默认发现机制是多播 DNS (mdns),这是一种零配置系统。

  • 负载平衡- 基于服务发现的客户端负载平衡。一旦我们获得了某个服务任意数量的实例的地址,我们现在需要一种方法来决定路由到哪个节点。我们使用随机散列负载平衡来提供跨服务的均匀分布,并在出现问题时重试其他节点。

  • 消息编码- 基于内容类型的动态消息编码。客户端和服务器将使用编解码器以及内容类型为您无缝编码和解码 Go 类型。任何种类的消息都可以从不同的客户端进行编码和发送。客户端和服务器默认处理此问题。默认情况下,这包括 protobuf 和 json。

  • RPC 客户端/服务器- 基于 RPC 的请求/响应,支持双向流式传输。我们为同步通信提供抽象。对服务的请求将自动解析、负载平衡、拨号和流式传输。

  • 异步消息传递- PubSub 是异步通信和事件驱动架构的首选。事件通知是微服务开发的核心模式。默认消息传递系统是 HTTP 事件消息代理。

  • 可插入接口- Go Micro 利用 Go 接口实现每个分布式系统抽象。因此,这些接口是可插入的,并允许 Go Micro 不受运行时限制。您可以插入任何底层技术。

micro微服务工具包

工具包组成

  • Go Micro:用于在Go中编写微服务的插件式RPC框架。它提供了用于服务发现,客户端负载平衡,编码,同步和异步通信库。

  • API: API主要负责提供将HTTP请求路由到相应微服务的API网关。它充当单个入口点,可以用作反向代理或将HTTP请求转换为RPC。

  • Sidecar:一种对语言透明的RPC代理,具有go-micro作为HTTP端点的所有功能。虽然Go是构建微服务的伟大语言,但您也可能希望使用其他语言,因此Sidecar提供了一种将其他应用程序集成到Micro世界的方法。

  • Web:用于Micro Web应用程序的仪表板和反向代理。我们认为应该基于微服务建立web应用,因此被视为微服务领域的一等公民。它的行为非常像API反向代理,但也包括对web sockets的支持。

  • CLI:一个直接的命令行界面来与你的微服务进行交互。它还使您可以利用Sidecar作为代理,您可能不想直接连接到服务注册表。

  • Bot:Hubot风格的bot,位于您的微服务平台中,可以通过Slack,HipChat,XMPP等进行交互。它通过消息传递提供CLI的功能。可以添加其他命令来自动执行常见的操作任务。

Install Micro CLI

1
go install github.com/micro/micro/v5/cmd/micro@master

安装成功后查看

1
2
> micro -v
micro version latest

Usage

设置环境,当前设置为本地环境运行

1
2
3
4
micro env set local

# 查看当前环境
micro env get

Run the server

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
➜  ~ micro server
2025-04-08 12:43:03  file=server/server.go:74 level=info Starting server
2025-04-08 12:43:03  file=server/server.go:129 level=info Registering registry
2025-04-08 12:43:03  file=server/server.go:129 level=info Registering broker
2025-04-08 12:43:03  file=server/server.go:129 level=info Registering network
2025-04-08 12:43:03  file=server/server.go:129 level=info Registering runtime
2025-04-08 12:43:03  file=server/server.go:129 level=info Registering config
2025-04-08 12:43:03  file=server/server.go:129 level=info Registering store
2025-04-08 12:43:03  file=server/server.go:129 level=info Registering events
2025-04-08 12:43:03  file=server/server.go:129 level=info Registering auth
2025-04-08 12:43:03  file=server/server.go:139 level=info Starting runtime
2025-04-08 12:43:03  file=grpc/grpc.go:993 level=info Server [grpc] Listening on [::]:8081
2025-04-08 12:43:03  file=http/http.go:93 level=info HTTP Server Listening on [::]:8080

可以看到默认监听了8081和8080端口,分别用于grpc和http通信。

命令行访问验证:

1
2
➜  ~ curl "http://localhost:8080"
{"version": "latest"}

Login to Micro

Default username/password: admin/micro

1
2
3
4
$ micro login
Enter username: admin
Enter password:
Successfully logged in.

Run the service

查看当前服务运行状态,默认运行一个helloworld服务。

1
2
3
➜  ~ micro status
NAME            VERSION SOURCE          STATUS  BUILD   UPDATED         METADATA
helloworld      latest  helloworld      running n/a     3d18h22m22s ago owner=admin, group=micro

查看当前运行中的服务

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
➜  ~ micro services
auth
broker
config
events
helloworld
network
registry
runtime

运行一个本地自建服务,比如运行id服务:

1
2
3
4
5
git clone https://github.com/micro/services.git

cd services

micro run id

查看运行服务状态

1
2
3
4
5
➜  micro status
NAME            VERSION SOURCE          STATUS  BUILD   UPDATED         METADATA
helloworld      latest  helloworld      running n/a     3d18h27m31s ago owner=admin, group=micro
id              latest  id              running n/a     33s ago         owner=admin, group=micro

通过htt访问指定服务:

1
2
3
4
➜  curl "http://localhost:8080/id/Generate?type=snowflake"
{"id":"1756205649227841536","type":"snowflake"}%
➜  services git:(master) curl "http://localhost:8080/helloworld/Stream?name=John"
{"message":"Hello John"}%

通过grpc访问指定服务

1
2
3
4
5
6
➜  micro stream helloworld Helloworld.Stream '{"name":"John","messages":2}'
{
        "message": "Hello John"
}{
        "message": "Hello John"
}%

查看服务日志

1
micro logs helloworld

停止一个服务

1
micro kill id

停止micro server

1
micro shutdown

go-micro入门

创建一个micro服务,并在本地运行,代码实现如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package main

import (
	"context"
	"go-micro.dev/v5"
)

type Request struct {
	Name string `json:"name"`

}

type Response struct {
	Message string `json:"message"`

}

type Helloworld struct{}

func (h *Helloworld) Greeting(ctx context.Context, req *Request, rsp *Response) error {
	rsp.Message = "Hello " + req.Name
	return nil

}

func main() {
	// create a new service
	service := micro.NewService(
		micro.Name("helloworld"),
		micro.Handle(new(Helloworld)),
		// set address
		micro.Address(":8080"),
	)

	// initialise flags
	service.Init()

	// start the service
	service.Run()
}

运行服务

1
2
3
4
5
o run main.go
2025-04-08 13:19:14  file=hi/main.go:39 level=info Starting [service] helloworld
2025-04-08 13:19:14  file=v5@v5.3.0/service.go:98 level=info Transport [http] Listening on [::]:8080
2025-04-08 13:19:14  file=v5@v5.3.0/service.go:98 level=info Broker [http] Connected to 127.0.0.1:58934
2025-04-08 13:19:14  file=server/rpc_server.go:562 level=info Registry [mdns] Registering node: helloworld-7b25c850-b353-461e-8e32-7ab4a9870ab3

访问服务

1
2
3
4
5
6
7
~ curl -XPOST \
     -H 'Content-Type: application/json' \
     -H 'Micro-Endpoint: Helloworld.Greeting' \
     -d '{"name": "alice"}' \
      http://localhost:8080
{"message":"Hello alice"}

参考