前言
本文章主要是告知如何通过consul和grpc实现服务的注册和发现、注销,没有涉及到相关插件,库的安装,提供给对微服务有一定了解的人学习借鉴。
1. .proto的实现
定义了一个Say服务,请求参数为Animal,返回参数为Bark
syntax = "proto3";
option go_package="./;pd";
package pd;
message Animal{
string name = 1;
int32 age = 2;
}
message Bark{
string context = 1;
}
service Say{
rpc sayEnglish(Animal) returns(Bark);
}
2. consul使用的是github.com/hashicorp/consul/包,下载命令如下:
go get -u -v github.com/hashicorp/consul
3. server端实现
package main
import (
"context"
"fmt"
"github.com/hashicorp/consul/api"
"google.golang.org/grpc"
"microservices/pd"
"net"
)
type SayServer struct {
}
func (this *SayServer)SayEnglish(cxt context.Context, dog *pd.Animal) (*pd.Bark, error) {
reply := &pd.Bark{
Context : dog.Name + " Say:Hello World!",
}
return reply, nil
}
func main() {
//初始化consul配置
consulConfig := api.DefaultConfig()
//获取consul客户端
consulClient, err := api.NewClient(consulConfig)
if err != nil{
fmt.Println("api.NewClient:", err)
}
//服务注册配置
registerConfigInfo := api.AgentServiceRegistration{
ID: "001",
Tags: []string{"Say", "Dog"},
Name: "SayServer",
Address: "127.0.0.1",
Port: 8800,
Check: &api.AgentServiceCheck{
CheckID: "grpc test",
TCP:"127.0.0.1:8800",
Timeout:"5s",
Interval:"5s",
},
}
//注册到consul
consulClient.Agent().ServiceRegister(®isterConfigInfo)
//---------------------------grpc服务----------------------
//获取grpc服务
grpcServer := grpc.NewServer()
//注册服务
pd.RegisterSayServer(grpcServer, new(SayServer))
//设置服务器监听
lis, err := net.Listen("tcp", "127.0.0.1:8800")
if err != nil {
fmt.Println("net.Listen:", err)
}
fmt.Println("服务启动...")
grpcServer.Serve(lis)
}
4. client端实现
package main
import (
"context"
"fmt"
"github.com/hashicorp/consul/api"
"google.golang.org/grpc"
"microservices/pd"
"strconv"
)
func main() {
consulConfig := api.DefaultConfig()
consulClient, err := api.NewClient(consulConfig)
if err != nil{
fmt.Println("api.NewClient:", err)
}
services, _, err := consulClient.Health().Service("SayServer", "Say", true, nil)
//获取链接
addr := services[0].Service.Address + ":" + strconv.Itoa(services[0].Service.Port)
//-------------------grpc-----------------
clientConn, err := grpc.Dial(addr, grpc.WithInsecure())
if err != nil{
fmt.Println("grpc.Dial:", err)
}
defer clientConn.Close()
client := pd.NewSayClient(clientConn)
reply, err := client.SayEnglish(context.TODO(), &pd.Animal{Name: "旺财", Age: 3})
if err !=nil{
fmt.Println("client.SayEnglish:", reply)
}
fmt.Println("reply:", reply)
}