Go Micro 使用 consul 服务注册和发现

在构建微服务时,使用服务注册和发现可以减少配置的复杂性。

注册机制提供了一个服务发现机制来将名称解析为地址。它可以由consul,etcd,zookeeper,dns,gossip等提供支持。一个服务应该在启动时使用注册机制进行注册,并在关闭时取消注册。

Go Micro 支持 consul、etcd、dns 多种方式进行服务注册和发现,默认使用 mdns。

consul 是一个分布式一致性的 key-value 存储技术, 被用来做配置共享和服务发现。

 

1. 运行 consul

consul 在开发或者测试环境中,可以直接使用 docker 运行。

docker run --name consul -d -p 8500:8500 consul agent -server -ui -bootstrap-expect=1 -client=0.0.0.0

可以通过浏览器直接管理 consul,地址为:http://localhost:8500。

 

2. Go Micro 服务注册

Go Micro 的 RPC 微服务,使用 consul 作为服务注册的方法如下:

package main

import (
    "context"
    "github.com/micro/go-micro"
    "github.com/micro/go-micro/registry"
    "github.com/micro/go-micro/util/log"
    "github.com/micro/go-plugins/registry/consul"
    "hello/proto/hello"
)

func main() {
    // 创建 consul 服务注册项,其中 192.168.3.25:2379 为 consul 服务地址。
    // consul 服务地址按照实际情况填写
    reg := consul.NewRegistry(registry.Addrs("192.168.3.25:2379"))

    // 创建一个新的服务,服务名为 go.micro.srv.hello
    service := micro.NewService(
        micro.Name("go.micro.srv.hello"),
        micro.Version("latest"),
        // 使用服务注册插件
        micro.Registry(reg),
    )

    // 通过命令行参数或者插件初始化服务
    service.Init()

    // Use the generated client stub
    // 通过客户端的桩创建 go.micro.srv.hello 服务客户端
    helloService := hello.NewHelloService("go.micro.srv.hello",service.Client())

    // Make request
    // 调用 RPC Call 方法
    response, err := helloService.Call(context.Background(), &hello.Request{
        Name: "codebaoku",
    })
    if err != nil {
        log.Error(err)
        return
    }

    // Print result
    // 打印 RPC Call 调用结果
    log.Info(response.Msg)
}

 

3. Go Micro 服务发现

Go Micro 客户端,可以通过服务发现使用注册在 consul 的 RPC 微服务:

package main
import (
    "context"
    "github.com/micro/go-micro"
    "github.com/micro/go-micro/registry"
    "github.com/micro/go-plugins/registry/consul"
    "github.com/micro/go-micro/util/log"
    "hello/proto/hello"
)

func main() {
    // 创建 consul 服务注册项,其中 192.168.3.25:2379 为 consul 服务地址。
    // consul 服务地址按照实际情况填写
    reg := consul.NewRegistry(registry.Addrs("192.168.3.25:2379"))

    // Create a new service
    // 创建一个新的服务,服务名为 go.micro.srv.hello
    service := micro.NewService()

    // Parse command line flags
    // 使用服务注册插件初始化服务
    service.Init(micro.Registry(reg))

    // Use the generated client stub
    // 通过客户端的桩创建 go.micro.srv.hello 服务客户端
    helloService := hello.NewHelloService("go.micro.srv.hello",service.Client())

    // Make request
    // 调用 RPC Call 方法
    response, err := helloService.Call(context.Background(), &hello.Request{
        Name: "codebaoku",
    })
    if err != nil {
        log.Error(err)
        return
    }

    // Print result
    // 打印 RPC Call 调用结果
    log.Info(response.Msg)
}

Go Micro API 服务是对 SRV RPC服务的封装,它将请求装换为 RPC 请求转给 SRV RPC 服务,并将 SRV RPC 的处理结果返回客户端。我们可以使用 Go Micro 的 micro ...