feiyuw / dubbo-py

Dubbo(Hessian2) protocol codec and provider/consumer library
BSD 2-Clause "Simplified" License
15 stars 4 forks source link

提供的provider,调用时提示WARNING:root:no handler for b'com.****.mock.demo.api.IMatchService55'.b'$invoke' #5

Closed cqrichard2018 closed 4 years ago

cqrichard2018 commented 4 years ago

对比了一下,开发说需要加group,就在server中增加了group,timeout 同时在url = f'dubbo://{self._host}:{self._port}/{service}?anyhost=true增加了{self._app}/ 但是增加了后调用依然有问题,我是通过jmeter调用的,麻烦大神帮忙看看是怎么回事,谢谢 url = f'dubbo://{self._host}:{self._port}/{self._app}/{service}?anyhost=true class DubboService(object): ''' Dubbo service class, provide dubbo service:

  1. register
  2. handler ''' def init(self, port, app, group="open-platform",timeout=30000,owner="member",dubbo_version='2.5.3'): self._host = get_pub_ip() self._port = port self._app = app self._dubbo_version = dubbo_version self._services = {} # {'service-1': {method1: handler-1, method2: handler-2}} self._server = _ServerThread(_DubboServer(('0.0.0.0', self._port), _get_dubbo_request_handler(self._services)))

    by Richard

    self._group = group
    self._timout = timeout
    # self._generic = generic
    self._owner = owner

    def register(self, zk, version='1.0.0', revision='1.0.0'): client = KazooClient(zk) client.start() for service, methods in self._services.items(): logging.info(f'register service "{service}", methods "{methods}" to zookeeper "{zk}"')

    url = f'dubbo://{self._host}:{self._port}/{service}?anyhost=true&application={self._app}&dubbo={self._dubbo_version}&interface={service}&methods={",".join(methods)}&pid={next(_pid_gen)}&revision={revision}&side=provider&timestamp={get_timestamp()}&version={version}'

        url = f'dubbo://{self._host}:{self._port}/{self._app}/{service}?anyhost=true&application={self._app}&default.timeout={self._timout}&dubbo={self._dubbo_version}&generic=false&group={self._group}&interface={service}&methods={",".join(methods)}&owner={self._owner}&pid={next(_pid_gen)}&revision={revision}&side=provider&timestamp={get_timestamp()}&version={version}'
        print(url)
        client.ensure_path(f'/dubbo/{service}/providers/{quote_plus(url)}')
        print(f'/dubbo/{service}/providers/{quote_plus(url)}')
cqrichard2018 commented 4 years ago

不知道是不是通过jmeter调用,没有带invoker的原因, handler = handler_map.get(msg.service_name.decode(), {}).get(msg.method_name.decode())

                print("================================================================")
                print(msg.service_name.decode())
                print(msg.method_name.decode())
                print("================================================================")

结果: image 如果是这个原因,不知道能不能解决这个问题,谢谢

feiyuw commented 4 years ago

确认一下:dubbo-py作为server端,jmeter是客户端对吗? 模拟的service是怎么定义的? 请把错误信息贴一下,最好能把抓的包也放上去

cqrichard2018 commented 4 years ago

dubbo-py作为server端,jmeter是客户端,问题已经解决了,是jmeter发送消息时,服务端要对handler单独进行处理。 请问有方法可以在service不停止的情况下,动态新增接口,方法或者动态更新接口对应的方法吗

feiyuw commented 4 years ago

动态新增和更新方法再调用service.add_method就可以了,内部就是维护了一个service和handler的map,add_method所做的就是更新这个map。

cqrichard2018 commented 4 years ago

大佬,我现在遇到一个棘手的问题,我目前可以在我自己的电脑上开启dubbo服务,并成功注册到本机的zk上,然后可以调用成功。但是现在我要把dubbo服务移植到另外一个dubbo服务上(真实环境), 这个可以嘛? 直接将server.py 中self._host改为对应地远程dubbo admin地址?我试了下,好像不行。 def init(self, port, app, group="open-platform",timeout=30000,owner="member",dubbo_version='2.5.3',dubbo_admin='127.0.0.1'): self._host = get_pub_ip()

feiyuw commented 4 years ago

大佬,我现在遇到一个棘手的问题,我目前可以在我自己的电脑上开启dubbo服务,并成功注册到本机的zk上,然后可以调用成功。但是现在我要把dubbo服务移植到另外一个dubbo服务上(真实环境), 这个可以嘛? 直接将server.py 中self._host改为对应地远程dubbo admin地址?我试了下,好像不行。 def init(self, port, app, group="open-platform",timeout=30000,owner="member",dubbo_version='2.5.3',dubbo_admin='127.0.0.1'): self._host = get_pub_ip()

没有get到你的点,能把具体的错误贴一下吗? 当前实现里面,listen的是0.0.0.0,self._host是获取本机的public ip地址注册到zk上。

cqrichard2018 commented 4 years ago

是我理解错误了,只需要注册到对应的远端zk上,provider写本地服务器就解决问题了,多谢

sym695989697 commented 4 years ago

dubbo-py作为server端,jmeter是客户端,问题已经解决了,是jmeter发送消息时,服务端要对handler单独进行处理。 请问有方法可以在service不停止的情况下,动态新增接口,方法或者动态更新接口对应的方法吗

解决方法能贴一下么?