对于微服务的实践,一般都是基于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服务注册与发现策略:

服务注册:

 def register_zk(host, port):
"""
注册到zookeeper
"""
zk = KazooClient(hosts='{host}:{port}'.format(
host=settings_info["zookeeper"]["host"],
port=settings_info["zookeeper"]["port"])
)
zk.start()
zk.ensure_path('/rpc_calc') # 创建根节点
value = json.dumps({'host': host, 'port': port}) # 创建服务子节点
zk.create(
'/rpc_calc/calculate_server',
value.encode(),
ephemeral=True,
sequence=True
)

服务治理发现:

     def _get_servers(self, event=None):
"""
从zookeeper获取服务器地址信息列表
"""
servers = self._zk.get_children(
'/rpc_calc', watch=self._get_servers
)
print(servers)
self._servers = []
for server in servers:
data = self._zk.get('/rpc_calc/' + server)[0]
if data:
addr = json.loads(data.decode())
self._servers.append(addr) def get_server(self):
"""
随机选出一个可用的服务器
"""
return random.choice(self._servers)

服务端实现代码:

 class SimpleRpcServerServicer(calculate_grpc.SimpleRpcServerServicer):
"""
实现被调用方法的具体代码
""" def __init__(self):
self.subject_question_type_db = {
'Chinese': ['单选', '多选', '填空', '解答', '问答', '作文'],
'Math': ['单选', '填空', '解答'],
'English': ['单选', '填空', '作文'],
'Physics': ['单选', '多选', '填空', '解答'],
'Chemistry': ['单选', '多选', '填空', '解答'],
'Biology': ['单选', '多选', '填空', '解答'],
'History': ['单选', '多选', '填空', '解答', '问答']
} def GetSubjectQuestionTypes(self, request, context):
"""
服务器流式RPC调用 根据subject获取question_types
:param request:
:param context:
:return:
"""
subject = request.name
question_types = self.subject_question_type_db.get(subject)
for question_type in question_types:
yield calculate_pb2.QuestionType(name=question_type)

客户端实现代码:

 def invoke_get_subject_question_types(stub):
"""
根据学科获取题型
Server Streaming RPC 服务器流式RPC 客户端发送,服务器响应多个
:param stub:
:return:
"""
subject = calculate_pb2.Subject(name='Chinese')
question_types = stub.GetSubjectQuestionTypes(subject)
for question_type in question_types:
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

python3和grpc的微服务探索实践的更多相关文章

  1. 基于 Docker 的微服务架构实践

    本文来自作者 未闻 在 GitChat 分享的{基于 Docker 的微服务架构实践} 前言 基于 Docker 的容器技术是在2015年的时候开始接触的,两年多的时间,作为一名 Docker 的 D ...

  2. 闲聊 “今日头条Go建千亿级微服务的实践”

      背景    今天跟同事偶然看到<今日头条Go建千亿级微服务的实践>文章,故做了一些探讨,与大家分享下,也欢迎大家多多共同探讨!.     其他资料:   如何理解 Golang 中“不 ...

  3. 微服务架构实践 - 你只懂docker与spring boot就够了吗?

    微服务架构实践 - 你只懂docker与spring boot就够了吗? 作者 浮云发发 已关注 2017.02.27 02:50* 字数 2613 阅读 2583评论 6喜欢 35赞赏 2 微服务并 ...

  4. NET Core 2.0 微服务跨平台实践

    NET Core 2.0 微服务跨平台实践 相关博文: Ubuntu 简单安装 Docker Mac OS.Ubuntu 安装及使用 Consul Consul 服务注册与服务发现 Fabio 安装和 ...

  5. 今日头条Go建千亿级微服务的实践

    今日头条Go建千亿级微服务的实践_36氪 http://36kr.com/p/5073181.html

  6. 微服务优化之使用gRPC做微服务的内部通信

    使用gRPC做微服务的内部通信 gRPC是一个由Google开源的远程服务调用框架,具有多路复用和双向流式通信的特性. 大家好,在本文中将为大家介绍为什么我们应该使用gRPC代替RESTful或JSO ...

  7. 基于 Spring Cloud 的微服务架构实践指南(下)

    show me the code and talk to me,做的出来更要说的明白 本文源码,请点击learnSpringCloud 我是布尔bl,你的支持是我分享的动力! 一.引入 上回 基于 S ...

  8. 如何基于gRPC沟通微服务框架

    本文我们来讲解一下如何使用 gRPC构建微服务,gRPC是一个开源框架,可用于构建可扩展且高性能的微服务并创建服务之间的通信. 背景 随着企业越来越多地转向微服务,对构建这些微服务的低延迟和可扩展框架 ...

  9. 罗辑思维首席架构师:Go微服务改造实践

    转自:http://www.infoq.com/cn/news/2018/05/luojisiwei 方圆 曾先后在 Cisco,新浪微博从事基础架构研发工作.十多年一直专注于后端技术的研发,在消息通 ...

随机推荐

  1. 关于Mac 系统mysql 乱码问题

    这是由于客户端和服务端的编码没有同一 首先我们先在终端连接mysql  连接方法 mysql -u 用户名  -p  即可 然后输入你的密码 这里就不多说了 然后我们输入   show variabl ...

  2. Tomcat系列(4)——Tomcat 组件及架构详细部分

    核心部分   1. 定义 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta ...

  3. 【1】MySQL大数据量分页查询方法及其优化

    ---方法1: 直接使用数据库提供的SQL语句---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N---适应场景: 适用于数据量较少的情况(元组百/千 ...

  4. Java方法参数的传递方式

    程序设计语言中,将参数传递给方法(或函数)有两种方法.按值传递(call by value)表示方法接受的是调用者提供的值:按引用调用(call by reference)表示方法接受的是调用者提供的 ...

  5. 运维工作笔记--------------mongodb无法启动问题

    1.根据编译的脚本检查脚本内的服务启动路径是否正确 2.更改完成后删除pid文件 3.重启mongod

  6. BLSTM的训练算法、解码算法以及模型的改进

    摘要 BLSTM解码时,解码器需要等待整个音频到达后才开始解码,因为时间反方向的前向传播需要末尾的历史信息.BLSTM这一延时问题使其不适用与实时语音识别.context-sensitive-chun ...

  7. Android O广播接收情况

    target-261.卸载和清除收据(这两个在例外广播列表中) 可以收到广播2.应用商店升级app 收不到android.intent.action.PACKAGE_REPLACED广播,应用自身可以 ...

  8. 软件测试面试-如何高质量提交缺陷bug?

    从实际工作中整理,如下:如有补充可以讨论! 所以会发现现在的面试题大部分问的都是工作中出现的场景了,而不是单纯的背诵 1:充分理解需求规则.原型图,知道预期结果,操作时判断是否为bug 解析:预期结果 ...

  9. 2018-2019-2 网络对抗技术 20165231 Exp2 后门原理与实践

    实验内容 1.使用netcat获取主机操作Shell,cron启动 2.使用socat获取主机操作Shell, 任务计划启动 3.使用MSF meterpreter(或其他软件)生成可执行文件,利用n ...

  10. Java位运算原理及使用讲解

    前言日常开发中位运算不是很常用,但是巧妙的使用位运算可以大量减少运行开销,优化算法.举个例子,翻转操作比较常见,比如初始值为1,操作一次变为0,再操作一次变为1.可能的做法是使用三木运算符,判断原始值 ...