Dubbo作为一个RPC调用框架作用就是让服务具有RPC调用的能力
RPC就是远程调用就像本地调用一个Bean的方法那样
调用者不用去写提供者的路径等
zk在这里做注册中心用的
提供者要注册到注册中心,注册:host、port、协议等
消费者读取配置中心配置缓存后,发送RPC请求调用提供者
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-dependencies-zookeeper-curator5artifactId>
<type>pomtype>
<exclusions>
<exclusion>
<artifactId>slf4j-reload4jartifactId>
<groupId>org.slf4jgroupId>
exclusion>
exclusions>
dependency>
消费者和提供者都要使用的
package org.apache.dubbo.springboot.demo;
public interface DemoService {
String sayHello(String name);
}
需要在消费者和提供者的Application服务类上添加org.apache.dubbo.config.spring.context.annotation.EnableDubbo 注解
package org.apache.dubbo.springboot.demo.provider;
import org.apache.dubbo.config.annotation.DubboService;
import org.apache.dubbo.springboot.demo.DemoService;
@DubboService
public class DemoServiceImpl implements DemoService {
@Override
public String sayHello(String name) {
return "Hello " + name;
}
}
dubbo:
application:
name: dubbo-springboot-demo-provider
protocol:
name: dubbo
port: -1
registry:
address: zookeeper://${zookeeper.address:127.0.0.1}:2181
dubbo:
application:
name: dubbo-springboot-demo-consumer
protocol:
name: dubbo
port: -1
registry:
address: zookeeper://${zookeeper.address:127.0.0.1}:2181
在Bean中引入依赖
@DubboReference
private DemoService demoService;
//直接调用即可
demoService.sayHello("world")
如果需要立即调用的话
启动的时候先启动提供者
后启动消费者
Http 1.0 和1.1 版本会额外带有很多没有用的参数
并且只能一次获取到请求的响应后才能继续下一次的请求
没有参数对应请求和相应
dubbo协议就支撑请求和相应分开(请求中会带有请求id,在相应的时候会根据id关联),且所有传输字段都是自己需要的
但是很显然,dubbo只能本框架使用,所以后续dubbo提供使用了http2为基础的新协议,方便和其他框架集成
之前Dubbo协议还是存在一些问题,就是没办法很方便的跨架构,跨语言调用
所以又做了一个Triple协议,这个协议是基于 http2.0,兼容了兼容性和性能
并且支持流式调用
所以在dubbo3.0之后就用Triple协议 作为默认协议了
流式调用就是服务端可以一个请求,分多次返回给调用端
引入依赖
<dependencies>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-commonartifactId>
<version>3.0.7version>
dependency>
dependencies>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-rpc-tripleartifactId>
<version>3.0.7version>
dependency>
public interface UserService {
// SERVER_STREAM
default void sayHelloServerStream(String name, StreamObserver<String> response) {
}
}
//实现类处理
// SERVER_STREAM
@Override
public void sayHelloServerStream(String name, StreamObserver<String> response) {
response.onNext(name + " hello");
response.onNext(name + " world");
response.onCompleted();
}
StreamObserver 就可以多次塞入返回值,最后调用onCompleted标识返回结束
调用者会次接到返回,并处理
userService.sayHelloServerStream("zhouyu", new StreamObserver<String>() {
@Override
public void onNext(String data) {
// 服务端返回的数据
System.out.println(data);
}
@Override
public void onError(Throwable throwable) {}
@Override
public void onCompleted() {
System.out.println("complete");
}
});
双端流就是方法的入参和出参都是一个Steam
服务端:
// CLIENT_STREAM
@Override
public StreamObserver<String> sayHelloStream(StreamObserver<String> response) {
return new StreamObserver<String>() {
@Override
public void onNext(String data) {
// 接收客户端发送过来的数据,然后返回数据给客户端
response.onNext("result:" + data);
}
@Override
public void onError(Throwable throwable) {}
@Override
public void onCompleted() {
System.out.println("completed");
}
};
}
消费端
StreamObserver<String> streamObserver = userService.sayHelloStream(new StreamObserver<String>() {
@Override
public void onNext(String data) {
System.out.println("接收到响应数据:"+ data);
}
@Override
public void onError(Throwable throwable) {}
@Override
public void onCompleted() {
System.out.println("接收到响应数据完毕");
}
});
// 发送数据
streamObserver.onNext("request zhouyu hello");
streamObserver.onNext("request zhouyu world");
streamObserver.onCompleted();
消费端传入2次入参
streamObserver.onNext("request zhouyu hello");
streamObserver.onNext("request zhouyu world");
服务端进入处理
void onNext(String data)
服务端返回流,进入消费端Stream处理
userService.sayHelloStream(new StreamObserver<String>()