天天看点

如何编写结合consul的go-micro微服务实例

作者:编程自学

consul是微服务中常用的中间件,可以提供注册服务,go-micro是golang的微服务框架,拥有服务端和客户端,默认使用protobuf作为通信协议的定义,consul和go-micro是可以合作的。下面开始吧。

1、编写person.proto文件

如何编写结合consul的go-micro微服务实例
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

如何编写结合consul的go-micro微服务实例

就会生成:

如何编写结合consul的go-micro微服务实例

3、编写服务端:server.go

如何编写结合consul的go-micro微服务实例
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

如何编写结合consul的go-micro微服务实例
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

如何编写结合consul的go-micro微服务实例
如何编写结合consul的go-micro微服务实例

6、启动server.go服务

如何编写结合consul的go-micro微服务实例
如何编写结合consul的go-micro微服务实例

7、运行client.go

如何编写结合consul的go-micro微服务实例

这节完毕。

继续阅读