目录儿
八、远程调用-DubboSpringCloud
8.1 简介
Dubbo Spring Cloud
是阿里为了将Dubbo
框架与SpringCloud
技术栈结合而开发出来的框架。可以与SpringCloud
生态下的各种微服务组件如Nacos
、Zookeeper
等无缝集成。
Dubbo Spring Cloud
相比OpenFeign
的特点是它可以使用TCP
协议来调用接口。
8.2 集成 DubboSpringCloud
基于前面的sentinel-sample
项目复制一份修改,作为DubboSpringCloud
的模块基础。
8.2.1 创建api模块
public interface TestService { // 暴露出去的接口
String dubboTest(String message); // 测试方法
}
8.2.3 修改服务提供方模块
- 导入api模块
- 添加
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
注意:
要把热部署的依赖给去掉,不然会因为类加载器的问题报加载不到类的错误。
bootstrap.yml
添加dubbo
配置项
spring:
main:
allow-bean-definition-overriding: true # 新增 允许 bean 定义覆盖
# ...省略
dubbo: # 新增
scan: # 新增
base-packages: com.echoo.cloud.dubbo.provider.api.service.impl # 新增 dubbo 服务扫描基准包
protocol: # 新增 协议
name: dubbo # 新增 协议名称 dubbo
port: -1 # 新增 dubbo 协议端口( -1 表示自增,从 20880 开始)
registry: # 新增
address: spring-cloud://localhost # 新增 挂载到 Spring Cloud 注册中心
注意:
- dubbo的扫描包是指实现类所在的目录,而不是接口的目录
Dubbo Spring Cloud
基于Spring Cloud Commons
抽象实现Dubbo
服务注册与发现,应用只需增添外部化配置属性dubbo.registry.address = spring-cloud://localhost
,就能轻松地桥接到所有原生Spring Cloud
注册中心,包括:-Nacos
-Eureka
-Zookeeper
-Consul
- 在服务提供者模块实现接口
api
模块中的接口
@Service
public class TestServiceImpl implements TestService {
public String dubboTest(String message) {
return "服务员收到,over ovier";
}
}
@Service
是dubbo
的注解,别导错了
8.2.3 修改服务消费者模块
- 导入依赖
<!-- dubbo 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<!-- api 模块 -->
<dependency>
<groupId>com.echoo.cloud.dubbo</groupId>
<artifactId>api</artifactId>
</dependency>
记得服务消费方也要把热部署依赖给去掉,不然会报错加载不到类。
- 添加配置
dubbo: # 新增
cloud: # 新增
subscribed-services: dubbo-provider # 新增 订阅服务名
registry: # 新增
address: spring-cloud://localhost # 新增 挂载到 Spring Cloud 注册中心
protocol: # 新增 协议
name: dubbo # 新增 协议名称 dubbo
port: -1 # 新增 dubbo 协议端口( -1 表示自增,从 20880 开始)
spring:
main:
allow-bean-definition-overriding: true #新增 允许 bean 定义覆盖
...省略
- 服务消费方添加一个测试接口
测试接口调用远程接口
@Reference
private TestService testService;
@RequestMapping("/dubboTest")
public String dubboTest() {
return testService.dubboTest("来自消费者的调用");
}
注意:这里导入
访问服务消费方的测试接口TestService
是用dubbo
的@Reference
注解
- 访问测试接口
服务消费方成功调用服务提供方的接口,获取返回内容
8.3 传递对象
- 自定义参数对象和结果对象
在公共模块中创建Bean
类
@Getter
@Setter
public class Params implements Serializable {
private String message;
private Object object;
}
@Getter
@Setter
public class Result implements Serializable {
private Integer code;
private String description;
}
通过
Dubbo
框架传递的对象必须实现序列化接口Serializable
,否则会报错
- 在
api
模块定义一个新接口
public interface TestService {
Result dubboObjectTest(Params params); // 新增 对象传递测试接口
}
- 服务提供方实现这个接口
@Service
public class TestServiceImpl implements TestService {
...
public Result dubboObjectTest(Params params) {
Result result = new Result();
result.setCode(200);
result.setDescription(String.format("这里是服务提供方,接收到参数[%s,%s]", params.getMessage(), params.getObject().toString()));
return result;
}
}
- 服务消费方添加测试接口
@RequestMapping("/dubboObjectTest")
public Result dubboTest() {
Params params = new Params();
params.setMessage("呼叫远程服务");
params.setObject("假装有数据");
return testService.dubboObjectTest(params);
}
- 访问测试接口
传递毛问题