当前位置: 首页 > 工具软件 > Nameko > 使用案例 >

php调用nameko接口,nameko的RPC调用~nameko系列之二

尉迟远
2023-12-01

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连接在一起,并调用远程的方法。

 类似资料: