推荐一款 Python 微服务框架 - Nameko
1. 前言
大家好,我是安果!
考虑到 Python 性能及效率性,Python Web 端一直不温不火,JAVA 和 Golang 的微服务生态一直很繁荣,也被广泛用于企业级应用开发当中
本篇文章将介绍一款 Python 微服务框架:「 Nameko 」
2. Nameko 介绍
Nameko 是一款小巧、简洁的、异步通信方式的微服务架构
它采用 RabbitMQ 消息队列作为消息中间件,基于发布者、订阅者模式
其中,消费者与生产者基于 RPC 进行通讯
项目地址:https://github.com/nameko/nameko
3. 实战一下
下面以 Flask 为例聊聊搭建 Python 微服务的步骤
3-1 安装 RabbitMQ 及启动
这里推荐利用 Docker 安装 RabbitMQ,以 Centos 为例
# 1、下载某个版本的RabbitMQ的镜像
# MQ版本号:3.9.5
docker pull rabbitmq:3.9.5-management
# 2、查看镜像
docker images
# 3、启动MQ容器
# p:指定应用端口及Web控制台端口
# hostname:主机名
# e:环境变量
# RABBITMQ_DEFAULT_VHOST:虚拟机名称
# RABBITMQ_DEFAULT_USER:用户名
# RABBITMQ_DEFAULT_PASS:密码
# 3e83da0dc938:MQ镜像ID
docker run -d --name rabbitmq3.9.5 -p 5672:5672 -p 15672:15672 -v `pwd`/data:/var/lib/rabbitmq --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin 3e83da0dc938
需要注意的是,启动 MQ 容器时,利用 -p 指定了两个端口
5672
应用访问端口
15672
控制台 Web 访问端口号
然后,开放防火墙的 5672、15672 端口号
PS:如果是云服务器,需要另外配置安全组
最后,在浏览器中通过下面的连接进入到 MQ 后台 Web 管理页面
3-2 安装依赖包
使用 pip 命令在虚拟环境下安装 nameko、flask 依赖包
# 安装依赖包
# nameko
pip3 install nameko
# flask
pip3 install flask
3-3 创建服务生产者 Producer
自定一个类,使用 name 属性定义服务的名称为「 generate_service 」
然后使用装饰器「 rpc 」注册服务中具体的方法
# producer_service.py
from nameko.rpc import rpc
class GenerateService(object):
# 定义微服务名称
name = "generate_service"
@rpc
def hello_world(self, msg):
print('hello,i am been called by customer(消费者),返回消息:{}'.format(msg))
# 返回结果
return "Hello World!I Am a msg from producer!" # 返回结果 return "Hello World!I Am a msg from producer!"
3-4 发布注册服务
使用 nameko 命令在终端将目标文件中的服务注册到 MQ 中
# 注册服务
# producer_service:目标文件
# admin:admin:MQ用户名及密码
# ip地址:5672:MQ服务器ip地址及应用端口号
# my_vhost:虚拟机名
nameko run producer_service --broker amqp://admin:admin@ip地址:5672/my_vhost
其中,my_vhost 对应 MQ 容器启动时配置的虚拟机名
3-5 Flask 定义 API 及消费者调用服务
为了演示方便,这里使用 Flask 编写一个简单的 API
首先,定义 MQ 连接信息
然后,编写一个 API 接口,请求方式为 GET
最后,使用 nameko 中的「 ClusterRpcProxy 」拿到消费者对象去调用服务中的具体方法
from flask import Flask
from nameko.standalone.rpc import ClusterRpcProxy
app = Flask(__name__)
# MQ配置
config_mq = {'AMQP_URI': "amqp://admin:admin@ip地址:5672/my_vhost"}
@app.route('/hello_world', methods=['GET'])
def call_service():
with ClusterRpcProxy(config_mq) as rpc:
# 消费者调用微服务(生产者),获取服务(生产者)的返回值
result = rpc.generate_service.hello_world(msg="xag msg")
# 返回结果
return result, 200
app.run(debug=True)
3-6 测试一下
使用 Postman 调用上面的 API 接口,就能完成消费者调用生成者服务中的方法,拿到返回结果的完整流程
# 调用API接口
http://127.0.0.1:5000/hello_world
Method:GET
4. 最后
上面以 Flask 为例讲解了微服务的搭建的完整流程
如果是其他 Web 框架( 比如 Django、FastAPI 等 )集成微服务流程是类似的,只需要修改生成 API 部分的逻辑即可,更多进阶内容大家可以参考官方文档
官方文档:https://nameko.readthedocs.io/en/stable/
如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!
推荐阅读
Postman 如何调试加密接口?
推荐一款 Python 微服务框架 - Nameko的更多相关文章
- 【Python】Python 微服务框架 nameko
nameko: 1.支持服务发现.负载均衡 2.支持依赖自动注入,使用很方便 3.缺点:超时.限速.权限等机制不完善 代码示例:https://github.com/junneyang/nameko- ...
- 推荐一款分布式微服务框架 Surging
surging surging 是一个分布式微服务框架,提供高性能RPC远程服务调用,采用Zookeeper.Consul作为surging服务的注册中心,集成了哈希,随机,轮询,压力最小优先作为 ...
- python 微服务方案
介绍 使用python做web开发面临的一个最大的问题就是性能,在解决C10K问题上显的有点吃力.有些异步框架Tornado.Twisted.Gevent 等就是为了解决性能问题.这些框架在性能上有些 ...
- python 微服务开发书中几个方便的python框架
python 微服务开发是一本讲python 如果进行微服务开发的实战类书籍,里面包含了几个很不错的python 模块,记录下,方便后期回顾学习 处理并发的模块 greenlet && ...
- Dubbo Ecosystem - 从微服务框架到微服务生态
从微服务框架到微服务生态,这是微服务发展的必然趋势,也是Dubbo社区满足开发者更高效的构建微服务体系期望的使命和担当. 近期,Apache Dubbo PPMC 望陶(社区昵称:ralf0131)做 ...
- 十分钟搭建微服务框架(SpringBoot +Dubbo+Docker+Jenkins源码)
本文将以原理+实战的方式,首先对“微服务”相关的概念进行知识点扫盲,然后开始手把手教你搭建这一整套的微服务系统. 这套微服务框架能干啥? 这套系统搭建完之后,那可就厉害了: 微服务架构 你的整个应用程 ...
- kratos微服务框架学习笔记一(kratos-demo)
目录 kratos微服务框架学习笔记一(kratos-demo) kratos本体 demo kratos微服务框架学习笔记一(kratos-demo) 今年大部分时间飘过去了,没怎么更博和githu ...
- 手把手0基础项目实战(一)——教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)...
原文:手把手0基础项目实战(一)--教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)... 本文你将学到什么? 本文将以原理+实战的方式,首先对& ...
- 在微服务框架Demo.MicroServer中添加SkyWalking+SkyApm-dotnet分布式链路追踪系统
1.APM工具的选取 Apm监测工具很多,这里选用网上比较火的一款Skywalking. Skywalking是一个应用性能监控(APM)系统,Skywalking分为服务端Oap.管理界面UI.以及 ...
随机推荐
- Qt迭代器(Java类型和STL类型)详解
迭代器为访问容器类里的数据项提供了统一的方法,Qt 有两种迭代器类:Java 类型的迭代器和 STL 类型的迭代器. 两者比较,Java 类型的迭代器更易于使用,且提供一些高级功能,而 STL 类型的 ...
- python运算符,内置函数简单使用
1.编写程序,输入任意大的自然数,输出各位数字之和. 2.编写程序,输入两个集合 setA 和 setB,分别输出它们的交集.并集和差集 setA-setB. 3.编写程序,输入一个自然数,输出它的二 ...
- SpringBoot以jar包部署需要注意的thymeleaf页面映射问题
关于themeleaf映射需要注意的: 1.页面映射 所有静态页面映射的时候,mapping后面要以/开头(最好),不以/开头也行 但是return 后面路径不能以/开头:IDE中正常,但是打jar包 ...
- 关于Junit中Assert已经过时
在junit4.12之后,Assert就过时了,提供了TestCase来取代: 同样在TestCase中原本比较常见的一些方法也已经取消了,例如:assertNotEquals.assertThat. ...
- Hibernate之抓取策略
时间:2017-1-23 19:08 --区分延迟和立即检索1.立即检索 当执行某行代码时,会马上发出SQL语句进行查询. 例如:get()2.延迟检索 当执行某行代码时,不会马上发 ...
- MySQL主库手动复制至从库
原文转自:https://www.cnblogs.com/itzgr/p/10233932.html作者:木二 目录 一 主库手动复制至从库 1.1 Master主库锁表 1.2 主库备份 1.3 从 ...
- C#多线程开发-线程基础 01
最近由于工作的需要,一直在使用C#的多线程进行开发,其中也遇到了很多问题,但也都解决了.后来发觉自己对于线程的知识和运用不是很熟悉,所以将利用几篇文章来系统性的学习汇总下C#中的多线程开发. 线程基础 ...
- SpringBoot笔记(7)
一.单元测试 1.JUnit5简介 Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库 作为最新版本的JUnit框架,JUnit5与之前版本的Junit框架有很大的不 ...
- centos7 误用 cat 打开了一个很大的文件
2021-09-01 1. 问题描述 刚才看到一个文件,出于好奇我就直接用 cat 命令查看了一下,结果文件巨大,一直刷屏停不下来 2. 解决方法 克隆一个窗口,抓一下这个 cat 进程,再使用 ki ...
- CPU内部结构域寄存器
CPU内部结构域寄存器 64位和32位系统区别: 寄存器是CPU内部最基本的存储单元. CPU对外是通过总线(地址.控制.数据)来和外部设备交互的,总线的宽度是8位,同时CPU的寄存器也是8位,那 ...