文章目录

  • 一.微服务架构
    • 微服务架构的实现方式
      • 同步通信
      • 异步通信
  • 二.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项目微服务化相关推荐

  1. 网易云容器服务微服务化实践—微服务测试及镜像化提测全流程实践

    前言 近几年,互联网项目很多都有从单体服务转变成微服务化的趋势,尤其是一些架构复杂,业务比较广泛的项目,微服务化是大势所趋,可以解决独立构建.更新.运维等一系列问题,从而解放生产力,促进交付效率和质量 ...

  2. centos部署python flask_python 微服务框架之nameko实践

    大纲: 1.本篇关键技术点及其释义 2.实际需求和目标 3.可行的三大解决方案 4.微服务与传统服务的差别 5.代码大纲:安装依赖及nameko五个完整的代码示例 6.附录:docker的在线安装方式 ...

  3. python rpc微服务框架_grpc的微服务探索实践

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

  4. 【前端微服务化】使用飞冰搭建前端微服务化框架

    框架简介 icestark 是一个面向大型系统的微前端解决方案,适用于以下业务场景: 后台比较分散,体验差别大,因为要频繁跳转导致操作效率低,希望能统一收口的一个系统内; 单页面应用非常庞大,多人协作 ...

  5. 业务系统成功微服务化改造的实施步骤

    1. 篇首语 业务系统是任何一个用户产品的必须组成,充当着一个门面的角色,用户的输入就是这个系统需要维护的,数据存取是整个系统的核心.例如,广告业务系统的输入是广告主的投放约束.定向条件,微博业务系统 ...

  6. 转摘-谈谈后端业务系统的微服务化改造

    谈谈后端业务系统的微服务化改造 作者 张旭 发布于 2016年4月29日 | 1 讨论 1. 篇首语 业务系统是任何一个用户产品的必须组成,充当着一个门面的角色,用户的输入就是这个系统需要维护的,数据 ...

  7. 谈谈后端业务系统的微服务化改造

    为什么80%的码农都做不了架构师?>>>    1. 篇首语 业务系统是任何一个用户产品的必须组成,充当着一个门面的角色,用户的输入就是这个系统需要维护的,数据存取是整个系统的核心. ...

  8. 微服务化后,这几点一定要注意

    随着业务发展,很多系统需要经历服务拆分的过程.微服务化过程踩坑也是很正常的事.如果在服务拆分之前做好充分准备,能帮我们少走很多弯路.本文主要从服务依赖,接口版本,隔离,数据一致等方面说说微服务化过程应 ...

  9. python项目-30 个惊艳的Python开源项目

    在过去的一年里,Mybridge AI 比较了近15000个开源Python项目,选择了前30名(概率只有0.2%). 这是一个竞争异常激烈的名单,精挑细选了2017年1月到12月之间发布的最佳开源P ...

  10. 微服务化的基石——持续集成

    一.持续集成对于微服务的意义:拆之前要先解决合的问题 在很多微服务化的文章中,很少会把持续集成放在第一篇,因为大多数的文章都会讲如何拆的问题,例如拆的粒度,拆的时机,拆的方式. 为什么需要拆呢?因为这 ...

最新文章

  1. Java项目:无库版银行管理系统(java+Gui+文档)
  2. c语言多线程转python多线程,真正的python 多线程!一个修饰符让你的多线程和C语言一样快...
  3. 按树型显示BOM的结构
  4. Kong APIGW — 安装与配置
  5. 如何利用python整合excel_Python将多个excel文件合并为一个文件
  6. 统一指令集架构的思考
  7. 怎么打开网卡rss_RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)...
  8. 学习Python第二天
  9. iptables学习笔记:端口转发之“外网访问内网”
  10. H5禁用长按选取,原生拷贝功能
  11. python指纹识别_指纹识别是目前最成熟的识别技术!Python能分分钟做出一个来!...
  12. DevExpress Dashboard for .NET简化商业智能开发
  13. Win10磁盘占用100%的解决办法
  14. 西门子触摸屏数据历史数据记录_西门子触摸屏参数跟数据简单说明
  15. Landsat遥感影像下载
  16. iTunes恢复备份时失败?3个常见原因
  17. 用python写字动画_Duang!用Python来实现唱歌、跳舞、写字、画画?无所不能的pyt
  18. How to update BOL entity property value via ABAP code
  19. first-order-model学习笔记(二):运行参数
  20. 微信、小程序、h5等实名认证接口

热门文章

  1. java ajax分页_使用Jquery+Ajax+Json如何实现分页显示附JAVA+JQuery实现异步分页
  2. python设置excel的格式_python 操作Excel 设置格式
  3. Vue:不使用webpack情况下将Cesium引入到Vue项目中
  4. Java编程:弗洛伊德算法(无向图所有顶点最小路径)
  5. Git:git同步git push时候提示filename too long解决办法
  6. java date truncate_Java DateUtils.truncate方法代码示例
  7. mysql函数commit_phpmysqli_commit()函数和mysqli_autocommit()函数比较
  8. 知识点汇总【一】操作系统三十八问
  9. 论文评析-Incremental Boosting Convolutional Neural Network for Facial Action Unit Recognition,NIPS, 2016
  10. 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1-2-3-3-4-4-5 处理后为 1-2-5(非常简单明了)