1. 概述
dubbo是一款开源的rpc框架,用于微服务调用。相比更常见的feign,dubbo具有更好的性能,但在配置和使用过程中比feign稍微复杂一些。dubbo框架的使用方法不像feign这么固定,网上也有各种方案,本文基于Springcloudalibaba整合dubbo的方案,用nacos作为dubbo框架的注册中心。本文默认读者已经安装好了nacos服务端。
2. 使用方法
- 准备工作:准备两个微服务,订单微服务order,库存微服务stock,要实现的业务逻辑为,订单微服务通过dubbo远程调用库存微服务,实现库存的扣减。
- 父maven中配置依赖的版本管理、
<dependencyManagement>
<dependencies>
<!-- springboot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud Netflix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud alibaba-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 订单微服务和库存微服务都要导入以下依赖
<dependencies>
<!-- web -->
<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>
<!-- spring cloud alibaba整合dubbo-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<!-- 不加这个依赖会报错 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
</dependencies>
- 订单和库存微服务中,都要创建相同的业务接口(为dubbo远程调用准备的),和feign不同的是,feign框架基于被调用方提供controller(restful接口),而dubbo的使用是基于Service层的。订单微服务和库存微服务都要有StockService接口下的reduceStock方法。由于代码重复,也可以单独准备一个模块,只定义这些接口,然后让订单微服务和库存微服务都依赖这个模块。
public interface StockService {
// 扣减库存
public String reduceStock();
}
- 先明确个概念,订单微服务这样的调用方称为服务消费者consumer,库存微服务这样的被调用方称为服务提供者provider
- 在服务提供者库存微服务中,实现接口StockService,注解@DubboService表示类中的方法可以被服务消费者通过dubbo远程调用
import org.apache.dubbo.config.annotation.DubboService;
@DubboService
public class StockServiceImpl implements StockService {
@Override
public String reduceStock() {
return "服务提供方,扣减库存";
}
}
- 服务提供者stock微服务的application.yml配置文件,一定要注意,nacos配置的命名空间和group在dubbo配置中的address以拼接的形式配置。
# 微服务端口号
server:
port: 8087
# 微服务名称
spring:
application:
name: dubbo-provider-stock
cloud:
nacos: # 配置nacos
discovery:
server-addr: http://192.168.40.129:8848/
namespace: 6f53617b-d804-43f1-92c8-d71d3f3d0683
group: myGroup
config:
enabled: true
dubbo:
scan:
# 配置dubbo提供服务的包扫描,扫描被@DubboService注解配置的类
base-packages: com.cabbage.service.impl
protocol: # 固定写法
name: dubbo
port: -1
registry: # 配置dubbo使用nacos作为注册中心
id: nacos
address: nacos://192.168.40.129:8848?namespace=6f53617b-d804-43f1-92c8-d71d3f3d0683&group=myGroup
- 开始实现服务消费者订单微服务,application.yml配置文件(包含负载均衡的配置)
# 微服务名称
spring:
application:
name: dubbo-consumer-order
cloud:
nacos:
discovery:
server-addr: http://192.168.40.129:8848/
namespace: 6f53617b-d804-43f1-92c8-d71d3f3d0683
group: myGroup
config:
enabled: true
dubbo:
protocol:
name: dubbo
port: -1
registry:
id: nacos
address: nacos://192.168.40.129:8848?namespace=6f53617b-d804-43f1-92c8-d71d3f3d0683&group=myGroup
cloud:
# 表示要订阅服务的服务名
subscribed-services: dubbo-provider-stock
# 实现负载均衡
consumer: # 服务消费者如何选择服务提供者
# 设置负载均衡算法为最短响应时间,在消费者端,Dubbo 将会选择当前响应时间最短的服务提供者来发送请求,以确保尽可能快速地获取服务响应。
loadbalance: leastactive
# 以下被注释的配置为,以下被注释的配置为,在服务提供者端配置负载均衡策略,可以更灵活地控制服务提供者的负载情况,使得服务能够更有效地分配和利用资源。如果两个负载均衡不一样,以consumer为准
# provider:
# loadbalance: leastactive
- 编写测试接口
@RestController
public class OrderController {
@DubboReference
private StockService service;
@GetMapping("/reduceStock")
public String reduceStock(){
String result = service.reduceStock();
return result;
}
}
- 测试,以下为nacos中的服务列表,用postman进行测试