Go 服务注册--consul

转自:https://blog.csdn.net/qq_29632499/article/details/94621624

此文详细介绍使用consul作为注册中心,实现两个服务之间的通信,这里只用了点到点通信。

1 .安装consul - 注册中心

服务注册中心我们选择consul:

mac:brew install consul

windows:直接官网下载consul.exe可执行程序

 运行consul:启动Consul agent的开发模式:

   consul agent -dev

该命令快速启动一个单节点的consul,且为集群的领袖

查看Consul集群的成员:打开另一个终端执行:

consul members

也可以通过WebUI来查看各service状态:http://localhost:8500/

2 安装micro:微服务管理工具

      micro是以go-micro框架为核心的微服务管理工具,通过它可以方便查看go-micro服务情况。

     在$GOPATH目录下,执行

go get github.com/micro/micro

该命令会在bin目录($GOBIN)下生成micro(.exe)工具
micro命令行工具可以提供诸如服务列表查看、服务详情查看、调用服务接口等功能。

3 安装goprotobuf相关工具:GRPC相关工具

  • protoc:Protobuf(Protocol Buffers - Google's data interchange format)编译器:

    • windows下直接下载 相关win的zip压缩文件(内含protoc.exe)
    • mac: brew install protobuf
  • protoc-gen-go:goprotobuf 提供的 Protobuf 插件:在$GOPATH目录下执行go get github.com/micro/protobuf/{proto,protoc-gen-go},该命令会在bin目录下生成protoc-gen-go(.exe)工具,protoc编译器利用protoc-gen-go插件将.proto文件转换为Golang源文件
  • protoc-gen-micro(Protobuf code generation for micro):在$GOPATH目录下执行go get github.com/micro/protoc-gen-micro,该命令会在bin目录下生成protoc-gen-micro(.exe),protoc编译器利用protoc-gen-micro插件将.proto文件转换为micro代码风格文件

goprotobuf编译参数:

  • -I参数:指定import路径,可以指定多个-I参数,编译时按照顺序查找,不指定时默认查找当前目录
  • --go_out:Golang编译支持,支持以下参数

     
    1. - `plugins=plugin1+plugin2`:指定插件,支持grpc/micro,即:plugins=grpc+micro

    2. - `M`参数:指定导入的.proto文件路径编译后对应的goalng包名(不指定默认.proto文件中import语句路径)

    3. - `import_prefix=xxx`:为所有import路径添加前缀,主要用于编译子目录内的多个proto文件

    4. - `import_path=foo/bar`:指定未声明package或go_package的文件的包名,最右边的斜线前的字符会被忽略

    5.  

4 编写一个简单的Hello服务

至此,go-micro框架的编程环境已基本搭建好,接下来就是写代码了。

下面实现一个Hello服务:它接收一个字符串类型参数请求,返回一个字符串问候语:Hello 『参数值』。
1)定义API

创建helloworld/helloworld.proto文件:
使用protobuf文件来定义服务API接口

 
  1. // The greeting service definition.

  2. service Hello {

  3. rpc SayHello (HelloRequest) returns (HelloReply) {}

  4. }

  5. // The request message containing the user's name.

  6. message HelloRequest {

  7. string name = 1;

  8.  
  9. }

  10. // The response message containing the greetings

  11. message HelloReply {

  12. string message = 1;

  13. }

执行protoc命令,生成当前pb文件的go实现:

protoc  --micro_out=. --go_out=. ./helloworld/helloworld.proto

生成文件如下:

 

2)创建server

创建server/main.go文件:

 
  1. package main

  2.  
  3. import (

  4. proto "awesomeProject/helloworld"

  5. "context"

  6. "fmt"

  7. "github.com/micro/go-micro"

  8. "github.com/micro/go-micro/registry"

  9. "github.com/micro/go-micro/registry/consul"

  10. )

  11.  
  12. type Server struct {

  13. }

  14.  
  15. func (s *Server) SayHello(ctx context.Context, in *proto.HelloRequest, res *proto.HelloReply) error {

  16. fmt.Printf("%s", in.Name)

  17. res.Message="I am a server"

  18. return nil

  19. }

  20.  
  21. func main() {

  22. reg:=consul.NewRegistry(func(options *registry.Options) {

  23. options.Addrs=[]string{"127.0.0.1:8500",}

  24. })

  25. service := micro.NewService(

  26. micro.Registry(reg),

  27. micro.Name("helloworldServer001"), // 服务名称

  28. )

  29. service.Init()

  30. proto.RegisterHelloHandler(service.Server(), new(Server))

  31. if err := service.Run(); err != nil {

  32. fmt.Println(err)

  33. }

  34.  
  35. }

3)模拟client

创建client/main.go文件:

 
  1. package main

  2.  
  3. import (

  4. proto "awesomeProject/helloworld"

  5. "context"

  6. "fmt"

  7. "github.com/micro/go-micro"

  8. "github.com/micro/go-micro/registry"

  9. "github.com/micro/go-micro/registry/consul"

  10. )

  11.  
  12. const ADDRESS = "localhost:50051"

  13.  
  14. func main() {

  15. reg:=consul.NewRegistry(func(options *registry.Options) {

  16. options.Addrs=[]string{

  17. "127.0.0.1:8500",

  18. }

  19. })

  20. service := micro.NewService(micro.Registry(reg),micro.Name("hello.client"))

  21. service.Init()

  22. helloService := proto.NewHelloService("helloworldServer001", service.Client())

  23. res, err := helloService.SayHello(context.TODO(), &proto.HelloRequest{Name: "hellow ,I am Client--001"})

  24. if err != nil {

  25. fmt.Println(err)

  26. }

  27. fmt.Println("----->"+res.GetMessage())

  28. }

5 运行Hello服务

  1. 启动consul 
  2. 执行go run server/main.go命令,启动服务:
 
  1. >go run server/main.go

  2. 2019/07/04 16:06:09 Transport [http] Listening on [::]:62381

  3. 2019/07/04 16:06:09 Broker [http] Connected to [::]:62382

  4. 2019/07/04 16:06:09 Registry [consul] Registering node: helloworldServer001-4ae1c14d-598f-4542-9fb3-cb295d9f00e6

  5.  

  3. 通过浏览器输入再次输入:http://localhost:8500, 查看当前已有服务:

 4. 请求服务  执行 go run client/main.go

     客户端如下:接受到服务端返回I am server

   服务端显示如下:

    

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值