本文用到的语言是golang
consul是用docker搭建的 端口8500
先启动consul,并在本地打开http://localhost:8500
- 因为是rpc服务,所以先编写proto文件
syntax = "proto3";
option go_package = "./;pb";
package pb;
message Person {
string name=1;
int32 age=2;
}
//添加rpc服务
service hello {
rpc sayHello(Person) returns (Person);
}
然后使用命令行编译生成pb.go文件
protoc --go_out=plugins=grpc:./ *.proto
2、然后编写server文件与client文件
server.go文件如下
package main
import (
"consul/pb"
"context"
"fmt"
"github.com/hashicorp/consul/api"
"google.golang.org/grpc"
"net"
)
type Hello struct {
}
func (this *Hello) SayHello(ctx context.Context, p *pb.Person) (*pb.Person, error) {
fmt.Println(p)
p.Name = "Hello " + p.Name
return p, nil
}
func main() {
//注册到consul上
//1.初始化consul配置
consulConfig := api.DefaultConfig()
//2.创建consul对象
consulClient, err_consul := api.NewClient(consulConfig)
if err_consul != nil {
fmt.Println("consul创建对象报错:", err_consul)
return
}
//3.告诉consul即将注册到服务到信息
reg := api.AgentServiceRegistration{
Tags: []string{"aa", "bb"},
Name: "Hello",
Address: "127.0.0.1",
Port: 8600,
Check: &api.AgentServiceCheck{
TCP: "127.0.0.1:8600",
Interval: "5s",
Timeout: "1s",
},
}
//4.注册grpc服务到consul上
err_agent := consulClient.Agent().ServiceRegister(®)
if err_agent != nil {
fmt.Println("consul注册grpc失败:", err_agent)
return
}
//-----------------------grpc代码----------------------------------
//1、初始化grpc对象
grpcServer := grpc.NewServer()
//2、注册服务
pb.RegisterHelloServer(grpcServer, new(Hello))
//3、设置监听
listien, err := net.Listen("tcp", "127.0.0.1:8600")
if err != nil {
fmt.Println("监听报错:", err)
return
}
defer listien.Close()
//4、启动服务
fmt.Println("服务启动成功。。。")
err_grpc := grpcServer.Serve(listien)
if err_grpc != nil {
fmt.Println("grpc服务启动报错:", err)
return
}
}
client文件如下
package main
import (
"consul/pb"
"context"
"fmt"
"github.com/hashicorp/consul/api"
"google.golang.org/grpc"
"strconv"
)
func main() {
//1.初始化consul配置
consulConfig := api.DefaultConfig()
//2.创建consul对象
consulClient, err_consul := api.NewClient(consulConfig)
if err_consul != nil {
fmt.Println("consul创建对象报错:", err_consul)
return
}
//3.从consul上拿去一个健康的服务
service, _, err_service := consulClient.Health().Service("Hello", "aa", true, nil)
if err_service != nil {
fmt.Println("获取健康服务报错:", err_consul)
return
}
fmt.Println(service[0].Service)
s := service[0].Service
address := s.Address + ":" + strconv.Itoa(s.Port)
//链接grpc服务
grpcConn, _ := grpc.Dial(address, grpc.WithInsecure())
//初始化客户端
grpcClient := pb.NewHelloClient(grpcConn)
//假数据测试
var person pb.Person
person.Name = "张三"
person.Age = 26
//点用远程函数
p, _ := grpcClient.SayHello(context.TODO(), &person)
fmt.Println(p)
}
运行server文件可在consul页面发现注册成功。
运行client文件可发现正常返回。