go-micro简明教程
# Go-Micro与Micro
Go-Micro
go-micro 是一个用于构建微服务的开源框架。它旨在简化微服务开发的复杂性,提供了一系列工具和库,帮助开发者快速创建、管理和扩展微服务架构
Micro
Micro3.0之前Micro 是一个用于构建微服务的工具集,提供了完整的解决方案,包括 API 网关、服务发现、配置管理等
Micro 3.0之后 ,微服务框架成为了云原生开发平台
Go-Micro与Micro的分离
Micro变成云原生开发平台后,Go-Micro就被舍弃并转交到Micro的CEO个人名下,后续Go-Micro这个框架的维护权也交给了社区,仍蓬勃发展。目前最新版本是v5,已经有21.5k star
关于Go-Micro与Micro的一些说明 (opens new window)
# Go-Micro概念
介绍
- 它是对分布式系统的高度抽象
- 提供分布式系统开发的核心库
- 可拔插的架构,按需使用
组件
- Registry(注册):提供服务发现机制
- Selector(选择器):能够实现负载均衡
- Transport(传输):服务与服务之间通信接口
- Broker:提供异步通信的消息发布/订阅接口
- Codec(编码):消息传输到两端时进行编码与解码
- Server(服务端)
- Client(客户端)
架构组件图
通信图
# Go-Micro快速开始
用go-micro v4 编写一个斐波那契数列运算的服务,快速熟悉go-micro框架的基础使用
# 1、依赖安装
proto generator
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install github.com/go-micro/generator/cmd/protoc-gen-micro@latest
1
2
2
PS:如果不知道ProtocolBuffer是什么可以看[[Protocol Buffers学习]]
go-micro v4 安装
go get go-micro.dev/v4
1
# 2、proto编写&代码生成
fibonacci.proto
syntax = "proto3";
package fibonacci;
// 指定生成go文件的存放位置及其包名
option go_package = "./fibonacci";
service Fibonacci {
rpc GetSequence(FibonacciRequest) returns (FibonacciResponse) {}
}
message FibonacciRequest {
int32 length = 1;
}
message FibonacciResponse {
repeated int64 sequence = 1;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.
├── client
├── proto
│ └── fibonacci.proto
└── server
1
2
3
4
5
2
3
4
5
代码生成
进入proto文件夹内执行
protoc --micro_out=. --go_out=. ./*.proto
1
执行完命令后我们可以看到新增了两个文件
.
├── client
├── proto
│ ├── fibonacci
│ │ ├── fibonacci.pb.go
│ │ └── fibonacci.pb.micro.go
│ └── fibonacci.proto
└── server
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 3、Server端编写
package main
import (
"context"
"fmt"
pb "xxx/proto/fibonacci"
"go-micro.dev/v4"
)
type Server struct {
}
func (s *Server) GetSequence(ctx context.Context, req *pb.FibonacciRequest, res *pb.FibonacciResponse) error {
length := req.GetLength()
sequence := make([]int64, length)
if length > 0 {
sequence[0] = 0
}
if length > 1 {
sequence[1] = 1
}
for i := int32(2); i < length; i++ {
sequence[i] = sequence[i-1] + sequence[i-2]
}
res.Sequence = sequence
return nil
}
func main() {
// 创建新的服务
service := micro.NewService(
micro.Name("fibonacci.server"),
)
// 初始化方法
service.Init()
// 注册服务
pb.RegisterFibonacciHandler(service.Server(), &Server{})
// 运行服务
if err := service.Run(); err != nil {
fmt.Println(err)
}
}
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
42
43
44
45
46
47
48
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
42
43
44
45
46
47
48
.
├── client
├── go.mod
├── go.sum
├── proto
│ ├── fibonacci
│ │ ├── fibonacci.pb.go
│ │ └── fibonacci.pb.micro.go
│ └── fibonacci.proto
└── server
└── server.go
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 4、Client端编写
package main
import (
"context"
"fmt"
pb "xxx/proto/fibonacci"
"go-micro.dev/v4"
)
func main() {
// 创建新的服务
service := micro.NewService(
micro.Name("fibonacci.client"),
)
// 初始化
service.Init()
c := pb.NewFibonacciService("fibonacci.server", service.Client())
req := &pb.FibonacciRequest{Length: 10}
res, err := c.GetSequence(context.Background(), req)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("Fibonacci sequence: %v\n", res.GetSequence())
}
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
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
.
├── client
│ └── client.go
├── go.mod
├── go.sum
├── proto
│ ├── fibonacci
│ │ ├── fibonacci.pb.go
│ │ └── fibonacci.pb.micro.go
│ └── fibonacci.proto
└── server
└── server.go
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# Go-Micro CLI
Micro割离go-micro后,go-micro的社区贡献者也做出了类似以前Micro工具集的CLI,go-micro cli (opens new window)
# 1、安装
go install github.com/go-micro/cli/cmd/go-micro@latest
1
# 2、命令
使用go-micro --help可以查看所有命令,接下来是对一些命令的解释和示例
- call:该命令用于调用一个服务。
- 示例:
go-micro call helloworld Helloworld.Call '{"name": "John"}'
- 这个示例调用了名为 helloworld 的服务中的 Helloworld.Call 方法,传递了一个 JSON 格式的参数 {"name": "John"}。
- 示例:
- completion: 该命令用于输出指定 shell(bash 或 zsh)的 shell 自动补全代码
- 示例:
go-micro completion bash
- 这个示例输出适用于 bash shell 的自动补全代码。
- 示例:
- describe:该命令用于描述一个资源。
- 示例:go-micro describe helloworld
- 这个示例描述了名为 helloworld 的资源。
- generate:该命令用于在事后生成项目模板文件。
- 示例:
go-micro generate
- 这个示例在当前目录下生成项目模板文件。
- 示例:
上次更新: 2024/07/08, 18:19:51