使用nameko框架实现Python项目微服务化

一.微服务架构

微服务架构有众多的优点,在现在的企业级项目中被广泛的应用。本文主要讨论如何使用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 rpc

class hello_service:
    name = "hello_service"

    @rpc
    def hello(self):
        print("hello world")

service.py调用服务

from nameko.standalone.rpc import ClusterRpcProxy

CONFIG = {'AMQP_URI': "amqp://guest:[email protected]"}


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:[email protected]

如果注册中心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中文文档(翻译)

发布了169 篇原创文章 · 获赞 150 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/eagleuniversityeye/article/details/103647794