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