go-micro3.0教程(2)-服务创建及调用
前言上一章节中介绍了micro3.0 在linux上环境的搭建,这届主要讲服务创建和调用过程以及遇到的问题,准备工作etcd3.0ip(49.232.162.254)虚拟机 (192.16.24.145) 运行order 服务虚拟机(192.16.24.49)运行 user服务宿主机(192.16.24.12) 运行order服务MySQL (49.232.162.25) 存放订单表新建服务本次u
前言
- 上一章节中介绍了micro3.0 在linux上环境的搭建,这届主要讲服务创建和调用过程以及遇到的问题,实现order和user服务,并且在user服务中调用order服务
准备工作
- etcd3.0 ip(49.232.162.254)
- 虚拟机 (192.16.24.145) 运行order 服务
- 虚拟机(192.16.24.49) 运行 user服务
- MySQL (49.232.162.25) 存放订单表
新建服务
本次user服务里为注册 和登录服务,在micro-user 服务里 调用micro-order服务的订单详情服务
user服务
1、开始user服务,登录192.16.24.49 服务器,执行如下操作
[root@10-13-82-233 go]# micro new micro-user
Creating service micro-user
.
├── micro.mu
├── main.go
├── generate.go
├── handler
│ └── first.go
├── proto
│ └── first.proto
├── Dockerfile
├── Makefile
├── README.md
├── .gitignore
└── go.mod
download protoc zip packages (protoc-$VERSION-$PLATFORM.zip) and install:
visit https://github.com/protocolbuffers/protobuf/releases
download protobuf for micro:
go get -u github.com/golang/protobuf/proto
go get -u github.com/golang/protobuf/protoc-gen-go
go get github.com/micro/micro/v3/cmd/protoc-gen-micro
compile the proto file first.proto:
cd micro-user
# 生成micro代码
protoc --proto_path=. --micro_out=:. --go_out=:. user.proto
# 到代码的根目录 micro-user
go mod init caoxiukang123456/micro-user
go mot tidy
就创建了一个micro-user 服务,包名caoxiukang123456/micro 包名尽量符合规范,此时代码里什么都没有。先看看定义的服务都有什么。
syntax = "proto3";
package go.micro.service.user;
option go_package = "./;user";
service UserService {
rpc Register (RegisterRequest) returns (Response){}
rpc Login (LoginRequest) returns (Response){}
}
message User {
uint32 id = 1;
string name = 2;
string phone = 3;
string password = 4;
}
message RegisterRequest{
User user = 1;
}
message LoginRequest{
string name = 1;
string password = 2;
}
message Response{
int32 code = 1;
string
在micro-user 服务里定义了 Register 和Login服务,生成的服务目录如下。
现在看看对应的主函数,在主函数中调用了order服务里的订单详情方法。同时需要导入order的包,由于两个服务分别运行在每个服务,需要将两个服务放在git库中,这样就能相互引用
order服务
1、参考user服务流程,创建order服务 order 服务中有订单查询服务,创建数据库,order表等,另外在服务中 需要自己实现订单查询 Info,Create 等方法
syntax = "proto3";
package go.micro.service.order;
option go_package = "./;order";
service Order {
rpc Info (InfoRequest) returns (Response) {}
rpc Create (CreateRequest) returns (Response) {}
}
message InfoRequest {
uint32 id = 1;
}
message CreateRequest {
OrderInfo OrderInfo = 1;
}
message Response {
OrderInfo OrderInfo = 1;
}
message OrderInfo {
uint32 id = 1;
uint32 goodsId = 2;
uint32 userId = 3;
string orderSn = 4;
在handler里实现查询order的方法
下面看看micro-order服务的主函数
此时两个服务都以及创建好了,
执行服务
1、按照如下方式运行
- 虚拟机 (192.16.24.145) 运行order 服务
- 宿主机(192.16.24.12) 运行order服务
此时在etcd中可以看到注册进去的order服务信息
在服务信息里面可以看到服务的ip端口,服务名称,方法参数等细节参数
2、在虚拟机 (192.16.24.49) 运行user 服务
可以看到user服务启动成功,而且调用order服务也返回了数据
再看order服务(192.16.24.145)
可以看到order服务运行正常,且收到请求后查询数据的sql说明运行成功。
在这里由于192.16.24.145,和宿主机192.16.24.12 上都运行了order 服务,则在调用的时候,micro会采用负载均衡策略来调用服务
注意:
1、在使用连接的时候会遇到这个情况
user服务从etcd里面获取到可用的order服务后发起调用,但是调用不通,原因是micro在注册的服务的端口没有在order服务上开启,另外order服务开启了防火墙,导致调用不通,因此需要开启防火墙 ETCD连接不上,需要关闭防火墙
2、在部署micro微服务时,可以选择每个服务单独部署一服务,也可以多个服务部署在一个服务器中,这和部署策略有关,需要按自己实际要求。
3、部署多个服务时,需要保证每个服务器之前都能ping通,且端口开放。不然方法调用不通。
4、micro服务可开启代理,多个服务使用时可以使用代理。
更多推荐
所有评论(0)