好记性不如烂笔头。

etcd+gRPC 服务注册与服务发现微服务网关的实现

去etcd官网下载对应的包,解压进入etcd-v3.4.7-linux-amd64,使用etcd命令启动,需要指定本机ip地址,不指定的话,默认是127.0.0.1,会导致其它局域网电脑访问不通

./etcd --advertise-client-urls 'http://10.1.1.248:2379' --listen-peer-urls 'http://10.1.1.248:2380' --listen-client-urls 'http://10.1.1.248:2379'

到这里,服务端已经启动正常了,接下来,实现客户端的服务注册与服务发现,新建一个grpc的服务并尝试启动它,关于grpc proto协议文件使用,如何生成pb.go文件,不在这里说了,不了解grpc的,自己先行了解

这时候会有个错误,提示undefined:xxxx,查了下原因,是由于使用了高版本的grpc包导致,这里使用的是v1.29.1,将v1.29.1替换成v1.26.0

执行以下命令,替换版本号

go get -u google.golang.org/grpc@v1.26.0

版本号已经变成v1.26.0了,有的同学可能会遇到,不管怎么执行go get 更换版本号,在go build或者go run命令后,发现grpc的版本号又会恢复成原来的版本,这里可以用replace来强制替换

到这里应该能正常启动服务了,运行go run main.go,将挂起一个服务

测试端口通不通,windows下使用telnet命令,出现下面这种情况,说明端口是通的

如果没有telnet命令,说明电脑没有开启这个功能,可以在控制面板》程序和功能》启用或关闭Windows功能中开启

到这里,etcd+grpc的服务注册已经完成了,接下来做服务发现,新建个client的项目,将service中生成的pb.go文件拷过来

hello.pb.go此文件是grpc server服务端生成的文件,不能手动编辑更改,由工具生成,服务端与客户端的pb文件,需要保持一至,否则会导致服务不通

完成服务发现后,直接运行main.go,会得到从服务端调用的结果

注意的地方:

从etcd官方文档的demo代码,并不能直接支持,他们用了不同的包,这些包有点混,下面是官方提供的代码段,发现并不能执行,原因是NewFromURL得到的是*clientv3.Client,GRPCResolver 接收的是*etcd.Client,使用了不同的包导致,官方使用的是这两个包有问题
go.etcd.io/etcd/clientv3
go.etcd.io/etcd/clientv3/naming

 负载均衡

循环调用,3台机器做负载,停掉其中一台,能在毫秒级切换,感觉速度还是不错的

示例demo已上传到github

https://github.com/maybgit/etcd-grpc-demo