【问题标题】:No route between Nameko and FlaskNameko 和 Flask 之间没有路线
【发布时间】:2018-11-13 04:09:48
【问题描述】:

如果你在一小时前或几乎看到我的最后一个问题)!

我设法解决了很多问题,但我被一个问题困住了,我不明白我为什么会遇到它。我更喜欢创建一个新线程,因为错误不一样,对于未来的读者来说,它会更清楚。

正如我在上一个问题中所说,我的目标是使用 Python 和 Nameko 构建微服务,从 Flask Web 应用程序(以及将来从许多 Flask Web 应用程序)发送结果并接收信息和查询。但我现在有一个 - 312 - 路由问题。

来自我的 Nameko 应用程序的代码:

# -*-coding:utf-8 -*

# namekotesting.py

from nameko.rpc import rpc

class firstService:
        name = "First microservice"
        result = "";

        @rpc
        def mymethode(self, test):
                result = test
                return result

来自 Flask 应用程序的代码:

#! /usr/bin/python
# -*- coding:utf-8 -*-

from flask import Flask, request
from flasgger import Swagger
from nameko.standalone.rpc import ClusterRpcProxy

app = Flask(__name__)
Swagger(app)
CONFIG = {'AMQP_URI': "amqp://guest:guest@<myipserverhere>:5672"}

@app.route('/', methods=['GET', 'POST'])

def mymethode():
        with ClusterRpcProxy(CONFIG) as rpc:
                littletest = rpc.firstService.mymethode("hello")

def index():
        return littletest

if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True, port=5000)

现在,错误:

 * Serving Flask app "flasktest" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 126-185-375
[03/Jun/2018 21:04:27] "GET / HTTP/1.1" 500 -
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 2309, in __call__
    return self.wsgi_app(environ, start_response)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 2295, in wsgi_app
    response = self.handle_exception(e)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1741, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/oyo/flasktest/flasktest.py", line 16, in mamethode
    petittest = rpc.premierService.mamethode("voici")
  File "/usr/local/lib/python2.7/dist-packages/nameko/rpc.py", line 368, in __call__
    reply = self._call(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/nameko/rpc.py", line 437, in _call
    extra_headers=extra_headers
  File "/usr/local/lib/python2.7/dist-packages/nameko/amqp/publish.py", line 189, in publish
    **publish_kwargs
  File "/usr/local/lib/python2.7/dist-packages/kombu/messaging.py", line 181, in publish
    exchange_name, declare,
  File "/usr/local/lib/python2.7/dist-packages/kombu/connection.py", line 494, in _ensured
    return fun(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/kombu/messaging.py", line 203, in _publish
    mandatory=mandatory, immediate=immediate,
  File "/usr/local/lib/python2.7/dist-packages/amqp/channel.py", line 1743, in basic_publish_confirm
    self.wait(spec.Basic.Ack)
  File "/usr/local/lib/python2.7/dist-packages/amqp/abstract_channel.py", line 79, in wait
    self.connection.drain_events(timeout=timeout)
  File "/usr/local/lib/python2.7/dist-packages/amqp/connection.py", line 491, in drain_events
    while not self.blocking_read(timeout):
  File "/usr/local/lib/python2.7/dist-packages/amqp/connection.py", line 497, in blocking_read
    return self.on_inbound_frame(frame)
  File "/usr/local/lib/python2.7/dist-packages/amqp/method_framing.py", line 77, in on_frame
    callback(channel, msg.frame_method, msg.frame_args, msg)
  File "/usr/local/lib/python2.7/dist-packages/amqp/connection.py", line 501, in on_inbound_method
    method_sig, payload, content,
  File "/usr/local/lib/python2.7/dist-packages/amqp/abstract_channel.py", line 128, in dispatch_method
    listener(*args)
  File "/usr/local/lib/python2.7/dist-packages/amqp/channel.py", line 1960, in _on_basic_return
    raise exc
ChannelError: Basic.return: (312) NO_ROUTE

我现在会留在这个帖子上以完成我的测试(如果我有另一个我无法解决的问题)。在那之后,我想我将能够制作我的框架。目前对此有何建议、提示或帮助?

提前谢谢你。

【问题讨论】:

    标签: python flask rabbitmq nameko


    【解决方案1】:

    当“强制”消息无法传递到任何队列时,RabbitMQ 会返回“basic.return”。

    你能运行这个吗?

    rabbitmq-plugins enable rabbitmq_management
    

    然后打开

    http://server-name:15672/ #server-name i think is `localhost` 
    

    使用账号guest和密码guestdocs登录

    还有关于queueschannelsexchanges等的所有信息。

    是否有queue 声明了您要发送消息的位置?

    如果没有queue,则创建它

    【讨论】:

    • 感谢您的帮助。我已经完成了第一个,甚至创建了一个新用户。但是我无法访问正确的 URL,连接失败(我用服务器 IP 替换了服务器名称)。我去找找,不知道为什么失败了。
    • systemctl status rabbitmq-server.service rabbitmq 是否处于活动状态?
    • 我(再次)更改了我的评论。它是活跃的,但我设法进入管理页面:github.com/nameko/nameko/issues/364。我有两个队列:rpc-First microservice D idle 0 0 0 rpc.reply-standalone_rpc_proxy-1c1b5ea9-e2a5-45c0-a494-15223d4d6bbd Exp D idle 0 0 0 错误仍然在这里。
    • 啊,我不应该在这里看到“运行”而不是“空闲”吗?
    • 你有First microservice队列,以后不要在队列中的单词之间使用空格你可以将它命名为first_microservice现在,你发送消息到这个队列吗?你收到这个队列的消息了吗?
    【解决方案2】:

    服务类上的name 属性是您对服务的寻址方式。

    class firstService:
        name = "first"
    
        @rpc
        def method(self):
            pass
    

    所以

    >>> rpc.firstService.method()  # won't work
    >>> rpc.first.method()         # will work
    

    此外,您似乎使用的是过于现代的 py-amqp 版本。安装 Nameko 后你升级了吗?它应该是 v1.4.9。使用该版本,您会收到更有用的“未知服务”错误返回。

    【讨论】:

    • 哦,我明白了。我不记得升级它(当我查看我的历史时,自从第一次使用 apt-get install 安装以来,我没有看到任何命令,这很奇怪)。我试过你的代码没有任何结果。我应该尝试降级吗?我没有做过一次,但我可以尝试。或者我可以将它们全部删除并重新安装?
    • 只是说:我在安装 Nameko 后安装了 greenlet、kombu、python-dev 和 python-yaml。我需要它。可能是问题吗? Nameko 没有它就无法运行(出现一些错误)。
    • 我将它们全部卸载,然后重新安装它并且它工作。它只是与以 firstmicroservice 作为名称的 rpc.firstmicroservice.mymethod() 一起工作。这就是我所需要的。谢谢大家的帮助!
    • Nameko 的 setup.py 指定它需要 kombu 版本 pip install nameko 它将为你安装适当的依赖项。如果您随后 pip install kombu 没有指定版本,您将获得最新版本,即使它与您环境中的其他内容发生冲突。这是how pip currently works 的一部分。您可以使用pipdeptree 查看环境的依赖关系树,包括任何冲突。
    • 实际上,从 pip 10 开始,您在安装任何冲突的库时都会收到警告。例如nameko 2.9.0 has requirement kombu&lt;4,&gt;=3.0.1, but you'll have kombu 4.2.1 which is incompatible. 安装仍在继续。
    猜你喜欢
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 2017-03-18
    • 2019-08-02
    相关资源
    最近更新 更多