背景
通过对gRPC的介绍我们知道,当正常启动服务后,我们只需要知道ip,port就可以进行gRPC的连接。可以想到,这种方式并不适合用于线上环境,因为这样直连的话就失去了扩展性,当需要多机部署的时候,就无法在线上环境直接使用,而且当线上项目连接的那台服务器宕了的话,整个项目也会出错,这并不是我们想要的结果。
于是,我们需要一个服务注册与发现的机制。也就是说当我们的rpc服务启动的时候注册到另一个服务器,然后客户端连接的时候去查找对应的服务,得到相应的ip,port,然后就可以顺利进行连接了。这种方式也就是服务注册与发现,目前有zoomkeper, consul, 因为自己对zookeeper不熟悉,所以这里选用consul。整个流程如图所示
consul 的安装
通过docker
运行如下命令:
docker run -d -p 8500:8500 consul consul agent -data-dir=/consul/data -config-dir=/consul/config -dev -client=0.0.0.0 -bind=0.0.0.0
通过其它方式
安装方式参考https://www.consul.io/intro/getting-started/install.html
安装完后运行:
consul agent --data-dir . -server -ui -bootstrap -bind=127.0.0.1
无论哪种方式,运行完之后在浏览器中打开 http://127.0.0.1:8500/ui, 可以看到如下内容
服务注册
已之前介绍的gRPC代码为基础,我们加入服务注册部分(注:本人环境为python3, 需要python2的,自己进行修改)
import time
import grpc
import consul
import json
from concurrent import futures
import test_pb2_grpc
import test_pb2
def test(request, context):
# 实际调用到的函数
json_response = test_pb2.JSONResponse()
json_response.rst_string = json.dumps({"ret":"Hi gRPC"})# 构造出proto文件中定义的返回值格式
return json_response
class Or