跳转至

第七章:服务治理

服务路由

条件路由

# 条件路由规则
scope: application
force: true
runtime: true
enabled: true
key: user-service
conditions:
  - => host != 192.168.1.100  # 排除特定主机
  - => host = 192.168.1.101   # 只访问特定主机
// 通过 API 配置
RouterConfig router = new RouterConfig();
router.setRule("=> host != 192.168.1.100");

标签路由

// 服务端打标签
@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 配置

# application.yml
dubbo:
  metrics:
    protocol: prometheus
    port: 20882
    enable: true

Prometheus 集成

# prometheus.yml
scrape_configs:
  - job_name: 'dubbo'
    static_configs:
      - targets:
        - 'localhost:20882'

关键指标

指标 说明
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

下一章我们将学习生产实践。