首页

go-micro中如何修改consul默认地址

Go Micro是一个可插拔的RPC框架,用于分布式系统开发。它提供的默认值,使得用户能快速开始开发,比如默认的服务发现是consul,默认是同一台机器,当然在生产环境,服务与服务发现部署到同一机器,这不是很好的实践,所以把consu机器独立出来就很有必要了。本文就提供了,自定义consul配置的实践样例。

我们能在Go Micro的官方github上可以看见几个不同的仓库,除了Go Micro以外,还有其他的:

micro:它是一个工具箱,方便客户端使用的一些列封装
go-plugins:一系列插件
go-grpc:它与go-micro微服务不一样,虽然同为rpc微服务


今天我们只关注go-micro,go-grpc,我们也只下载这两个包就够了,一个micro的微服务,一个grpc的微服务。

1. 安装
> go get github.com/golang/protobuf/proto
> go get github.com/golang/protobuf/protoc-gen-go
> go get github.com/micro/protoc-gen-micro
> go get github.com/micro/go-grpc
> go get github.com/micro/go-micro

下载后的目录结构。国内网络可能无法访问下面两个网站(golang.org/google.golang.org),但是在下载包的时候会关联下载这两个网站下面的包,建议是购买一个香港云服务器,在上面安装go运行时,然后下载,复制到本地。我也是购买了一个2核心,4G的云服务器,用完释放,花费大家2元钱以内,还算方便。


2. 定义一个proto文件
syntax = "proto3";
package helloworld;

service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}

确定下protoc等几个exe文件是否都在环境变量,micro.exe是本次用不着的exe文件,其他的就必须要有



执行protoc命令生成两个go文件,helloworld.micro.go && helloworld.pb.go
> protoc --proto_path=src/helloworld/proto/ --micro_out=src/helloworld/proto --go_out=src/helloworld/proto src/helloworld/proto/helloworld.proto


这里包含了3个执行文件,在正式的环境中最好不要这样,我这里是演示,但是他们可以都执行,而并不冲突,启动两个微服务,然后再执行客服端调用。

3. 写一个go-micro服务,server.go
    package main

    import (
        "context"
        "fmt"
        proto "helloworld/proto"
        micro "github.com/micro/go-micro"
        "github.com/micro/go-micro/registry"
        "github.com/micro/go-micro/registry/consul"
    )

    type Greeter struct{}

    func (s *Greeter) SayHello(ctx context.Context, req *proto.HelloRequest, rsp *proto.HelloReply) error {
        rsp.Message = "Hello " + req.Name
        return nil
    }

    func main() {
        // 修改consul地址,如果是本机,这段代码和后面的那行使用代码都是可以不用的
        reg := consul.NewRegistry(func(op *registry.Options){
            op.Addrs = []string{
                "192.168.111.129:8500",
            }
        })
        
        service := micro.NewService(
            micro.Registry(reg),
            micro.Name("helloworld"),
        )

        service.Init()
        proto.RegisterGreeterHandler(service.Server(), new(Greeter))
        if err := service.Run(); err != nil {
            fmt.Println(err)
        }
    }

本来consul是默认的,但是地址是127.0.0.1:8500,生产环境常常不是这个地址。修改consul的地址,只要导入两个对象,consul+registry,然后在创建对象时,注册进去,非常简单,官方网站有个etcd的例子。

4. 写一个go-micro客户端,client.go
    package main

    import (
        "context"
        "fmt"

        micro "github.com/micro/go-micro"
        proto "helloworld/proto"

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


    func main() {
        reg := consul.NewRegistry(func(op *registry.Options){
            op.Addrs = []string{
                "192.168.111.129:8500",
            }
        })

        service := micro.NewService(micro.Registry(reg),micro.Name("greeter.client"))
        service.Init()
        greeter := proto.NewGreeterService("helloworld", service.Client())
        rsp, err := greeter.SayHello(context.TODO(), &proto.HelloRequest{Name: "John, how are you?"})
        if err != nil {
            fmt.Println(err)
        }

        fmt.Println(rsp.Message)
    }

客户端调用,同样需要注册consul的地址,这里会自动做负载均衡,对用户是透明的,通过服务名helloworld来找到对应服务。

5. 写一个go-grpc的服务,main.go
    package main

    import (
        "context"
        "log"

        "github.com/micro/go-micro/registry"
        "github.com/micro/go-micro/registry/consul"
        "github.com/micro/go-grpc"
        "github.com/micro/go-micro"
        proto "helloworld/proto"
    )

    type Greeter struct{}

    func (s *Greeter) SayHello(ctx context.Context, req *proto.HelloRequest, rsp *proto.HelloReply) error {
        rsp.Message = "Hello " + req.Name
        return nil
    }

    func main() {
        // 修改consul地址,如果是本机,这段代码和后面的那行使用代码都是可以不用的
        reg := consul.NewRegistry(func(op *registry.Options){
            op.Addrs = []string{
                "192.168.111.129:8500",
            }
        })

        service := grpc.NewService(
            micro.Registry(reg),
            micro.Name("greeter"),
        )

        service.Init()

        proto.RegisterGreeterHandler(service.Server(), new(Greeter))

        if err := service.Run(); err != nil {
            log.Fatal(err)
        }
    }

6. grpc的客户端
grpc的客户端可以用nodejs来写,非常方便,我的上篇文章有介绍:https://www.hrefs.cn/article/koa-gRPC-client

上面的代码都准备好了,还差点什么呢,就是consul服务还没有部署,这个时候还是不能启动的,我们去官网下载一个consul,https://www.consul.io/,下载下来就是一个单文件,启动:
consul agent -dev


7. 启动测试
> go run server.go


看看consul,下面多了一个helloworld服务,说明服务启动成功


执行客户端调用,如下:
> go run client.go
Hello John, how are you?

总结:go-micro框架在企业级应用上比较流行,它使用起来也非常简单,要深入理解,还可以参考官方文档,甚至看源码。这里通过启动一个micro服务,然后注册到consul;客户端连接consul,拿到微服务地址,然后发送请求。
from 爱施园
Posted by 森林 on 2018/10/15
Copyright ©2018 爱施园 粤ICP备14091834号