当前位置: 首页 > 科技观察

硬肝Python微服务是一种怎样的体验?

时间:2023-03-18 16:53:01 科技观察

本文转载自微信公众号“AirPython”,作者邢安国。转载本文请联系AirPython公众号.一、前言大家好,我是安国!考虑到Python的性能和效率,PythonWeb端一直不温不火。JAVA和Golang的微服务生态一直很繁荣,在企业级应用开发中也得到广泛应用。本文将介绍一个Python微服务框架:《Nameko》2.Nameko介绍Nameko是一个小巧、简洁、异步通信的微服务架构。它使用RabbitMQ消息队列作为消息中间件,基于发布者、订阅者,其中消费者和生产者基于RPC进行通信项目地址:https://github.com/nameko/nameko3。下面以Flask为例说说搭建Python微服务的步骤3-1安装RabbitMQ,从这里开始推荐使用Docker安装RabbitMQ,以Centos为例#1,下载RabbitMQ的某个版本的镜像#MQ版本号:3.9.5dockerpullrabbitmq:3.9.5-management#2、查看镜像dockerimages#3、启动MQ容器#p:指定应用端口和web控制台端口#hostname:主机名#e:环境变量#RABBITMQ_DEFAULT_VHOST:虚拟机名称#RABBITMQ_DEFAULT_USER:用户名#RABBITMQ_DEFAULT_PASS:密码#3e83da0dc938:MQ镜像IDdockerrun-d--namerabbitmq3.9.5-p5672:5672-p15672:15672-v`pwd`/data:/var/lib/rabbitmq--hostnamemyRabbit-eRABBITMQ_DEFAULT_VHOST=my_vhost-eRABBITMQ_DEFAULT_USER=admin-eRABBITMQ_DEFAULT_PASS=admin3e83da0dc938需要注意的是,在启动MQ容器的时候,使用-p指定两个Port5672Application访问端口15672ConsoleWeb访问端口号然后,打开防火墙端口5672和15672PS:如果是云服务器,需要再配置一个安全组最后在浏览器中通过如下连接进入MQ后台Web管理页面地址:http://ip地址:156723-2安装依赖包在虚拟环境下使用pip命令安装nameko和flask依赖包#安装依赖包#namekopip3installnameko#flaskpip3installflask3-3创建服务生产者Producer自定义一个类,使用name属性定义服务的名字为“generate_service”然后使用装饰”rpc”注册服务中的具体方法#producer_service.pyfromnameko.rpcimportrpcclassGenerateService(object):#定义微服务名称name="generate_service"@rpcdefhello_world(self,msg):print('你好,iambeencalledbycustomer(消费者),returnMessage:{}'.format(msg))#Returnresultreturn"HelloWorld!IAmamsgfromproducer!"3-4发布注册服务在终端使用nameko命令将目标文件中的服务注册到MQ#registerservice#producer_service:目标文件#admin:admin:MQ用户名密码#ip地址:5672:MQ服务器ip地址和应用端口号#my_vhost:虚拟机名称namekorunproducer_service--brokeramqp://admin:admin@ip地址:5672/my_vhost其中,my_vhost对应MQ容器启动时配置的虚拟机名称3-5Flask定义API消费者调用该服务。为了演示方便,这里我们使用Flask编写一个简单的API。首先定义MQ连接信息。然后,写一个API接口,请求方式为GET最后在nameko中使用“ClusterRpcProxy”获取消费者对象调用服务中的具体方法fromflaskimportFlaskfromnameko.standalone.rpcimportClusterRpcProxyapp=Flask(__name__)#MQ配置config_mq={'AMQP_URI':"amqp://admin:admin@ip地址:5672/my_vhost"}@app.route('/hello_world',methods=['GET'])defcall_service():withClusterRpcProxy(config_mq)asrpc:#消费者调用微服务(生产者),获取服务(生产者)的返回valueresult=rpc.generate_service.hello_world(msg="xagmsg")#returnresultreturnresult,200app.run(debug=True)3-6测试使用Postman调用以上API接口,消费者可以调用生成器服务的方法方法中,获取返回结果的完整过程#调用API接口http://127.0.0.1:5000/hello_worldMethod:GET4最后以Flask为例说明构建微服务的完整过程,如果与其他web框架(例如Django、FastAPI等)集成微服务的过程类似,只需要修改生成API部分的逻辑即可。更高级的内容可以参考官方文档Official文档:https://nameko.readthedocs.io/en/stable/