gRPC+Consul 示例

一、目录结构

image

二、代码

  • 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())
}

posted @   弩哥++  阅读(69)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示