热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python3和grpc的微服务探索实践

对于微服务的实践,一般都是基于Java和Golang的,博主最近研究了下基于Python的微服务实践,现在通过一个简单的服务来分析Python技术栈的微服务实践技术栈:Python3+grpc

对于微服务的实践,一般都是基于Java和Golang的,博主最近研究了下基于Python的微服务实践,现在通过一个简单的服务来分析Python技术栈的微服务实践

技术栈:Python3 + grpc + Zookeeper

服务API:通过学科获取相应的题型

grpc:由Google公司开源的高性能RPC框架,消息协议使用Google自家开源的Protocol Buffers协议机制,传输使用HTTP2.0标准,支持双向流和连接多路复用

 Protocol Buffers部分:

syntax = "proto3"; message Subject { string name = 1; } message QuestionType { string name = 1; } service SimpleRpcServer { // server streaming rpc // 客户端发送学科,服务端多次返回该学科包含的题型 rpc GetSubjectQuestionTypes (Subject) returns (stream QuestionType) { } }

这里定义grpc的接口类型为服务器流式RPC,即客户端发起一次请求,服务器可以返回多个响应信息,典型的例子有:客户端向服务端发送一个股票代码,服务端就把该股票的实时数据源源不断的返回给客户端:

 

通过protobuf编译器和Protocol Buffers生成代码:

python3 -m grpc_tools.protoc -I. --python_out=.. --grpc_python_out=.. simple_calculate.proto

 

服务端开启服务器,对外提供rpc调用流程:

 

 

客户端rpc调用流程:

Zookeeper服务注册与发现策略:

服务注册:

 1 def register_zk(host, port):  2     """
 3  注册到zookeeper  4     """
 5     zk = KazooClient(hosts='{host}:{port}'.format(  6         host=settings_info["zookeeper"]["host"],  7         port=settings_info["zookeeper"]["port"])  8  )  9  zk.start() 10     zk.ensure_path('/rpc_calc')  # 创建根节点
11     value = json.dumps({'host': host, 'port': port}) 12 
13     # 创建服务子节点
14  zk.create( 15         '/rpc_calc/calculate_server', 16  value.encode(), 17         ephemeral=True, 18         sequence=True 19     )

服务治理发现:

 1     def _get_servers(self, event=None):  2         """
 3  从zookeeper获取服务器地址信息列表  4         """
 5         servers = self._zk.get_children(  6             '/rpc_calc', watch=self._get_servers  7  )  8         print(servers)  9         self._servers = [] 10         for server in servers: 11             data = self._zk.get('/rpc_calc/' + server)[0] 12             if data: 13                 addr = json.loads(data.decode()) 14  self._servers.append(addr) 15 
16     def get_server(self): 17         """
18  随机选出一个可用的服务器 19         """
20         return random.choice(self._servers)

 

服务端实现代码:

 1 class SimpleRpcServerServicer(calculate_grpc.SimpleRpcServerServicer):  2     """
 3  实现被调用方法的具体代码  4     """
 5 
 6     def __init__(self):  7         self.subject_question_type_db = {  8             'Chinese': ['单选', '多选', '填空', '解答', '问答', '作文'],  9             'Math': ['单选', '填空', '解答'], 10             'English': ['单选', '填空', '作文'], 11             'Physics': ['单选', '多选', '填空', '解答'], 12             'Chemistry': ['单选', '多选', '填空', '解答'], 13             'Biology': ['单选', '多选', '填空', '解答'], 14             'History': ['单选', '多选', '填空', '解答', '问答'] 15  } 16 
17     def GetSubjectQuestionTypes(self, request, context): 18         """
19  服务器流式RPC调用 根据subject获取question_types 20  :param request: 21  :param context: 22  :return: 23         """
24         subject = request.name 25         question_types = self.subject_question_type_db.get(subject) 26         for question_type in question_types: 27             yield calculate_pb2.QuestionType(name=question_type)

 

客户端实现代码:

 1 def invoke_get_subject_question_types(stub):  2     """
 3  根据学科获取题型  4  Server Streaming RPC 服务器流式RPC 客户端发送,服务器响应多个  5  :param stub:  6  :return:  7     """
 8     subject = calculate_pb2.Subject(name='Chinese')  9     question_types = stub.GetSubjectQuestionTypes(subject) 10     for question_type in question_types: 11         print(question_type.name)

 

服务测试:

开启三个服务,地址分别是 host:8003  host:8005  host:8009,客户端开启两个,client1 和 client2 ,测试结果:

 

已经成功注册了三个server到Zookeeper,客户端1使用的是8003端口的server,客户端2使用的是8005端口的server;grpc框架对于完整的rpc实现来说,实质上是封装了 网络传输、数据协议的打包解包,使得实现rpc更加简单,其本质仍然是遵守rpc的实现原理的

完整的代码详见我的git:simple_calculate_service


推荐阅读
  • #python没有类似于java和C#的接口类(interface),需要使用抽象类和抽象方法来实现接口功能#!usrbinenvpython#_*_coding ... [详细]
  • SOA架构理解理解SOA架构,了解ESB概念,明白SOA与微服务的区别和联系,了解SOA与热门技术的结合与应用。1、面向服务的架构SOASOA(ServiceOrien ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • 精讲代理设计模式
    代理设计模式为其他对象提供一种代理以控制对这个对象的访问。代理模式实现原理代理模式主要包含三个角色,即抽象主题角色(Subject)、委托类角色(被代理角色ÿ ... [详细]
  • 开发笔记:读《分布式一致性原理》JAVA客户端API操作2
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了读《分布式一致性原理》JAVA客户端API操作2相关的知识,希望对你有一定的参考价值。创 ... [详细]
  • Java开发面试问题,2021网易Java高级面试题及答案,实战案例
    前言大厂面试真题向来都是各大求职者的最佳练兵场,而今天小编带来的便是“HUAWEI”面经!这是一次真实的面试经历,虽然不是我自己亲身经历 ... [详细]
  • 分布式大型互联网企业架构!
    2019独角兽企业重金招聘Python工程师标准摘要:开发工具1.EclipseIDE:采用Maven项目管理,模块化。2.代码生成: ... [详细]
  • 新手学习java中,Java新手
    本文目录一览:1、java初学者怎么入门2、新 ... [详细]
  • 本文为转载,原连接:https:www.zhihu.comquestion40822826简单说一下吧做要解释这些要从netconf说起。netconf ... [详细]
  • 阿里首席架构师科普RPC框架
    RPC概念及分类RPC全称为RemoteProcedureCall,翻译过来为“远程过程调用”。目前,主流的平台中都支持各种远程调用技术,以满足分布式系统架构中不同的系统之间的远程 ... [详细]
  • 一直没有对java中的一些图像概念进行区分,一下子区分的太多了会乱,这么先来个简单的吧:ImageIO可以把一个图片转换成Buffered ... [详细]
author-avatar
益达怡君33
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有