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);
}</person>
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}
服务端调用结束!</person></person></person>
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}</person></person></person></person></person></person></person></person>
时序图
讲解:
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}
Original: https://www.cnblogs.com/wmd-l/p/16530514.html
Author: 努力的达子
Title: 5.Dubbo3新特性
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/570131/
转载文章受原作者版权保护。转载请注明原作者出处!