第七章:服务治理¶
服务路由¶
条件路由¶
# 条件路由规则
scope: application
force: true
runtime: true
enabled: true
key: user-service
conditions:
- => host != 192.168.1.100 # 排除特定主机
- => host = 192.168.1.101 # 只访问特定主机
标签路由¶
// 服务端打标签
@DubboService(tag = "gray")
public class UserServiceImpl implements UserService {
// ...
}
// 消费端指定标签
@DubboReference(tag = "gray")
private UserService userService;
动态路由¶
import org.apache.dubbo.rpc.cluster.router.Router;
// 动态添加路由
Registry registry = registryFactory.getRegistry(registryUrl);
URL routerUrl = URL.valueOf("condition://0.0.0.0/com.example.UserService?rule=> host != 192.168.1.100");
registry.register(routerUrl);
动态配置¶
超时配置¶
# 动态配置
configVersion: v2.7
scope: service
key: com.example.UserService
enabled: true
configs:
- addresses: ["0.0.0.0"] # 所有地址
side: consumer # 消费端
parameters:
timeout: 3000 # 超时时间
负载均衡配置¶
# 动态配置
configVersion: v2.7
scope: service
key: com.example.UserService
enabled: true
configs:
- addresses: ["0.0.0.0"]
side: consumer
parameters:
loadbalance: roundrobin
集群配置¶
# 动态配置
configVersion: v2.7
scope: service
key: com.example.UserService
enabled: true
configs:
- addresses: ["0.0.0.0"]
side: consumer
parameters:
cluster: failfast
retries: 0
服务降级¶
Mock 降级¶
// 本地伪装
@DubboReference(mock = "return null")
private UserService userService;
// 返回默认值
@DubboReference(mock = "return {id:1,name:'default'}")
private UserService userService;
// 抛出异常
@DubboReference(mock = "throw com.example.ServiceException")
private UserService userService;
// 自定义 Mock 类
@DubboReference(mock = "com.example.UserServiceMock")
private UserService userService;
熔断降级¶
import org.apache.dubbo.rpc.cluster.filter.support.HystrixFilter;
// 启用 Hystrix 熔断
@DubboReference(
filter = "hystrix",
parameters = {
"hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds", "3000",
"hystrix.command.default.circuitBreaker.requestVolumeThreshold", "10",
"hystrix.command.default.circuitBreaker.errorThresholdPercentage", "50"
}
)
private UserService userService;
服务限流¶
TPS 限流¶
import org.apache.dubbo.rpc.filter.TpsLimitFilter;
// 服务端限流
@DubboService(
filter = "tps",
parameters = {
"tps", "100", // 每秒最多 100 次
"tps.interval", "1000" // 统计间隔 1 秒
}
)
public class UserServiceImpl implements UserService {
// ...
}
并发限流¶
// 服务端并发限制
@DubboService(
executes = 10, // 最大并发数
actives = 5 // 每个客户端最大并发数
)
public class UserServiceImpl implements UserService {
// ...
}
// 消费端并发限制
@DubboReference(actives = 5)
private UserService userService;
服务监控¶
Metrics 配置¶
Prometheus 集成¶
关键指标¶
| 指标 | 说明 |
|---|---|
| dubbo_provider_requests_total | 提供者请求总数 |
| dubbo_provider_requests_success | 提供者成功请求数 |
| dubbo_provider_requests_failure | 提供者失败请求数 |
| dubbo_provider_requests_elapsed | 提供者请求耗时 |
| dubbo_consumer_requests_total | 消费者请求总数 |
| dubbo_consumer_requests_success | 消费者成功请求数 |
| dubbo_consumer_requests_failure | 消费者失败请求数 |
链路追踪¶
SkyWalking 集成¶
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>8.15.0</version>
</dependency>
import org.apache.skywalking.apm.toolkit.trace.TraceContext;
@DubboService
public class UserServiceImpl implements UserService {
@Override
public User getUser(Long id) {
// 获取 Trace ID
String traceId = TraceContext.traceId();
System.out.println("Trace ID: " + traceId);
// 业务逻辑
return userMapper.selectById(id);
}
}
Zipkin 集成¶
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-instrumentation-dubbo-rpc</artifactId>
<version>5.15.0</version>
</dependency>
小结¶
服务治理要点:
- 服务路由:条件路由、标签路由、动态路由
- 动态配置:超时、负载均衡、集群配置
- 服务降级:Mock 降级、熔断降级
- 服务限流:TPS 限流、并发限流
- 服务监控:Metrics、Prometheus
- 链路追踪:SkyWalking、Zipkin
下一章我们将学习生产实践。