# dubbo-simple
**Repository Path**: wuhao199346/dubbo-simple
## Basic Information
- **Project Name**: dubbo-simple
- **Description**: 简单的Dubbo项目,实现各种微服务特性
- **Primary Language**: Java
- **License**: MIT
- **Default Branch**: dev
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 1
- **Created**: 2024-07-28
- **Last Updated**: 2025-03-10
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# dubbo-simple
#### 介绍
简单的Dubbo项目,实现各种微服务特性
#### 软件架构
1. Dubbo实现RPC通信
2. 使用Nacos实现配置中心和注册中心
3. 使用Skyworking实现全链路追踪
4. 使用Sentinel实现流量控制、熔断降级、系统负载保护
#### 组件版本
- spring-boot-2.7.10
- dubbo-3.3.0-beta.1
- [OpenJDK21U-jdk_x64_windows_hotspot_21.0.4_7](https://adoptium.net/zh-CN/)
- [nacos-server-2.4.0-BETA](https://download.nacos.io/nacos-server/nacos-server-2.4.0.1.zip)
- [apache-skywalking-apm-10.0.1](https://dlcdn.apache.org/skywalking/10.0.1/apache-skywalking-apm-10.0.1.tar.gz)
- [apache-skywalking-java-agent-9.2.0](https://archive.apache.org/dist/skywalking/java-agent/9.2.0/apache-skywalking-java-agent-9.2.0.tgz)
- [sentinel-dashboard-1.8.8](https://github.com/alibaba/Sentinel/releases/download/1.8.8/sentinel-dashboard-1.8.8.jar)
- [apache-jmeter-5.6.3](https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.3.zip)
#### 创建Dubbo项目
1. 创建父模块
添加SpringBoot和Dubbo的依赖版本控制
```xml
org.springframework.boot
spring-boot-dependencies
${spring-boot.version}
pom
import
org.apache.dubbo
dubbo-bom
${dubbo.version}
pom
import
```
2. 创建子模块
添加Dubbo的Spring Boot启动依赖
```xml
org.apache.dubbo
dubbo-spring-boot-starter
```
启动类增加注解@EnableDubbo
```java
@EnableDubbo
@SpringBootApplication
public class StockApplication {
public static void main(String[] args) {
SpringApplication.run(StockApplication.class, args);
}
}
```
3. 在application.yml文件中配置Dubbo应用名称
```yaml
dubbo:
application:
name: StockApplication
```
#### 使用nacos实现配置中心
1. 增加配置中心依赖
```xml
org.apache.dubbo
dubbo-configcenter-nacos
```
2. 在application.yml文件中增加配置中心信息
```yaml
dubbo:
config-center:
namespace: dev
address: nacos://${nacos.address:127.0.0.1}:8848
```
3. 启动nacos,增加配置dubbo.properties


#### 使用nacos实现注册中心
1. 增加注册中心依赖
```xml
org.apache.dubbo
dubbo-registry-nacos
```
2. nacos中dubbo.properties配置增加注册中心配置

#### 实现简单RPC通信
1. 创建StockService作为Provider,使用注解@DubboService标识服务
```java
package com.wh.dubbo.stock.service;
import com.wh.dubbo.stock.api.StockService;
import com.wh.dubbo.stock.model.dto.DeductionDetailDTO;
import org.apache.dubbo.config.annotation.DubboService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
@DubboService
public class StockServiceImpl implements StockService {
@Override
public void deduction(List detailList) {
detailList.forEach(detail -> log.info("物品【{}】扣减库存【{}】成功", detail.getGoodsId(), detail.getCount()));
}
}
```
2. 创建OrderService作为Consumer,使用注解@DubboReference注入远端服务代理
```java
package com.wh.dubbo.order.service;
import com.wh.dubbo.order.api.OrderService;
import com.wh.dubbo.order.model.dto.OrderDetailDTO;
import com.wh.dubbo.stock.api.StockService;
import com.wh.dubbo.stock.model.dto.DeductionDetailDTO;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.config.annotation.DubboService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
@DubboService
public class OrderServiceImpl implements OrderService {
private static final Logger log = LoggerFactory.getLogger(OrderServiceImpl.class);
@DubboReference
private StockService stockService;
@Override
public String add(String userId, List detailList) {
String orderId = UUID.randomUUID().toString();
stockService.deduction(detailList.stream().map(detail -> {
DeductionDetailDTO dto = new DeductionDetailDTO();
dto.setGoodsId(detail.getGoodsId());
dto.setCount(detail.getCount());
return dto;
}).collect(Collectors.toList()));
log.info("订单【{}】下单成功", orderId);
return orderId;
}
}
```
#### 配置负载均衡策略
| 算法 | 特性 | 备注 | 配置值 |
| :---------------------------- | :---------------------- | :--------------------------------------------------- | :--------------- |
| Weighted Random LoadBalance | 加权随机 | 默认算法,默认权重相同 | random (默认) |
| RoundRobin LoadBalance | 加权轮询 | 借鉴于 Nginx 的平滑加权轮询算法,默认权重相同, | roundrobin |
| LeastActive LoadBalance | 最少活跃优先 + 加权随机 | 背后是能者多劳的思想 | leastactive |
| Shortest-Response LoadBalance | 最短响应优先 + 加权随机 | 更加关注响应速度 | shortestresponse |
| ConsistentHash LoadBalance | 一致性哈希 | 确定的入参,确定的提供者,适用于有状态请求 | consistenthash |
| P2C LoadBalance | Power of Two Choice | 随机选择两个节点后,继续选择“连接数”较小的那个节点。 | p2c |
| Adaptive LoadBalance | 自适应负载均衡 | 在 P2C 算法基础上,选择二者中 load 最小的那个节点 | adaptive |
1. 配置StockService的负载均衡策略为:最短响应优先 + 加权随机(shortestresponse)
```java
@DubboService(loadbalance = "shortestresponse")
public class StockServiceImpl implements StockService
```
2. 配置OrderService的负载均衡策略为:最少活跃优先 + 加权随机(leastactive)
```java
@DubboService(loadbalance = "leastactive")
public class OrderServiceImpl implements OrderService
```
#### 实现Skyworking全链路追踪
1. 增加版本控制
```xml
org.apache.skywalking
apm-toolkit-micrometer-1.10
8.14.0
```
2. 增加Skyworking依赖
```xml
org.apache.dubbo
dubbo-metrics-api
org.apache.skywalking
apm-toolkit-micrometer-1.10
org.springframework.boot
spring-boot-starter-actuator
```
3. 增加配置类
```java
package com.wh.dubbo.order.config;
import io.micrometer.observation.ObservationHandler;
import io.micrometer.observation.ObservationRegistry;
import org.apache.dubbo.rpc.model.ApplicationModel;
import org.apache.skywalking.apm.toolkit.micrometer.observation.SkywalkingDefaultTracingHandler;
import org.apache.skywalking.apm.toolkit.micrometer.observation.SkywalkingReceiverTracingHandler;
import org.apache.skywalking.apm.toolkit.micrometer.observation.SkywalkingSenderTracingHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ObservationConfiguration {
@ConditionalOnBean(ObservationRegistry.class)
@Bean
ApplicationModel applicationModel(@Autowired ObservationRegistry observationRegistry) {
ApplicationModel applicationModel = ApplicationModel.defaultModel();
observationRegistry.observationConfig()
.observationHandler(new ObservationHandler.FirstMatchingCompositeObservationHandler(
new SkywalkingSenderTracingHandler(), new SkywalkingReceiverTracingHandler(),
new SkywalkingDefaultTracingHandler()
));
applicationModel.getBeanFactory().registerBean(observationRegistry);
return applicationModel;
}
}
```
4. 配置启动时虚拟机参数
-javaagent:代理jar包路径
-DSW_AGENT_NAME=代理名称,也就是当前App的名称
```
-javaagent:D:\wuhao\dubbo-module\apache-skywalking-java-agent-9.2.0\skywalking-agent\skywalking-agent.jar
-DSW_AGENT_NAME=order
```
#### 使用Sentinel实现流量控制、熔断降级、系统负载保护
1. 增加依赖版本控制
```xml
com.alibaba.csp
sentinel-apache-dubbo-adapter
1.8.8
com.alibaba.csp
sentinel-transport-simple-http
1.8.8
```
2. 增加sentinel相关依赖
```xml
com.alibaba.csp
sentinel-apache-dubbo-adapter
com.alibaba.csp
sentinel-transport-simple-http
```
3. 在资源目录下增加sentinel配置文件 sentinel.properties
```properties
project.name=order
csp.sentinel.dashboard.server=127.0.0.1:8080
csp.sentinel.api.port=8722
```
4. 配置接口的流控规则和熔断规则


#### 使用 jmeter进行压力测试
1. 配置TestPlan


2. Skyworking和Sentinel展示



