5.Dubbo3新特性

1.注册模型的改变

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

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

5.Dubbo3新特性

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() {
        //&#x666E;&#x901A;&#x7684;&#x8C03;&#x7528;&#x65B9;&#x6CD5;
        Person wmd = personService.getPerson();
        Person ld = personService2.getPerson();
        return Arrays.asList(wmd,ld);
    }</person>

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

&#x4EE3;&#x7801;&#x6539;&#x9020;&#xFF1A;
    1.common&#x7684;pom&#x4E2D;&#x5F15;&#x5165;&#xFF0C;&#x5305;&#x542B;&#x4E86;&#x6D41;&#x5F0F;&#x76F8;&#x5173;&#x7C7B;&#x4FE1;&#x606F;
        <dependency>
            <groupid>org.apache.dubbo</groupid>
            <artifactid>dubbo-common</artifactid>
            <version>3.0.7</version>
        </dependency>
    2.consumer&#x548C;provider&#x7684;pom&#x4E2D;&#x5F15;&#x5165;triple&#x5305;&#xFF1A;
        <dependency>
            <groupid>org.apache.dubbo</groupid>
            <artifactid>dubbo-rpc-triple</artifactid>
            <version>3.0.7</version>
        </dependency>
    2.&#x670D;&#x52A1;api&#x6539;&#x9020;
        public interface PersonServiceApi {
            public Person getPerson();
            //&#x91CD;&#x70B9;1&#xFF1A;&#x589E;&#x52A0;&#x4E00;&#x4E2A;&#x670D;&#x52A1;&#x7AEF;&#x6D41;&#x5F0F;&#x53CD;&#x65B9;&#x6CD5;&#xFF0C;&#x4F20;&#x5165;&#x5165;&#x53C2;&#x548C;&#x4E00;&#x4E2A;&#x6D41;&#x5BF9;&#x8C61;
            /**
             * SERVER_STREAM
             * &#x670D;&#x52A1;&#x7AEF;&#x6D41;&#x5F0F;&#x8C03;&#x7528;
             *
             * @param person
             * @param response
             */
            default void getPersonServerStream(Person person, StreamObserver<person> response) {
            }
        }
   3.provider&#x4E1A;&#x52A1;&#x5B9E;&#x73B0;&#x7C7B;&#x6539;&#x9020;&#xFF1A;
       @DubboService(version = "person_verson1")
        public class PersonProviderServiceImpl implements PersonServiceApi {
            @Override
            public Person getPerson() {
                return new Person("&#x5434;&#x5B5F;&#x8FBE;", 18);
            }
            //&#x91CD;&#x70B9;2&#xFF1A;&#x5728;&#x539F;&#x59CB;&#x57FA;&#x7840;&#x4E0A;&#x52A0;&#x5165;&#x8BE5;&#x65B9;&#x6CD5;&#xFF0C;&#x5176;&#x5B9E;&#x5C31;&#x662F;&#x5EFA;&#x7ACB;&#x4E86;&#x4E00;&#x4E2A;&#x6682;&#x65F6;&#x7684;&#x957F;&#x8FDE;&#x63A5;
            @Override
            public void getPersonServerStream(Person person, StreamObserver<person> response) {
                System.out.println("&#x670D;&#x52A1;&#x7AEF;&#x63A5;&#x6536;&#x5230;&#x5BA2;&#x6237;&#x7AEF;&#x8BF7;&#x6C42;&#x53C2;&#x6570;&#xFF1A;" + person);
                //&#x91CD;&#x70B9;3&#xFF1A;&#x6BCF;&#x8C03;&#x7528;&#x4E00;&#x6B21;onNext&#x65B9;&#x6CD5;&#xFF0C;&#x5C31;&#x4F1A;&#x8FD4;&#x56DE;&#x4E00;&#x6B21;
                response.onNext(new Person("&#x5218;&#x4E39;",18));
                response.onNext(new Person("&#x5434;&#x56FD;&#x8BA1;",18));
                response.onNext(new Person("&#x5434;&#x4E1C;&#x4FA0;",18));
                //&#x91CD;&#x70B9;4&#xFF1A;&#x7ED3;&#x675F;&#x8C03;&#x7528;
                response.onCompleted();
                //&#x91CD;&#x70B9;5&#xFF1A;&#x5F02;&#x5E38;
                response.onError(new Exception());
            }
        }
    4.consumer&#x7684;&#x6539;&#x9020;
        @RestController
        public class PersonConsumerController {
            @DubboReference(version = "person_verson1")
            PersonServiceApi personService;
            @GetMapping("/consumer/getPerson")
            public void getPerson() {
               personService.getPersonServerStream(new Person("&#x5434;&#x5B5F;&#x8FBE;", 18), new StreamObserver<person>() {
                   //&#x91CD;&#x70B9;1&#xFF1A;&#x533F;&#x540D;&#x5185;&#x90E8;&#x7C7B;&#xFF0C;provider&#x6BCF;&#x8C03;&#x7528;&#x4E00;&#x6B21;onNext&#xFF0C;&#x5C31;&#x4F1A;&#x5C06;&#x4FE1;&#x606F;&#x8FD4;&#x56DE;&#x5230;&#x8FD9;&#x91CC;
                   @Override
                   public void onNext(Person data) {
                       System.out.println("&#x670D;&#x52A1;&#x7AEF;&#x8FD4;&#x56DE;&#x7684;&#x503C;&#xFF1A;"+data);
                   }
                   //&#x91CD;&#x70B9;2&#xFF1A;&#x540C;&#x7406;&#xFF0C;provider&#x8C03;&#x7528; onError&#x5C31;&#x4F1A;&#x8FD4;&#x56DE;&#x5230;&#x8FD9;
                   @Override
                   public void onError(Throwable throwable) {
                       System.out.println("&#x8C03;&#x7528;&#x5F02;&#x5E38;&#xFF1A;"+throwable.getMessage());
                   }
                    //&#x91CD;&#x70B9;2&#xFF1A;&#x540C;&#x7406;&#xFF0C;provider&#x8C03;&#x7528; onCompleted&#x5C31;&#x4F1A;&#x8FD4;&#x56DE;&#x5230;&#x8FD9;
                   @Override
                   public void onCompleted() {
                       System.out.println("&#x670D;&#x52A1;&#x7AEF;&#x8C03;&#x7528;&#x7ED3;&#x675F;&#xFF01;");
                   }
               });
            }
        }

provider&#x6253;&#x5370;&#xFF1A;
    &#x670D;&#x52A1;&#x7AEF;&#x63A5;&#x6536;&#x5230;&#x5BA2;&#x6237;&#x7AEF;&#x8BF7;&#x6C42;&#x53C2;&#x6570;&#xFF1A;Person{name='&#x5434;&#x5B5F;&#x8FBE;', age=18}

consumer&#x6253;&#x5370;&#xFF1A;
    &#x670D;&#x52A1;&#x7AEF;&#x8FD4;&#x56DE;&#x7684;&#x503C;&#xFF1A;Person{name='&#x5218;&#x4E39;', age=18}
    &#x670D;&#x52A1;&#x7AEF;&#x8FD4;&#x56DE;&#x7684;&#x503C;&#xFF1A;Person{name='&#x5434;&#x56FD;&#x8BA1;', age=18}
    &#x670D;&#x52A1;&#x7AEF;&#x8FD4;&#x56DE;&#x7684;&#x503C;&#xFF1A;Person{name='&#x5434;&#x4E1C;&#x4FA0;', age=18}
    &#x670D;&#x52A1;&#x7AEF;&#x8C03;&#x7528;&#x7ED3;&#x675F;&#xFF01;</person></person></person>

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

1.common&#x7684;&#x63A5;&#x53E3;&#x5C42;&#x6539;&#x9020;

    /**
     * &#x83B7;&#x53D6;&#x5BA2;&#x6237;&#x7AEF;&#x6D41;
     *
     * @param response &#x5165;&#x53C2;
     * @return &#x8FD4;&#x56DE;
     */
    public StreamObserver<person> getPeraonConsumerStream(StreamObserver<person> response);

2.provider&#x7684;&#x4E1A;&#x52A1;&#x5C42;&#x6539;&#x9020;
      @Override
    public StreamObserver<person> getPeraonConsumerStream(StreamObserver<person> response) {
        StreamObserver<person> streamObserver = new StreamObserver<person>() {
            @Override
            public void onNext(Person data) {
                System.out.println("&#x670D;&#x52A1;&#x7AEF;--->consumer&#x4F20;&#x6765;&#x7684;&#x503C;&#x662F;&#xFF1A;" + data);
            }

            @Override
            public void onError(Throwable throwable) {

            }

            @Override
            public void onCompleted() {
                System.out.println("&#x670D;&#x52A1;&#x7AEF;---->&#x8C03;&#x7528;&#x7ED3;&#x675F;&#xFF01;");
            }
        };
        response.onNext(new Person("&#x5218;&#x4E39;", 18));
        response.onCompleted();
        return streamObserver;
    }

 3.consumer&#x6539;&#x9020;
            @GetMapping("/getConumerStream")
            public void getConsumerStream() {
                StreamObserver<person> streamObserver = personService.getPeraonConsumerStream(new StreamObserver<person>() {
                    @Override
                    public void onNext(Person data) {
                        System.out.println("&#x5BA2;&#x6237;&#x7AEF;--->&#x63A5;&#x6536;&#x5230;&#x670D;&#x52A1;&#x7AEF;&#x53C2;&#x6570;&#xFF1A;" + data);

                    }

                    @Override
                    public void onError(Throwable throwable) {

                    }

                    @Override
                    public void onCompleted() {

                    }
                });
                streamObserver.onNext(new Person("&#x5434;&#x4E1C;&#x971E;",18));
                streamObserver.onNext(new Person("&#x5434;&#x56FD;&#x8BA1;",18));
                streamObserver.onCompleted();
            }

&#x8F93;&#x51FA;&#xFF1A;
        1.provider&#x8F93;&#x51FA;&#xFF1A;
            &#x670D;&#x52A1;&#x7AEF;--->consumer&#x4F20;&#x6765;&#x7684;&#x503C;&#x662F;&#xFF1A;Person{name='&#x5434;&#x4E1C;&#x971E;', age=18}
            &#x670D;&#x52A1;&#x7AEF;--->consumer&#x4F20;&#x6765;&#x7684;&#x503C;&#x662F;&#xFF1A;Person{name='&#x5434;&#x56FD;&#x8BA1;', age=18}
            &#x670D;&#x52A1;&#x7AEF;---->&#x8C03;&#x7528;&#x7ED3;&#x675F;&#xFF01;

        2.consumer&#x8F93;&#x51FA;&#xFF1A;
             &#x5BA2;&#x6237;&#x7AEF;--->&#x63A5;&#x6536;&#x5230;&#x670D;&#x52A1;&#x7AEF;&#x53C2;&#x6570;&#xFF1A;Person{name='&#x5218;&#x4E39;', age=18}</person></person></person></person></person></person></person></person>

时序图

5.Dubbo3新特性

讲解:

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

2.provider执行

streamObserver.onNext(new Person("&#x5434;&#x4E1C;&#x971E;",18));
streamObserver.onNext(new Person("&#x5434;&#x56FD;&#x8BA1;",18));
streamObserver.onCompleted();

服务端打印出:

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

3.consumer的方法执行到:

response.onNext(new Person("&#x5218;&#x4E39;", 18));
response.onCompleted();
return streamObserver;

客户端打印:

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

Original: https://www.cnblogs.com/wmd-l/p/16530514.html
Author: 努力的达子
Title: 5.Dubbo3新特性

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/570131/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球