5.Dubbo3新特性

1.注册模型的改变

2.x版本时一个接口就是一个服务

3.x引入了全新的基于应用粒度的服务发现机制

zk的可视化工具,可以看出,dubbo3.x兼容了之前2.x以接口名称为key,进行注册,也支持基于应用注册

这个可以根据配置进行更改:
1.接口和应用都注册(默认)
    dubbo.application.register-mode=all
    
2.基于接口注册
    dubbo.application.register-mode=interface
    
2.基于应用注册
    dubbo.application.register-mode=instance

 

2.下一代RPC通信协议

定义了全新的rpc通信协议-Triple,一句话概括Triple:它是基于HTTP/2构建的rpc协议,完全兼容grpc,并在此基础上扩展出更丰富的东西

如何使用triple协议呢

provider配置文件中

server.port=8080
dubbo.application.name=provider-application
#指定dubbo的通信协议为triple
dubbo.protocol.name=tri
dubbo.protocol.port=20880
dubbo.registry.address=zookeeper://192.168.2.128:2181
dubbo.application.register-mode=instance

服务调用分为三种,一种就是正常的调用方法的形式:

1.UNARY:正常的调用方法

provider对应的方法:
    @DubboService(version = "person_verson1")
    public class PersonProviderServiceImpl implements PersonServiceApi {
        public Person getPerson() {
            return new Person("吴孟达", 18);
        }
    }

consumer对应的方法:
    @DubboReference(version = "person_verson1")
    PersonServiceApi personService;
    @DubboReference(version = "person_verson2")
    PersonServiceApi personService2;

    @GetMapping("/consumer/getPerson")
    public List<Person> getPerson() {
        //普通的调用方法
        Person wmd = personService.getPerson();
        Person ld = personService2.getPerson();
        return Arrays.asList(wmd,ld);
    }

2.SERVER_STREAM(服务端流式调用)

代码改造:
    1.common的pom中引入,包含了流式相关类信息
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-common</artifactId>
            <version>3.0.7</version>
        </dependency>
    2.consumer和provider的pom中引入triple包:
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-rpc-triple</artifactId>
            <version>3.0.7</version>
        </dependency>
    2.服务api改造
        public interface PersonServiceApi {
            public Person getPerson();
            //重点1:增加一个服务端流式反方法,传入入参和一个流对象
            /**
             * SERVER_STREAM
             * 服务端流式调用
             *
             * @param person
             * @param response
             */
            default void getPersonServerStream(Person person, StreamObserver<Person> response) {
            }
        }
   3.provider业务实现类改造:
       @DubboService(version = "person_verson1")
        public class PersonProviderServiceImpl implements PersonServiceApi {
            @Override
            public Person getPerson() {
                return new Person("吴孟达", 18);
            }
            //重点2:在原始基础上加入该方法,其实就是建立了一个暂时的长连接
            @Override
            public void getPersonServerStream(Person person, StreamObserver<Person> response) {
                System.out.println("服务端接收到客户端请求参数:" + person);   
                //重点3:每调用一次onNext方法,就会返回一次
                response.onNext(new Person("刘丹",18));
                response.onNext(new Person("吴国计",18));
                response.onNext(new Person("吴东侠",18));
                //重点4:结束调用
                response.onCompleted();
                //重点5:异常
                response.onError(new Exception());
            }
        }
    4.consumer的改造
        @RestController
        public class PersonConsumerController {
            @DubboReference(version = "person_verson1")
            PersonServiceApi personService;
            @GetMapping("/consumer/getPerson")
            public void getPerson() {
               personService.getPersonServerStream(new Person("吴孟达", 18), new StreamObserver<Person>() {
                   //重点1:匿名内部类,provider每调用一次onNext,就会将信息返回到这里
                   @Override
                   public void onNext(Person data) {
                       System.out.println("服务端返回的值:"+data);
                   }
                   //重点2:同理,provider调用 onError就会返回到这
                   @Override
                   public void onError(Throwable throwable) {
                       System.out.println("调用异常:"+throwable.getMessage());
                   }
                    //重点2:同理,provider调用 onCompleted就会返回到这
                   @Override
                   public void onCompleted() {
                       System.out.println("服务端调用结束!");
                   }
               });
            }
        }
        


provider打印:
    服务端接收到客户端请求参数:Person{name='吴孟达', age=18}

consumer打印:
    服务端返回的值:Person{name='刘丹', age=18}
    服务端返回的值:Person{name='吴国计', age=18}
    服务端返回的值:Person{name='吴东侠', age=18}
    服务端调用结束!

3.Client_Stream(客户端流、双端流)

1.common的接口层改造
   
    /**
     * 获取客户端流
     *
     * @param response 入参
     * @return 返回
     */
    public StreamObserver<Person> getPeraonConsumerStream(StreamObserver<Person> response); 

2.provider的业务层改造
      @Override
    public StreamObserver<Person> getPeraonConsumerStream(StreamObserver<Person> response) {
        StreamObserver<Person> streamObserver = new StreamObserver<Person>() {
            @Override
            public void onNext(Person data) {
                System.out.println("服务端--->consumer传来的值是:" + data);
            }

            @Override
            public void onError(Throwable throwable) {

            }

            @Override
            public void onCompleted() {
                System.out.println("服务端---->调用结束!");
            }
        };
        response.onNext(new Person("刘丹", 18));
        response.onCompleted();
        return streamObserver;
    }

 3.consumer改造
            @GetMapping("/getConumerStream")
            public void getConsumerStream() {
                StreamObserver<Person> streamObserver = personService.getPeraonConsumerStream(new StreamObserver<Person>() {
                    @Override
                    public void onNext(Person data) {
                        System.out.println("客户端--->接收到服务端参数:" + data);

                    }

                    @Override
                    public void onError(Throwable throwable) {

                    }

                    @Override
                    public void onCompleted() {

                    }
                });
                streamObserver.onNext(new Person("吴东霞",18));
                streamObserver.onNext(new Person("吴国计",18));
                streamObserver.onCompleted();
            }
        
输出:
        1.provider输出:
            服务端--->consumer传来的值是:Person{name='吴东霞', age=18}
            服务端--->consumer传来的值是:Person{name='吴国计', age=18}
            服务端---->调用结束!

        2.consumer输出:
             客户端--->接收到服务端参数:Person{name='刘丹', age=18}

 时序图

 

讲解:

  

1.当接口调用http://localhost:8081/getConumerStream时,provider先创建一个StreamObserver流用于接收consumer返回的消息

2.provider执行

streamObserver.onNext(new Person("吴东霞",18));
streamObserver.onNext(new Person("吴国计",18));
streamObserver.onCompleted();

服务端打印出:

服务端--->consumer传来的值是:Person{name='吴东霞', age=18}
服务端--->consumer传来的值是:Person{name='吴国计', age=18}
服务端---->调用结束!

3.consumer的方法执行到:

response.onNext(new Person("刘丹", 18));
response.onCompleted();
return streamObserver;

 客户端打印:

客户端--->接收到服务端参数:Person{name='刘丹', age=18}

posted @ 2022-07-28 22:34  努力的达子  阅读(915)  评论(0)    收藏  举报