准备工作
想要用go开发一个微服务,首先需要三个可执行文件 :protoc ,protoc-gen-go ,protoc-gen-micro ,跟着下面的步骤开始准备
- 以下两种方式任选一种即可安装protoc,完成后命令行输入: protoc 查看是否安装成功
- sudo apt install protobuf-compiler
- https://github.com/protocolbuffers/protobuf/releases 选择对应的编译版本,我这里选择protoc-3.14.0-linux-x86_64.zip,下载好后,把/bin下的protoc 放到/usr/local/bin下,或设置一个软链接到/usr/local/bin下。
- 安装protoc-gen-go
- go get -u github.com/golang/protobuf/protoc-gen-go
- 安装prtotc-gen-micro
-
go get github.com/micro/protoc-gen-micro
第2,3步两个命令会把可执行文件放到gobin下的bin目录,然后再设置软链接到/usr/local/bin下
开始编写代码
服务端 :
microServer/proto/hello.proto
syntax = "proto3";
package myfirstmicro;
option go_package = "proto;mymicro";
service Hello {
rpc MyHelloService (HelloReq) returns (HelloRes) ;
}
message HelloReq {
string Name = 1;
}
message HelloRes {
string ResName = 1 ;
}
在项目目录下执行:protoc -I=./proto --go_out=. --micro_out=. ./proto/hello.proto
生成 microServer/proto/hello.pb.go 和 microServer/proto/hello.pb.micro.go两个文件
然后编写 microServer/controller/hello.go:
package controller
import (
"context"
"fmt"
pb "microServer/proto"
)
type HelloService struct {
}
func NewHelloService() *HelloService {
return &HelloService{}
}
func (h *HelloService) MyHelloService(ctx context.Context, req *pb.HelloReq, res *pb.HelloRes) error {
fmt.Println("传入的结构体:", req.Name)
//具体逻辑,假装查了一下数据库
res.ResName = "你好" + req.Name
fmt.Println("返回的结构体:", res.ResName)
return nil
}
编写main.go文件
package main
import (
"microServer/controller"
pb "microServer/proto"
"github.com/micro/go-micro/v2"
)
func main() {
server := micro.NewService(
micro.Name("myMicro"),
)
server.Init()
_ = pb.RegisterHelloHandler(server.Server(), controller.NewHelloService())
server.Run()
}
项目启动:go run main.go
客户端 :
microClient/main.go
package main
import (
"context"
"fmt"
pb "microServer/proto"
"github.com/micro/go-micro/v2"
)
func main() {
//构建微服务
server := micro.NewService()
server.Init()
// 调用服务端 /microServer/proto/hello.pb.micro.go中的方法
// 得到一个结构体(该结构体实现了 client api 的方法)
helloService := pb.NewHelloService("myMicro", server.Client())
// 调用服务端 /microServer/proto/hello.pb.go中的方法
// 得到入参结构体
HelloReq := &pb.HelloReq{
Name: "my name",
}
// 调用 /microServer/proto/hello.pb.micro.go中的方法(client api)
// (client api 这个方法的具体实现中调用了 Server API 的MyHelloService 方法)
// Server API 中的这个方法最终是由/microServer/controller中的 HelloService 实现了
res, err := helloService.MyHelloService(context.Background(), HelloReq)
fmt.Println("res:", res, "err:", err)
}
项目启动:go run main.go