nameko的设计与python语言所追求的简明快捷同出一辙。
微服务的框架很多,thrift就是非常出色的一款。thrift是跨语言的。基于thrift的python的代码实现可以参照 https://www.jianshu.com/p/82a6bdaabcd3 这个链接
针对上面的链接小结一下:
1、需要新建一个thrift格式的接口文件
2、对接口文件进行处理,将其变为py文件
3、开发client
4、开发server
对比前一篇文章,可以看出来基于thrift的开发还是不那么直接。
nameko之所以简单,就是没有重复造轮子,它将rabbitmq这个超级消息解决方案纳入其中。所有的微服务都是假设在这个消息队列上的一个插件。a服务想要调用b服务,只需要像调用本地的函数一样:
result = rpc.greeting_service.hello(name="jerry")
就ok
没有必要再去建立socket连接。
这样有个好处就是,可以将所有的微服务,作为功能,挂接在rabbitmq上,供别人调用,做到了功能的复用。
说到功能复用,对于团队开发软件项目而言,这已经完全超越了之前的代码复用,具备非常大的好处:不同的业务应用,可以由不同的微服务构建而来,这些微服务可能是之前开发过的,只要交互的信息相同,完全不用再次开发,或者将代码复制过来进行重新修订。如果不好用,完全可以基于原来的微服务进行迭代升级。
nameko的文档不完善,开发人员有时候懒得编写文档,可以理解,但是好在可以从源代码中找到若干信息。
RPCdiao'yo这是nameko存在的最核心的功能。
这里有两个问题:
1、如何定义有个微服务,供别人调用
2、如何调用已经开发好的微服务
第一个问题,前面已经有描述,就是采用装饰器的方式,定义某个方法可以作为微服务被调用。
from nameko.rpc import rpc
class GreetingService:
name = "greeting_service"
@rpc
def hello(self, name):
return "Hello, {}!".format(name)
说明:
a、微服务放在一个类中,
b、为这个微服务要起一个名称,
c、通过@rpc这个装饰器,将微服务进行注册即可。
第二个问题,调用.
有两种方案:
第一种是rpc的调用方法,也就是一个rpc方法内部再调用一个rpc方法
from nameko.rpc import rpc, RpcProxy
class ServiceY:
name = "service_y"
@rpc
def append_identifier(self, value):
return u"{}-y".format(value)
class ServiceX:
name = "service_x"
y = RpcProxy("service_y")
@rpc
def remote_method(self, value):
res = u"{}-x".format(value)
return self.y.append_identifier(res)
说明:
1、再ServiceY中定义了 一个rpc的方法,然后这个方法供ServiceX调用;在ServiceX中定义了remote_method这样一个rpc方法,在这个方法中调用了ServiceY中定义的rpc方法;
第二种是外部rpc的调用,也就是在方法前面没有将@rpc装饰器的调用方法
from flask import Flask, request
from nameko.standalone.rpc import ClusterRpcProxy
app = Flask(__name__)
CONFIG = {'AMQP_URI': "amqp://guest:guest@localhost"}
@app.route('/hello', methods=['POST'])
def hello():
with ClusterRpcProxy(CONFIG) as rpc:
result = rpc.greeting_service.hello(name="jerry")
return result, 200
app.run(debug=True)
说明:
1、这是一个独立的非RPC的服务,单独采用flask运行。当然你可以 使用任何方式运行service,比如使用nameko自己的方式。参见系列三中的内容。
2、使用clusterRpcProxy与rabbitmq连接在一起,并调用远程的方法。