目录
在微服务架构中,微服务之间的调用一般我们有两种比较好的解决策略,分别是通过OpenFeign的基于http协议的传输的调用和基于RCP协议的Dubbo框架来实现高效传输。对比两个策略可以清晰看到:OpenFeign更适合于向外部系统提供的服务,因为http协议的restful风格请求兼容性很好,缺点是会比RPC协议的Dubbo传输效率稍低一些,下面来看一下,在微服务架构中我们如何使用Dubbo进行远程调用吧!
一、创建模块化项目
项目结构如下:
服务调用者和服务提供者共用api接口进行RCP调用,
服务提供者的依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nacos服务发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Dubbo Spring Cloud Starter -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<!--引入api包-->
<dependency>
<groupId>com.dragonwu</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
二、公共api接口模块
接口类会被服务提供者和服务调用者用到
public interface SayHelloService {
MsgDto sendMsg(String msg);
}
传输数据对象
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MsgDto implements Serializable {
String msg;
Date date;
}
三、服务提供者
配置类:
server:
port: 8001
spring:
application:
name: dubbo-producer-service
cloud:
nacos:
password:
username:
server-addr: nacos-server
dubbo:
protocol:
# 协议名称
name: dubbo
# dubbo协议缺省端口为20880,rmi协议缺省端口为1099,http和hessian协议缺省端口为80;
# 如果没有配置port,则自动采用默认端口,如果配置为-1,则会分配一个没有被占用的端口
# Dubbo 2.4.0+,分配的端口在协议缺省端口的基础上增加,确保端口可控
port: -1
registry:
# 前缀spring-cloud说明:挂载到spring-cloud 注册中心
address: spring-cloud://nacos-server:8848
@DubboCompoentScan //扫描指定包下的服务类
@SpringBootApplication
@DubboComponentScan(value = {"com.dragonwu.service.impl"}) //扫描指定包下的服务类
public class ProducerApplication {
public static void main(String[] args) {
SpringApplication.run(ProducerApplication.class, args);
}
}
@DubboService:标注此类为dubbo服务
@DubboService
public class SayHelloServiceImpl implements SayHelloService {
@Override
public MsgDto sendMsg(String msg) {
return new MsgDto("通过dubbo调用后:"+msg,new Date());
}
}
四、服务调用者
server:
port: 8002
spring:
application:
name: dubbo-consumer-service
cloud:
nacos:
password:
username:
server-addr: nacos-server
dubbo:
protocol:
# 协议名称
name: dubbo
port: -1
registry:
address: spring-cloud://nacos-server:8848
cloud:
# 要订阅的服务
subscribed-services:
- dubbo-producer-service
启动类
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
@DubboReference:指定要消费的服务接口
@RestController
public class ConsumerController {
@DubboReference
private SayHelloService sayHelloService;
@GetMapping("/sayHello/{msg}")
public String sayHello(@PathVariable("msg") String msg){
return sayHelloService.sendMsg(msg).toString();
}
}
这里直接就可以调用服务提供者的对应服务了,是不是很便捷!
五、测试
启动两个服务后注册到了Nacos中:
apiPost进行测试:
通过服务调用者调用服务消费者的服务成功,效率也杠杠的!
六、案例代码
SpringCloudAlibaba各技术栈实现的案例代码集 我的笔记: SpringCloudAlibaba各技术栈实现的案例代码集 我的笔记 - Gitee.com