consul是微服務中常用的中間件,可以提供注冊服務,go-micro是golang的微服務架構,擁有服務端和用戶端,預設使用protobuf作為通信協定的定義,consul和go-micro是可以合作的。下面開始吧。
1、編寫person.proto檔案
syntax = "proto3";
package go.micro.service.person;
option go_package="../service";
//定義服務
service Say{
rpc SayHello(SayRequest) returns(SayResponse){}
}
message SayRequest{
string message = 1;
}
message SayResponse{
string answer = 1;
}
2、在pb目錄下,執行以下指令:
protoc --proto_path=. --micro_out=. --go_out=:. person.proto
就會生成:
3、編寫服務端:server.go
package main
import (
"context"
"fmt"
"github.com/hashicorp/consul/api"
pb "go-micro-project/service"
"go-micro.dev/v4"
)
type SayServer struct {
}
//需要實作的方法
func (c *SayServer) SayHello(ctx context.Context, req *pb.SayRequest, res *pb.SayResponse) error {
res.Answer = "IT程式設計自學:"+req.Message
return nil
}
//replace google.golang.org/grpc => google.golang.org/grpc v1.26.0
var service = "person.server"
func main() {
// go-micro服務,注冊到consul上.
// 1. 初始化consul 配置
consulConfig := api.DefaultConfig()
// 2. 建立 consul 對象
consulClient, err := api.NewClient(consulConfig)
if err != nil {
fmt.Println("api.NewClient err:", err)
return
}
// 3. 告訴consul, 即将注冊的服務的配置資訊
reg := api.AgentServiceRegistration {
ID:"gz139",
Tags:[]string{"go-micro", "consul"},
Name:service,
Address:"127.0.0.1",
Port:8800,
Check:&api.AgentServiceCheck{
CheckID:"consul go-micro test",
TCP:"127.0.0.1:8800",
Timeout:"1s",
Interval:"5s",
},
}
// 4. 注冊 go-micro 服務到 consul 上
consulClient.Agent().ServiceRegister(®)
//建立新的服務
srv := micro.NewService(
micro.Name(service),
micro.Address("127.0.0.1:8800"),
)
srv.Init()
//初始化方法
if err := pb.RegisterSayHandler(srv.Server(), new(SayServer)); err != nil {
fmt.Println(err)
}
//運作服務
if err := srv.Run(); err != nil {
fmt.Println(err)
}
}
4、編寫client.go
package main
import (
"context"
"fmt"
"github.com/go-micro/plugins/v4/registry/consul"
pb "go-micro-project/service"
"go-micro.dev/v4"
"go-micro.dev/v4/client"
)
var service = "person.server"
func main() {
registry := consul.NewRegistry()
// 執行個體化
srv := micro.NewService(
micro.Client(client.NewClient()),
micro.Registry(registry),
)
//初始化
srv.Init()
// 建立用戶端
c := pb.NewSayService(service, srv.Client())
//調用服務端方法
res,err := c.SayHello(context.TODO(),&pb.SayRequest{Message: "上手微服務"})
if err != nil{
fmt.Println(err)
}
fmt.Println(res.Answer)
}
5、啟動consul:
consul agent -dev
6、啟動server.go服務
7、運作client.go
這節完畢。