微服务系列(5)Micro

1. 准备etcd

这边使用etcd作为服务发现工具,你也可以使用consul或者其它服务发现工具

下载etcd

直接下载二进制包运行,下载地址:https://github.com/etcd-io/etcd/releases

1wget https://github.com/etcd-io/etcd/releases/download/v3.4.4/etcd-v3.4.4-linux-amd64.tar.gz
2tar xf etcd-v3.4.4-linux-amd64.tar.gz -C /usr/bin/ --strip-components 1 etcd-v3.4.4-linux-amd64/{etcd,etcdctl}

验证安装

1etcd --version

运行etcd

1etcd --logger=zap

更多使用方法

1etcd --help

2. Micro简介

Micro解决了构建云本地系统的关键需求。它采用了微服务体系结构模式,并将其转换为一组工具,作为可伸缩平

台的构建块。Micro隐藏了分布式系统的复杂性,并为开发人员提供了很好的理解概念。

Micro是一个专注于简化分布式系统开发的微服务生态系统。是一个工具集合, 通过将微服务架构抽象成一组工具。

隐藏了分布式系统的复杂性,为开发人员提供了更简洁的概念。

3. Micro安装

Go语言版本的,下载之后只有一个二进制包

下载地址:https://github.com/micro/micro/releases

1wget https://github.com/micro/micro/releases/download/v2.2.0/micro-v2.2.0-linux-amd64.tar.gz
2tar xvf micro-v2.2.0-linux-amd64.tar.gz  -C /usr/bin/ micro

验证安装

1micro --version
2micro version 2.2.0

4. 创建微服务

micro命令说明

new: 创建通过指定相对于$GOPATH的目录路径,创建一个新的微服务

--namespace: 服务的命名空间,默认为go.micro

--type: 服务类型,有api, fnc, srv, web,默认为srv

run: 运行微服务

创建2个微服务

创建一个srv服务

 1cd $GOPATH/src/
 2micro new --type "srv" micro_demo/rpc/srv
 3# srv 表示当前创建的微服务类型
 4Creating service go.micro.srv.srv in micro_demo/rpc/srv
 5
 6.
 7├── main.go
 8├── generate.go
 9├── plugin.go
10├── handler
11│   └── srv.go
12├── subscriber
13│   └── srv.go
14├── proto/srv
15│   └── srv.proto
16├── Dockerfile
17├── Makefile
18├── README.md
19├── .gitignore
20└── go.mod
21
22
23download protobuf for micro:
24
25brew install protobuf
26go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
27go get -u github.com/micro/protoc-gen-micro/v2
28
29compile the proto file srv.proto:
30
31cd micro_demo/rpc/srv
32protoc --proto_path=.:$GOPATH/src --go_out=. --micro_out=. proto/srv/srv.proto

根据上面的提示,srv服务需要安装protoc,protoc-gen-go,protoc-gen-micro,然后编译proto文件

下载protoc:https://github.com/protocolbuffers/protobuf/releases

下载对应平台的二进制包,解压到PATH目录下

1go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
2go get -u github.com/micro/protoc-gen-micro/v2
3
4cd micro_demo/rpc/srv
5protoc --proto_path=.:$GOPATH/src --go_out=. --micro_out=. proto/srv/srv.proto

执行完会在proto/srv下生成2个go文件

1ls -lh proto/srv
2total 48
3-rw-r--r--  1 jerry  staff    11K  3 15 10:14 srv.pb.go
4-rw-r--r--  1 jerry  staff   6.4K  3 15 10:14 srv.pb.micro.go
5-rw-r--r--  1 jerry  staff   511B  3 15 10:12 srv.proto

接着创建一个web服务

 1cd $GOPATH/src
 2micro new --type "web" micro_demo/rpc/web
 3Creating service go.micro.web.web in micro_demo/rpc/web
 4
 5.
 6├── main.go
 7├── plugin.go
 8├── handler
 9│   └── handler.go
10├── html
11│   └── index.html
12├── Dockerfile
13├── Makefile
14├── README.md
15├── .gitignore
16└── go.mod

5. 运行微服务

运行srv服务

1cd $GOPATH/src/micro_demo/rpc/srv
2# 指定MICRO_REGISTRY,不指定默认为mdns
3MICRO_REGISTRY=etcd go run main.go
42020-03-15 11:24:46 Starting [service] go.micro.srv.srv
52020-03-15 11:24:46 Server [grpc] Listening on [::]:63628
62020-03-15 11:24:46 Broker [eats] Connected to [::]:63630
72020-03-15 11:24:46 Registry [etcd] Registering node: go.micro.srv.srv-f3ecce4f-9059-483c-a924-4d539def8875
82020-03-15 11:24:46 Subscribing to topic: go.micro.srv.srv

拷贝一份proto到web目录

1cd $GOPATH/src/micro_demo/rpc/web
2cp -r ../srv/proto .

修改web服务的handler

将之前的

1web "path/to/service/proto/web"

修改为

1web "micro_demo/rpc/web/proto/srv"

同时修改调用后台的服务名称和方法

1  // call the backend service
2	webClient := web.NewSrvService("go.micro.srv.srv", client.DefaultClient)
3	rsp, err := webClient.Call(context.TODO(), &web.Request{
4		Name: request["name"].(string),
5	})

修改main.go监听地址

默认情况下没有指定端口,是一个随机的端口,我们将其固定一下

1	// create new web service
2        service := web.NewService(
3                web.Name("go.micro.web.web"),
4                web.Version("latest"),
5                web.Address("127.0.0.1:8080"),
6        )

运行web服务

1MICRO_REGISTRY=etcd go run main.go

6. 检查

测试页面调用

打开浏览器,http://127.0.0.1:8080进行访问

输入一个名字,点击submit,能得到服务端给的响应,说明后端服务请求正常。

micro_web

查看etcd

1etcdctl get /micro/registry --prefix --keys-only
2/micro/registry/go.micro.nats.broker/NBE54BUS25WS2NYS6LUSOGXJV5INM3VCMPKNC7Q4MZX7AW3OAM6POJW4
3
4/micro/registry/go.micro.srv.srv/go.micro.srv.srv-f3ecce4f-9059-483c-a924-4d539def8875
5
6/micro/registry/go.micro.web.web/52c8a73b-fca6-44ca-ab42-bc353e883316

发现服务也已经正常注册上来了。