apache / dubbo

The java implementation of Apache Dubbo. An RPC and microservice framework.
https://dubbo.apache.org/
Apache License 2.0
40.4k stars 26.41k forks source link

2.7版本的hessian協議無法正常工作 #5373

Closed cookiejoo closed 4 years ago

cookiejoo commented 4 years ago

請幫忙看看2.7版本的hessian協議問題

我司有其他同學也出現了這個問題了,provide已經注冊上去,consumer無法調用.

這個問題提了,沒有解決 https://github.com/apache/dubbo/issues/5278#event-2807490277

麻煩看看

cookiejoo commented 4 years ago

已经解决了,原因是server配置必须使用jetty的才能正常使用,server使用servlet则无法连接.

cookiejoo commented 4 years ago

再有,使用jetty模式.必须要引入eclipse的jetty的包,这个缺省不会带进来.

    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-servlet</artifactId>
    </dependency>
cookiejoo commented 4 years ago

按上面操作,普通对象没有问题,但是返回inputstream对象的话,拿不到数据,也不报错。

你返回这个对象是用来做文件的吗?貌似dubbo不建议做文件哦,我们的文件是用byte来返回的,而且也不建议是大文件,虽然我们也有大的,但是很少.如果大的多调几次就有oom问题导致机器挂死

enjoysun commented 4 years ago

i import jetty-servlet but still get this error

provider

server:
  port: 8080
  servlet:
    jsp:
      class-name: org.apache.dubbo.remoting.http.servlet.DispatcherServlet

#dubbo configuration
#
# scan base package
dubbo:
  scan:
    base-packages: com.yjcloud.material.collection.server.service
  protocols:
    dubbo:
      name: dubbo
      port: -1 # -1 
      payload: 11557050
      server: netty
      accepts: 1000
    hessian:
      name: hessian
      port: -1
      server: jetty # servlet
  application:
    qos-enable: false
  registry:
    address: spring-cloud://localhost
    group: collection-server
  provider:
    version: 1.0.0
    delay: -1
    timeout: 6000
    loadbalance: leastactive
    connections: 3  
@Service(protocol = "hessian")
public class FooImpl implements FooService {
    @Override
    public String say(byte[] bytes) {
        return String.format("hello %s", bytes.length);
    }
}

consumer

dubbo:
  registry:
    address: spring-cloud://localhost
  cloud:
    subscribed-services: ${provider.application.name}
  consumer:
    check: false
    version: 1.0.0
  application:
    qos-enable: false

server:
  port: 8082

provider:
  application:
    name: material-collection-server  
@RestController
    public class BarController {

        @Reference(protocol = "hessian")
        private FooService FooImpl;

        @GetMapping("/say")
        public String say() {
            File file = new File("/Users/myou/Downloads/apache-maven-3.5.4.zip");
            byte[] bytes = new byte[(int) file.length()];
            try {
                FileInputStream fileInputStream = new FileInputStream(file);
                fileInputStream.read(bytes);
                fileInputStream.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            String say = FooImpl.say(bytes);
            return say;
        }
    }

my pom lib version

spring-cloud:Hoxton.SR3
spring-boot:2.2.5.RELEASE
spring-cloud-alibaba-version:2.2.1.RELEASE
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-web</artifactId>
                </exclusion>
<!--                <exclusion>-->
<!--                    <groupId>org.springframework.boot</groupId>-->
<!--                    <artifactId>spring-boot-starter-tomcat</artifactId>-->
<!--                </exclusion>-->
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>com.yjcloud</groupId>
            <artifactId>material-api</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- Dubbo Spring Cloud Starter -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>

        <!-- Spring Cloud Nacos Service Discovery -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!--dubbo:hessian//-->
        <dependency>
            <groupId>com.caucho</groupId>
            <artifactId>hessian</artifactId>
        </dependency>

<!--        <dependency>-->
<!--            <groupId>org.springframework.boot</groupId>-->
<!--            <artifactId>spring-boot-starter-jetty</artifactId>-->
<!--        </dependency>-->

        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-servlet</artifactId>
        </dependency>
    </dependencies>

my error

"status":500,"error":"Internal Server Error","message":"Failed to invoke the method say in the service com.yjcloud.service.demo.FooService. Tried 3 times of the providers [192.168.99.61:80] (1/1) from the registry localhost:9090 on the consumer 127.0.0.1 using the dubbo version 2.7.6. Last error is: Failed to invoke remote service: interface com.yjcloud.service.demo.FooService, method: say, cause: 500: java.io.IOException: Server returned HTTP response code: 500 for URL: http://192.168.99.61:80?anyhost=true&application=demo-consumer&check=false&connections=3&delay=-1&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&init=false&interface=com.yjcloud.service.demo.FooService&loadbalance=leastactive&methods=say&pid=9432&protocol=hessian&qos.enable=false&register.ip=127.0.0.1&release=2.7.6&remote.application=material-collection-server&server=jetty&side=consumer&sticky=false&timeout=6000&timestamp=1595409800752&version=1.0.0","path":"/say"}

2020-07-22 17:23:56.652:WARN:oejs.HttpChannel:qtp951868096-50: / javax.servlet.ServletException: java.lang.NullPointerException at org.apache.dubbo.rpc.protocol.hessian.HessianProtocol$HessianHandler.handle(HessianProtocol.java:195) at org.apache.dubbo.remoting.http.servlet.DispatcherServlet.service(DispatcherServlet.java:61) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:755) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:547) at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1607) at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1297) at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:485) at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1577) at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1212) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) at org.eclipse.jetty.server.Server.handle(Server.java:500) at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:383) at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:547) at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:375) at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:270) at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103) at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.produce(EatWhatYouKill.java:135) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:806) at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:938) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.NullPointerException at org.apache.dubbo.rpc.protocol.hessian.HessianProtocol$HessianHandler.handle(HessianProtocol.java:193) at org.apache.dubbo.remoting.http.servlet.DispatcherServlet.service(DispatcherServlet.java:61) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:755) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:547) at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1607) at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1297) at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:485) at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1577) at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1212) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) at org.eclipse.jetty.server.Server.handle(Server.java:500) at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:383) at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:547) at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:375) at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:270) at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103) at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.produce(EatWhatYouKill.java:135) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:806) at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:938) at java.lang.Thread.run(Thread.java:748)

if i check protocol 'hessian' to 'dubbo', it work