使用nameko框架实现Python项目微服务化
文章目录
- 一.微服务架构
- 微服务架构的实现方式
- 同步通信
- 异步通信
- 二.nameko微服务框架
- 2.1 入门案例--使用nameko框架实现微服务程序
- 1 ) 安装注册中心
- 2 ) 服务生产者和服务消费者
- 3 ) 启动微服务
- 2.2 nameko框架实现原理
- 三.总结
一.微服务架构
微服务架构有众多的优点,在现在的企业级项目中被广泛的应用。本文主要讨论如何使用Python相关技术实现微服务架构,不就微服务做过多的解释,如果想要了解更多微服务概念相关的知识,可以移步理解微服务
微服务架构的实现方式
微服务架构最重要的就是使用什么方式进行服务间通信(也称作服务调用),按照通信方式的不同,主要可以分为同步通信和异步通信两种方式:
同步通信
同步调用比较简单,一致性强,但是容易出调用问题,性能体验上也会差些。同步通信最常用的两种协议是RESTful和RPC,而目前使用最广泛,最有名的两种微服务框架Spring Cloud和Dubbo分别使用了RESTful和RPC协议。RESTful和RPC两种协议各有优势,具体使用要看业务场景。
异步通信
异步通信一般通过消息中间件来进行服务间通信,消息中间件能为调用之间提供的缓冲,确保消息积压不会冲垮被调用方,同时能保证调用方的服务体验,继续干自己该干的活,不至于被后台性能拖慢。不过需要付出的代价是一致性的减弱。
二.nameko微服务框架
Python框架nameko就是一种采用了异步通信实现的微服务框架。它使用RabbitMQ消息队列作为消息中间件,实现服务远程调用。
2.1 入门案例–使用nameko框架实现微服务程序
1 ) 安装注册中心
nameko采用RabbitMQ作为注册中心,所以使用nameko必须要先安装RabbitMQ
以docker容器的方式运行RabbitMQ是最为简便快捷的方式,两行命令就搞定了,这里介绍如何使用docker运行RabbitMQ。
第一步:从DockerHub拉取rabbitmq镜像
docker pull rabbitmq:management
第二部:运行RabbitMQ容器
docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq:management
如果需要设置用户名和密码,则使用这条命令
docker run -d --hostname my-rabbit --name rabbit -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password -p 15672:15672 -p 5672:5672 rabbitmq:management
我运行容器时没有设置用户名和密码,所以使用用户名guest,密码guest登录。http://localhost:15672/
登录成功界面
2 ) 服务生产者和服务消费者
演示程序的项目结构(没有用到app.py,忽略该文件)
hello_service.py发布服务,服务名称为“hello_service”
from nameko.rpc import rpcclass hello_service:name = "hello_service"@rpcdef hello(self):print("hello world")
service.py调用服务
from nameko.standalone.rpc import ClusterRpcProxyCONFIG = {'AMQP_URI': "amqp://guest:guest@192.168.110.129"}def compute():with ClusterRpcProxy(CONFIG) as rpc:rpc.hello_service.hello()if __name__ == '__main__':compute()
3 ) 启动微服务
使用nameko框架的run命令启动微服务
nameko run hello_service --broker amqp://guest:guest@192.168.110.129
如果注册中心rabbitmq没有成功启动,会显示如下信息
如果现实信息如下则表示服务成功启动
运行service.py调用服务后在命令行打印出“hello world”,服务被成功调用
2.2 nameko框架实现原理
nameko框架主要是依靠RabbitMQ实现异步通信,远程服务调用的,如果想要了解nameko的实现细节,则需要先了解RabbitMQ的工作原理,可以参考:消息队列与RabbitMQ,或者直接去RabbitMQ官网看官方文档,RabbitMQ官方文档写的非常的详细
RabbitMQ主要有六种工作模式,而nameko默认情况下使用的就是第六种RPC模式
还是上面的例子,我在hello_service这个服务之后,又启动了三个服务,在RabbitMQ的图形化界面里可以看到nameko是如何工作的(理解下面的内容要求读者必须对RabbitMQ有一定的了解)
打开Exchanges交换机界面,可以看到有一个交换机,名为nameko-rpc,可以看出,nameko框架发布的服务都是通过这个名为nameko-rpc的交换机进行消息转发的
点击nameko-rpc这个交换机,可以看到它的匹配规则,我们的hello_service服务的匹配规则是hello_service.*,这表明了以hello_service为第一个字段的所有消息都可以被我们的hello_service服务接收
打开Queues队列界面,可以看到hello_service服务有一个专门的队列rpc-hello_service。除此之外还可以观察到nameko已经帮我们做了消息持久化,Feature那一栏里显示的是D状态
三.总结
以上只是nameko框架最简单的一个使用的例子,使用者可以通过设置nameko框架的很多参数实现自己理想中的调用方式,具体可以看Nameko的文档:Nameko中文文档(翻译)
使用nameko框架实现Python项目微服务化相关推荐
- 网易云容器服务微服务化实践—微服务测试及镜像化提测全流程实践
前言 近几年,互联网项目很多都有从单体服务转变成微服务化的趋势,尤其是一些架构复杂,业务比较广泛的项目,微服务化是大势所趋,可以解决独立构建.更新.运维等一系列问题,从而解放生产力,促进交付效率和质量 ...
- centos部署python flask_python 微服务框架之nameko实践
大纲: 1.本篇关键技术点及其释义 2.实际需求和目标 3.可行的三大解决方案 4.微服务与传统服务的差别 5.代码大纲:安装依赖及nameko五个完整的代码示例 6.附录:docker的在线安装方式 ...
- python rpc微服务框架_grpc的微服务探索实践
对于微服务的实践,一般都是基于Java和Golang的,博主最近研究了下基于Python的微服务实践,现在通过一个简单的服务来分析Python技术栈的微服务实践 技术栈:Python3 + grpc ...
- 【前端微服务化】使用飞冰搭建前端微服务化框架
框架简介 icestark 是一个面向大型系统的微前端解决方案,适用于以下业务场景: 后台比较分散,体验差别大,因为要频繁跳转导致操作效率低,希望能统一收口的一个系统内; 单页面应用非常庞大,多人协作 ...
- 业务系统成功微服务化改造的实施步骤
1. 篇首语 业务系统是任何一个用户产品的必须组成,充当着一个门面的角色,用户的输入就是这个系统需要维护的,数据存取是整个系统的核心.例如,广告业务系统的输入是广告主的投放约束.定向条件,微博业务系统 ...
- 转摘-谈谈后端业务系统的微服务化改造
谈谈后端业务系统的微服务化改造 作者 张旭 发布于 2016年4月29日 | 1 讨论 1. 篇首语 业务系统是任何一个用户产品的必须组成,充当着一个门面的角色,用户的输入就是这个系统需要维护的,数据 ...
- 谈谈后端业务系统的微服务化改造
为什么80%的码农都做不了架构师?>>> 1. 篇首语 业务系统是任何一个用户产品的必须组成,充当着一个门面的角色,用户的输入就是这个系统需要维护的,数据存取是整个系统的核心. ...
- 微服务化后,这几点一定要注意
随着业务发展,很多系统需要经历服务拆分的过程.微服务化过程踩坑也是很正常的事.如果在服务拆分之前做好充分准备,能帮我们少走很多弯路.本文主要从服务依赖,接口版本,隔离,数据一致等方面说说微服务化过程应 ...
- python项目-30 个惊艳的Python开源项目
在过去的一年里,Mybridge AI 比较了近15000个开源Python项目,选择了前30名(概率只有0.2%). 这是一个竞争异常激烈的名单,精挑细选了2017年1月到12月之间发布的最佳开源P ...
- 微服务化的基石——持续集成
一.持续集成对于微服务的意义:拆之前要先解决合的问题 在很多微服务化的文章中,很少会把持续集成放在第一篇,因为大多数的文章都会讲如何拆的问题,例如拆的粒度,拆的时机,拆的方式. 为什么需要拆呢?因为这 ...
最新文章
- Java项目:无库版银行管理系统(java+Gui+文档)
- c语言多线程转python多线程,真正的python 多线程!一个修饰符让你的多线程和C语言一样快...
- 按树型显示BOM的结构
- Kong APIGW — 安装与配置
- 如何利用python整合excel_Python将多个excel文件合并为一个文件
- 统一指令集架构的思考
- 怎么打开网卡rss_RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)...
- 学习Python第二天
- iptables学习笔记:端口转发之“外网访问内网”
- H5禁用长按选取,原生拷贝功能
- python指纹识别_指纹识别是目前最成熟的识别技术!Python能分分钟做出一个来!...
- DevExpress Dashboard for .NET简化商业智能开发
- Win10磁盘占用100%的解决办法
- 西门子触摸屏数据历史数据记录_西门子触摸屏参数跟数据简单说明
- Landsat遥感影像下载
- iTunes恢复备份时失败?3个常见原因
- 用python写字动画_Duang!用Python来实现唱歌、跳舞、写字、画画?无所不能的pyt
- How to update BOL entity property value via ABAP code
- first-order-model学习笔记(二):运行参数
- 微信、小程序、h5等实名认证接口
热门文章
- java ajax分页_使用Jquery+Ajax+Json如何实现分页显示附JAVA+JQuery实现异步分页
- python设置excel的格式_python 操作Excel 设置格式
- Vue:不使用webpack情况下将Cesium引入到Vue项目中
- Java编程:弗洛伊德算法(无向图所有顶点最小路径)
- Git:git同步git push时候提示filename too long解决办法
- java date truncate_Java DateUtils.truncate方法代码示例
- mysql函数commit_phpmysqli_commit()函数和mysqli_autocommit()函数比较
- 知识点汇总【一】操作系统三十八问
- 论文评析-Incremental Boosting Convolutional Neural Network for Facial Action Unit Recognition,NIPS, 2016
- 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1-2-3-3-4-4-5 处理后为 1-2-5(非常简单明了)