40

微服务系列笔记之Go-Micro入门案例

 4 years ago
source link: https://www.tuicool.com/articles/qeQfu2N
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

导语

了解了Micro的基本框架之后,我们做一个简单的例子来实现客户端与服务端的通信,在了解本篇文章之前,需要你对rpc、grpc通信技术有所了解。

准备工作

## 安装go-micro
go get github.com/micro/go-micro
## 安装micro
go get github.com/micro/micro
## 安装grpc
go get -u google.golang.org/grpc
## 安装grpc插件
go get -u github.com/golang/protobuf/protoc-gen-go
## 安装micro插件
go get github.com/micro/protoc-gen-micro
# 设置环境变量,便于命令行操作
export PATH=$PATH:$GOPATH/bin

案例

服务端

定义一个common.proto

syntax = "proto3";

package go.micro.srv.demo;

message Request {
    string msg = 1;
}

message Pair {
    int32 key = 1;
    string values = 2;
}

message Response {
    string msg = 1;
    // 数组
    repeated string values = 2;
    // map
    map<string,Pair> header= 3;
    RespType type = 4;
}
// enum 
enum RespType{
    NONE = 0;
    ASCEND = 1;
    DESCEND = 2;
}
// 服务接口
service Say {
    rpc Hello (Request) returns (Response);
}

使用插件生成相关代码

protoc  --go_out=. --micro_out=. proto/demo/common.proto

可以看到在目录中多了两个文件

dbaf59ce880945279836d0a29f4a42d1.png

image

现在开始创建我们的服务,编写实现服务的方法,这里的参数格式必须要按照如下格式写。demo是导进去的包,即你编写proto文件名的包,我在这里由于使用了go mod init github.com/yuwe1/micolearn进行初始化了项目,因此导入的包可以直接写成 demo "github.com/yuwe1/micolearn/day01/demoservice/proto/demo"
type Say struct{}
func (s *Say) Hello(ctx context.Context, req *demo.Request, rsp *demo.Response) error {
    fmt.Println("received", req.Msg)
    rsp.Header = make(map[string]*demo.Pair)
    rsp.Header["name"] = &demo.Pair{Key: 1, Values: "abc"}
    rsp.Msg = "Hello World"
    rsp.Values = append(rsp.Values, "a", "b")
    rsp.Type = demo.RespType_DESCEND
    return nil
}

注册我们的服务在main函数中,在这里面仅仅添加了一行注册的代码在3段式中。

srv := micro.NewService(
        micro.Name("go.micro.srv.demo"),
        micro.Version("latest"),
)
srv.Init()
demo.RegisterSayHandler(srv.Server(), new(Say))
// run server
if err := srv.Run(); err != nil {
    panic(err)
}

启动我们的服务,可以看到成功注册了一个名字叫demo的服务。

0db8f4d3c2413e7155c1959831c38454.png

image

客户端

比较简单,这里直接贴上源码,需要注意的是,客户端首先获取到服务,然后直接调用了服务函数

package main

import (
    "context"
    "fmt"

    microclient "github.com/micro/go-micro/client"
       //需要更换成你自己的包,在服务端的那部分包,同样也需要更改
    demo "github.com/yuwe1/micolearn/day01/demoservice/proto/demo"
)

func main() {
    client := demo.NewSayService("go.micro.srv.demo", microclient.DefaultClient)
    r, err := client.Hello(context.Background(), &demo.Request{Msg: "hahaahah"})
    if err != nil {
        panic(err)
    }
    fmt.Println(r)
}

运行我们的客户端

822f1bc860b46e4d7fc4f056c23df49f.png

image

服务端控制台成功打印数据

e8a93b30c727fb9b9971c3b69aa2ab1d.png

image


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK