gRPC+Consul 示例
一、目录结构
二、代码
- hello.proto
syntax = "proto3";
package pb;
option go_package="./pb";
message HelloRequest{
string name=1;
}
message HelloResponse{
string msg=1;
}
service HelloWorld{
rpc Hello(HelloRequest) returns(HelloResponse);
}
- server/main.go
package main
import (
"consulProject/pb"
"context"
"fmt"
"github.com/hashicorp/consul/api"
"google.golang.org/grpc"
"net"
)
type Greet struct {
pb.UnimplementedHelloWorldServer
}
func (g *Greet) Hello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) {
req.Name += "day day up"
return &pb.HelloResponse{Msg: req.Name}, nil
}
func main() {
//consul服务发现
//1.初始化consul配置
consulConfig := api.DefaultConfig()
//2.初始化consul对象
consulObj, err := api.NewClient(consulConfig)
if err != nil {
fmt.Println("初始化consul对象失败")
fmt.Println(err)
return
}
//3.告诉consul,即将要注册到consul上服务配置信息
h := api.AgentServiceRegistration{
ID: "hello ID",
Port: 9999,
Name: "hello world fight",
Tags: []string{"hello", "fight"},
}
//4.把grpc服务注册到consul
consulObj.Agent().ServiceRegister(&h)
//=======以下是grpc服务=======
//创建grpc服务器
grpcServer := grpc.NewServer()
//注册grpc服务, 绑定对象
pb.RegisterHelloWorldServer(grpcServer, new(Greet))
//开启监听
listener, err := net.Listen("tcp", "127.0.0.1:9999")
if err != nil {
fmt.Println("监听失败")
fmt.Println(err)
return
}
defer listener.Close()
fmt.Println("==============开启监听==============")
//启动服务
grpcServer.Serve(listener)
}
- client/main.go
package main
import (
"consulProject/pb"
"fmt"
"github.com/hashicorp/consul/api"
"golang.org/x/net/context"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
)
func main() {
//consul服务发现
//1.初始化consul配置
consulConfig := api.DefaultConfig()
//2.初始化consul对象
consulObj, _ := api.NewClient(consulConfig)
service, _, err := consulObj.Health().Service("hello world fight", "fight", true, nil)
if err != nil {
fmt.Println(err)
}
port := service[0].Service.Port
fmt.Printf("端口号是%v\n", port)
//
//与grpc建议连接
grpcClient, err := grpc.Dial(fmt.Sprintf("127.0.0.1:%d", port), grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
fmt.Println("建立连接失败")
return
}
defer grpcClient.Close()
//初始化grpc服务客户端
conn := pb.NewHelloWorldClient(grpcClient)
//调用远程服务
res, err := conn.Hello(context.TODO(), &pb.HelloRequest{Name: "张三"})
if err != nil {
fmt.Println("服务调用失败")
}
fmt.Println(res.GetMsg())
}
本文来自博客园,作者:弩哥++,转载请注明原文链接:https://www.cnblogs.com/bangbangzoutianya/p/17395150.html
分类:
gRPC
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)