06.go-micro
# 01.go-micro基础
# 1.1 概述
- micro是一个工具集,用来帮助开发者创建和管理微服务。
- 它包括两部分:
go-micro
:它是一个go语言的微服务开发框架。micro
:它是一个命令行工具,这个工具是基于go-micro开发的。
- 另外
go-plugins
作为一组插件,在开发过程中也是必要的。 - 通过插件,我们在服务发现、异步消息和传输协议等方面有了更多的选择。
# 1.2 go-micro 安装
- 配置go代理
root@dev:~# vim ~/.bashrc
export GOROOT=/usr/local/go #GOROOT是系统上安装Go软件包的位置。
export GOPATH=/home/GOPATH #GOPATH是工作目录的位置。
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
export GO111MODULE=on
export GOPROXY="https://goproxy.cn"
root@dev:~# source ~/.bashrc
1
2
3
4
5
6
7
2
3
4
5
6
7
- 安装 go-micro
# 安装go-micro
root@dev:~# go get github.com/micro/go-micro
# 如果您使用代码生成,您还需要使用 protoc-gen-go
root@dev:~# go get github.com/micro/protobuf/{proto,protoc-gen-go}
# Micro 工具包提供了访问微服务的各种方法
root@dev:~# go get github.com/micro/micro/v2
1
2
3
4
5
6
2
3
4
5
6
# 1.3 go-micro命令
# 使用命令创建一个微服务项目:bj38
root@dev:micro_dir# micro new bj38 --type=srv --alias=bj38 --namespace=io.github.entere --gopath=false
.
├── micro.mu
├── main.go # 项目入口文件
├── generate.go
├── handler # 处理 gRPC 实现的接口
│ └── bj38.go
├── proto # 预生成的 protobuf 文件
│ └── bj38.proto
├── Dockerfile # 部署微服务所使用的 Dockerfile
├── Makefile # 快速编译文件
├── README.md
├── .gitignore
└── go.mod
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- --namespace: 命名空间 == 包名
- --type : 微服务类型。
- srv: 微服务类型项目
- web:基于微服务的 web 网站
# 1.4 micro new参数
配置指令 | 作用 | 默认值 | 说明 |
---|---|---|---|
–namespace | 服务命令空间 | go.micro | 可以根据自己的域名定义合适的空间前缀 |
–type | 服务类型 | srv | 目前支持4种服务类型,分别是api、fnc(function)、srv(service)、web。 |
–alias | 指定别名 | 声明则必填 | 使用单词,不要带任何标点符号,名称对Micro路由机制影响很大 |
–plugin | 使用哪些插件 | 声明则必填 | 需要自选插件时使用 |
–gopath | 是否使用GOPATH作为代码路径 | true或者false | 使用go modules 可以设置为false |
–fqdn | 服务定义域,API需要通过该域找到服务 | 默认是使用服务的命令空间加上类型再加上别名 | 服务定义域 |
# 02.go-micro初始化项目
# 2.1 创建项目
# 使用命令创建一个微服务项目:bj38
root@dev:micro_dir# micro new bj38 --type=srv --alias=bj38 --namespace=io.github.entere --gopath=false
.
├── micro.mu
├── main.go # 项目入口文件
├── generate.go
├── handler # 处理 gRPC 实现的接口
│ └── bj38.go
├── proto # 预生成的 protobuf 文件
│ └── bj38.proto
├── Dockerfile # 部署微服务所使用的 Dockerfile
├── Makefile # 快速编译文件
├── README.md
├── .gitignore
└── go.mod
root@dev:bj38# make
root@dev:bj38# make proto
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 2.2 protobuf生成文件
proto/bj38.pb.micro.go
type Bj38Service interface {
Call(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error)
Stream(ctx context.Context, in *StreamingRequest, opts ...client.CallOption) (Bj38_StreamService, error)
PingPong(ctx context.Context, opts ...client.CallOption) (Bj38_PingPongService, error)
}
// 1、客户端的定义
type bj38Service struct {
c client.Client
name string
}
// 2、客户端new初始化
func NewBj38Service(name string, c client.Client) Bj38Service {
return &bj38Service{
c: c,
name: name,
}
}
// 3、客户端的实现
func (c *bj38Service) Call(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error) {
req := c.c.NewRequest(c.name, "Bj38.Call", in)
out := new(Response)
err := c.c.Call(ctx, req, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// 服务注册(服务端使用)---> 对应 gRPC的 RegisterXXXService() 方法
func RegisterBj38Handler(s server.Server, hdlr Bj38Handler, opts ...server.HandlerOption) error {
type bj38 interface {
Call(ctx context.Context, in *Request, out *Response) error
Stream(ctx context.Context, stream server.Stream) error
PingPong(ctx context.Context, stream server.Stream) error
}
type Bj38 struct {
bj38
}
h := &bj38Handler{hdlr}
return s.Handle(s.NewHandler(&Bj38{h}, opts...))
}
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
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
# 2.3 main.go
package main
import (
"bj38/handler"
pb "bj38/proto"
"github.com/micro/micro/v3/service"
"github.com/micro/micro/v3/service/logger"
)
func main() {
// Create service
srv := service.New(
service.Name("bj38"),
service.Version("latest"),
)
// Register handler
pb.RegisterBj38Handler(srv.Server(), new(handler.Bj38))
// Run service
if err := srv.Run(); err != nil {
logger.Fatal(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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 2.4 handler/bj38.go
package handler
type Bj38 struct{}
// Call is a single request handler called via client.Call or the generated client code
func (e *Bj38) Call(ctx context.Context, req *bj38.Request, rsp *bj38.Response) error {
log.Info("Received Bj38.Call request")
rsp.Msg = "Hello " + req.Name
return nil
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 03.创建微服务服务端
# 3.1创建服务端
# 使用命令创建一个微服务项目:bj38
root@dev:micro_dir# micro new test66 --type=srv --alias=test66 --namespace=example.com --gopath=false
Creating service test666
.
├── micro.mu
├── main.go
├── generate.go
├── handler
│ └── test666.go
├── proto
│ └── test666.proto
├── Dockerfile
├── Makefile
├── README.md
├── .gitignore
└── go.mod
root@dev:test666# make proto
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 04.创建客户端
# 4.1 创建客户端
root@dev:micro_dir# micro new test77 --type=web --alias=test77 --namespace=example.com --gopath=false
.
├── micro.mu
├── main.go
├── generate.go
├── handler
│ └── test77.go
├── proto
│ └── test77.proto
├── Dockerfile
├── Makefile
├── README.md
├── .gitignore
└── go.mod
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
上次更新: 2024/3/13 15:35:10