python eureka服务发现_python与consul 实现gRPC服务注册-发现

背景

通过对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 OrderHandler(test_pb2_grpc.OrderHandlerServicer):

def create_order(self, request, context):

return test(request, context)

def register(server_name, ip, port):

c = consul.Consul() # 连接consul 服务器,默认是127.0.0.1,可用host参数指定host

print(f"开始注册服务{server_name}")

check = consul.Check.tcp(ip, port, "10s") # 健康检查的ip,端口,检查时间

c.agent.service.register(server_name, f"{server_name}-{ip}-{port}",

address=ip, port=port, check=check) # 注册服务部分

print(f"注册服务{server_name}成功")

def unregister(server_name, ip, port):

c = consul.Consul()

print(f"开始退出服务{server_name}")

c.agent.service.deregister(f'{server_name}-{ip}-{port}')

def serve():

server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))

test_pb2_grpc.add_OrderHandlerServicer_to_server(OrderHandler(), server)

server.add_insecure_port('[::]:{}'.format(12006))

register("order_server", "0.0.0.0", 12006)

server.start()

try:

while True:

time.sleep(186400)

except KeyboardInterrupt:

unregister("order_server", "0.0.0.0", 12006)

server.stop(0)

serve()

要运行此服务需要先安装 python-consul pip install python-consul

运行此服务,在浏览器中会出现我们刚刚注册的服务,和可用节点,健康信息,如图

当使用ctrl+c 退出服务时,会取消注册。也就是会从consul列表里消失。

注意: 当健康检测失败时,并不意味着服务有问题,仅表示consul服务器和对应的rpc服务的端口连不上而已

rpc客户端连接

客户端需要向consul服务器请求,得到可用的rpc服务的ip,端口,在进行连接,我们还是基于之前的客户端代码进行修改,完整代码如下:

import grpc

from dns import resolver

from dns.exception import DNSException

import test_pb2_grpc

import test_pb2

# 连接consul服务,作为dns服务器

consul_resolver = resolver.Resolver()

consul_resolver.port = 8600

consul_resolver.nameservers=["127.0.0.1"]

def get_ip_port(server_name):

'''查询出可用的一个ip,和端口'''

try:

dnsanswer = consul_resolver.query(f'{server_name}.service.consul', "A")

dnsanswer_srv = consul_resolver.query(f"{server_name}.service.consul", "SRV")

except DNSException:

return None, None

return dnsanswer[0].address, dnsanswer_srv[0].port

ip, port = get_ip_port("order_server")

channel = grpc.insecure_channel(f"{ip}:{port}")

stub = test_pb2_grpc.OrderHandlerStub(channel)

# 要完成请求需要先构造出proto文件中定义的请求格式

ret = stub.create_order(test_pb2.OrderRequest(phone="12990", price="50"))

print(ret.rst_string)

总结

至此,我们已经搭建好了一套简单服务注册-发现系统。当然consul的功能远不止这一点,它还支持分布式,多节点部署。需要了解更多,可以去官网做进一步了解。

踩过的坑

在示例中,我们只捕获了ctrl+c 信号,在实际中,服务会因为一些奇怪的问题宕掉,而此时,该节点信息会一直在consul里面,除非手动注销,所以需要捕获所有异常信号。

单节点的时候,consul服务挂掉会影响所有相关的项目,所以最好还是有从节点。

服务注册发现、配置中心集一体的 Spring Cloud Consul

前面讲了 Eureka 和 Spring Cloud Config,今天介绍一个全能选手 「Consul」.它是 HashiCorp 公司推出,用于提供服务发现和服务配置的工具.用 go 语言开发,具 ...

基于 Consul 实现 MagicOnion(GRpc) 服务注册与发现

0.简介 0.1 什么是 Consul Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置. 这里所谓的服务,不仅仅包括常用的 Api 这些服务,也包括软件开发过程 ...

微服务学习笔记(2)——使用Consul 实现 MagicOnion(GRpc) 服务注册和发现

原文:微服务学习笔记(2)--使用Consul 实现 MagicOnion(GRpc) 服务注册和发现 1.下载打开Consul 笔者是windows下面开发的(也可以使用Docker). 官网下载w ...

Docker+Consul+Registrator 实现服务注册与发现

Docker+Consul+Registrator实现服务注册与发现 逻辑图 实现nginx节点自动化加入容器IP代理 1.三台Consul agent server作为高可用通过Consul Tem ...

服务注册发现consul之二:在Spring Cloud中使用Consul实现服务的注册和发现

首先安装consul环境,参照之前的文章:中的第一节介绍. Spring Cloud使用Consul的服务与发现 1.导入依赖pri ...

spring cloud微服务快速教程之(七) Spring Cloud Alibaba--nacos(一)、服务注册发现

0.前言 什么是Spring Cloud Alibaba? Spring Cloud Alibaba 是阿里开源的,致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用微服务的必需组件,方便 ...

Spring-cloud &; Netflix 源码解析:Eureka 服务注册发现接口 ****

http://www.idouba.net/spring-cloud-source-eureka-client-api/?utm_source=tuicool&utm_medium=refer ...

服务注册发现Eureka之二:高可用服务注册中心

前言 在Spring Cloud系列文章的开始,我们就介绍了服务注册与发现,其中,主要演示了如何构建和启动服务注册中心Eureka Server,以及如何将服务注册到Eureka Server中,但是 ...

服务注册发现Eureka之三:Spring Cloud Ribbon实现客户端负载均衡(客户端负载均衡Ribbon之三:使用Ribbon实现客户端的均衡负载)

在使用RestTemplate来消费spring boot的Restful服务示例中,我们提到,调用spring boot服务的时候,需要将服务的URL写死或者是写在配置文件中,但这两种方式,无论哪一 ...

随机推荐

python set

set是一个工厂函数(filter也是工厂函数),是一个可变的集合 frozenset 不可变的集合,与set共性,他也在内部自动去重, >>> num5=frozenset([1, ...

C++学习笔记 指针与引用

指针与引用  1. 指针 (1) 指针是一个变量(实体),存储的是一个地址,指向内存的一个存储单元,指针可以为空 (2) 指针可以为空,在声明定义时可以不初始化 (3) 指针在初始化之后可以重新指向其 ...

洛谷P1889 士兵站队

题目描述 在一个划分成网格的操场上, n个士兵散乱地站在网格点上.由整数 坐标 (x,y) 表示.士兵们可以沿网格边上.下左右移动一步,但在同时刻任一网格点上只能有名士兵.按照军官的命令,们要整齐地列 ...

perl小记

perl是一种运行式脚本,所以在debug的时候,多用print,在后台看有没有输出相关的结果,来判断相应的错误. 部分perl正则表达式: $gene =~/^LOC/  以“LOC”开头的字符串 ...

POJ 3903 Stock Exchange

Stock Exchange Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2954   Accepted: 1082 De ...

golang面向对象初识

struct是变量的集合 interface是方法的集合 struct与interface都支持匿名字段, 换言之, 支持组合实现继承. golang的struct与C++的class一样, 只能声明 ...

mysql 重置root 账户密码

windows: 打开命令行窗口,停止mysql服务:        Net stop mysql启动mysql,一般到mysql的安装路径,找到 mysqld-nt.exe <<< ...

通过HttpClient来调用Web Api接口

回到目录 HttpClient是一个被封装好的类,主要用于Http的通讯,它在.net,java,oc中都有被实现,当然,我只会.net,所以,只讲.net中的HttpClient去调用Web Api ...

Servlet的学习之ServletContext(1)

本篇来介绍Servlet中非常重要的对象,如ServletConfig类和ServletContext类,尤其是ServletContext类中的一些方法,本篇先讲述一部分,在下一篇中继续补充. 在对 ...

Semaphore 源码分析

Semaphore 源码分析 1. 在阅读源码时做了大量的注释,并且做了一些测试分析源码内的执行流程,由于博客篇幅有限,并且代码阅读起来没有 IDE 方便,所以在 github 上提供JDK1.8 的 ...

你可能感兴趣的:(python,eureka服务发现)