go-micro3.0教程(2)-服务创建及调用

  • Post author:
  • Post category:其他


前言

  • 上一章节中介绍了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服务可开启代理,多个服务使用时可以使用代理。



版权声明:本文为weixin_42547619原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。