服务治理与RPC · 跬步
以前写过Django中使用zerorpc的方法,但是由于我们的Django是运行在gevent下,而zeromq需要启动一个后台进程处理消息,与gevent使用的greenlet携程是冲突的。
在Java的世界里,Spring Cloud全家桶覆盖了微服务的方方面面,专注于服务治理的框架也有阿里的Dubbo,微博的Motan。但是Python这边没有找到合适的轮子,甚至于好的RPC框架也没有,只有gRPC,Thrift这种跨语言的RPC框架。而这些跨语言的RPC框架基本上也是基于C/C++的Python port。
在github上全局搜索Python rpc,找到一个原生支持gevent的MPRPC,而且也找到了微博Motan的Golang版本,所以考虑读Motan-go的源码学习一下什么是服务治理,再基于MPRPC实现自己的轮子。这就有了doge。
服务注册
主流的注册中心服务包括etcd,Consul,zookeeper。这里只考虑了etcd与Consul,etcd相对来说简单些,是一个分布式的KV强一致数据库,数据以树状结构存储。Consul的功能更丰富些,有服务的定义,并且支持对服务的健康检查。etcd不支持健康检查,但是可以通过设置key的ttl,然后服务定时刷新ttl来主动上报。
熔断
MPRPC本身提供了一个简单socket pool池,但是在高并发测试下发现池会溢出,其实是一个并发安全的问题,打了一个补丁,解决了该问题。
同时在连接池的基础上封装了EndPoint了,在调用失败多次后,判断EndPoint不可用,并且启动后台协程多次链接socket,一旦连接成功则重新设置为可用。
同时客户端会监听服务的key变化,一旦服务没有刷新ttl,key被删除或过期,对应的EndPint也会被删除。
负载均衡
大专栏 服务治理与RPC · 跬步>
主流的负载均衡方式有:随机,平均,按负载,HASH。由于RPC主要是在内部网络使用,所以只实现了随机与平均的方式。
高可用
简单的方式failfast只调用一次,无论是否出错马上返回。failover会在重试次数以内遍历所有可以用的EndPoint,直到成功才返回。backrequest会在调用时保存所有成功的调用事件,算出一个合适的超市事件来遍历调用,直到成功并返回。
服务降级
Java有hystrix这种专门用来做熔断,降级的库。Python由于比较简单,可用直接try/except来事件,在熔断以后,直接调用熔断处理函数。
服务端限流
限制连接数,可用通过信号量来实现。限制流速,漏桶算法或者令牌桶算法。事件段内的调用次数,使用计数器。
在开发doge的过程中,学习通过pytest来写单元测试,感觉比unitest更方便一些。同时接入了travis ci在每次push代码的同时执行单元测试。发布到PyPI后补充了codecov代码测试覆盖率。对于开源项目的正确姿势有了更多的理解。
Please enable JavaScript to view the comments powered by Disqus.
服务治理与RPC · 跬步的更多相关文章
- 面试都在问的微服务、服务治理、RPC、下一代微服务框架... 一文带你彻底搞懂!
文章每周持续更新,「三连」让更多人看到是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 单体式应用程序 与微服务相对的另一个概念是传统的单体式应用程序( ...
- 微服务治理平台的RPC方案实现
导读:本文主要探讨了rpc框架在微服务化中所处的位置,需要解决的问题.同时介绍了用友云微服务治理平台的rpc解决方案,为什么选择该方案.该方案提供的好处是什么.同时也会介绍用友RPC框架的基本结构以及 ...
- 腾讯高性能RPC开发框架Tars实现服务治理(微服务)
Github:https://github.com/Tencent/Tars 1. 介绍 Tars是基于名字服务使用Tars协议的高性能RPC开发框架,同时配套一体化的服务治理平台,帮助个人或者企业快 ...
- 面试都在问的「微服务」「RPC」「服务治理」「下一代微服务」一文带你彻底搞懂!
❝ 文章每周持续更新,各位的「三连」是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) ❞ 单体式应用程序 与微服务相对的另一个概念是传统的「单体式应用程 ...
- 分布式RPC框架Dubbo实现服务治理:集成Kryo实现高速序列化,集成Hystrix实现熔断器
Dubbo+Kryo实现高速序列化 Dubbo RPC是Dubbo体系中最核心的一种高性能,高吞吐量的远程调用方式,是一种多路复用的TCP长连接调用: 长连接: 避免每次调用新建TCP连接,提高调用的 ...
- 基于Nginx dyups模块的站点动态上下线并实现简单服务治理
简介 今天主要讨论一下,对于分布式服务,站点如何平滑的上下线问题. 分布式服务 在分布式服务下,我们会用nginx做负载均衡, 业务站点访问某服务站点的时候, 统一走nginx, 然后nginx根据一 ...
- .NET Core微服务之路:基于gRPC服务发现与服务治理的方案
重温最少化集群搭建,我相信很多朋友都已经搭建出来,基于Watch机制也实现了出来,相信也有很多朋友有了自己的实现思路,但是,很多朋友有个疑问,我API和服务分离好了,怎么通过服务中心进行发现呢,这个过 ...
- 实战中的asp.net core结合Consul集群&Docker实现服务治理
0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.前言 在写这篇文章之前,我看了很多关于consul的服务治理,但发现基本上都是直接在powershell或者以命令工具的方式在 ...
- .net core结合Consul集群&Docker实现服务治理
实战中的asp.net core结合Consul集群&Docker实现服务治理 https://www.cnblogs.com/guolianyu/p/9614050.html 0.目录 整体 ...
随机推荐
- 7.docker file 语法
详细文档 : https://docs.docker.com/engine/reference/builder/ 1. FROM 尽量使用官方的 image 作为 base image FROM ...
- ubuntu下安裝程序的三個方式
引言 在ubuntu当中,安装应用程序我所知道的有三种方法,分别是apt-get,dpkg安装deb和make install安装源码包三种.下面针对每一种方法各举例来说明. apt-get方法 使用 ...
- Java8必知必会
Java SE 8添加了2个对集合数据进行批量操作的包: java.util.function 包以及 java.util.stream 包. 流(stream)就如同迭代器(iterator),但附 ...
- 九、Shell脚本高级编程实战第九部
一.监控mysql主从同步是否异常,如果异常,发送短信给管理员 1)开发一个守护进程脚本每30秒实现检测一次. 2)如果错误号是:1158.1159.1008.1007.1062,请跳过 3)请使用数 ...
- Office 2019 for Mac(office办公套件) v16.34中文版
Microsoft Office 2019 Mac中文版下载是微软在Mac发行的Office办公软件套件.包含了新版本的Word.Excel.PowerPoint以及现有的OneNote和Outlo ...
- 吴裕雄--天生自然 pythonTensorFlow图形数据处理:多线程队列操作
import tensorflow as tf #1. 定义队列及其操作. queue = tf.FIFOQueue(100,"float") enqueue_op = queue ...
- 吴裕雄--天生自然 PYTHON3开发学习:输入和输出
str = input("请输入:"); print ("你输入的内容是: ", str) # 打开一个文件 f = open("/tmp/foo.t ...
- 用@font-face应用自定义字体
@font-face格式 @font-face { font-family: <YourWebFontName>; src: <source> [<format>] ...
- Traffic Network in Numazu
Traffic Network in Numazu 题目描述 Chika is elected mayor of Numazu. She needs to manage the traffic in ...
- Mybatis的generator自动生成代码
mybatis-generator有三种用法:命令行.ide插件.maven插件.本次使用maven生成 环境:IDEA,mysql8,maven (1):新建项目,本次以SpringBoot项目为例 ...