Skip to content

微服务中如何集成Feign+Sentinel来实现容错处理

字数
576 字
阅读时间
3 分钟

1 引入依赖

在微服务项目的pom.xml中加入以下依赖:

xml
<!-- Spring Cloud Feign 依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

<!-- Sentinel 依赖 -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.3</version> <!-- 请根据实际版本替换 -->
</dependency>

<!-- Sentinel 整合 Spring Cloud Alibaba -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2 配置 Feign 和 Sentinel

在应用的配置文件application.yml中,启用Feign和Sentinel的相关配置:

yaml
feign:
  sentinel:
    enabled: true # 启用 Feign 和 Sentinel 集成

3 创建 Feign 接口

定义一个 Feign 客户端接口,指定服务名和接口路径,例如:

java
@FeignClient(name = "example-service", fallback = ExampleServiceFallback.class)
public interface ExampleServiceClient {

    @GetMapping("/example/data")
    String getExampleData();
}

4 实现 Fallback 类

定义一个 Fallback 类,实现ExampleServiceClient接口,以处理请求失败时的容错逻辑:

java
import org.springframework.stereotype.Component;

@Component
public class ExampleServiceFallback implements ExampleServiceClient {

    @Override
    public String getExampleData() {
        return "Fallback response: Service is unavailable";
    }
}

在这个类中,当ExampleServiceClient调用失败时,将自动返回getExampleData方法中的容错信息。

5 启用 Feign 和 Sentinel

在 Spring Boot 应用主类上添加@EnableFeignClients@EnableCircuitBreaker注解,启用 Feign 和 Sentinel 的熔断功能:

java
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableFeignClients
@EnableCircuitBreaker
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

6 配置 Sentinel 控制台(可选)

为了便于监控和管理流控规则,可以配置 Sentinel 控制台。下载并启动 Sentinel 控制台,然后在应用配置文件中指定控制台地址,例如:

yaml
spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080 # Sentinel 控制台地址
        port: 8719 # 服务端口

7 定义限流和熔断规则

通过 Sentinel 控制台,或者在代码中动态配置限流、熔断等规则。例如,可以在项目中定义一个初始化类,将限流规则写入 Sentinel:

java
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;

import javax.annotation.PostConstruct;
import java.util.Collections;

@Component
public class SentinelRuleConfiguration {

    @PostConstruct
    public void initFlowRules() {
        FlowRule rule = new FlowRule();
        rule.setResource("getExampleData");
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule.setCount(5); // QPS限制为5
        FlowRuleManager.loadRules(Collections.singletonList(rule));
    }
}

这样,调用getExampleData接口时,当请求数超过5 QPS时,会触发 Sentinel 的流控策略。

8 总结

以上步骤完成后,Feign 和 Sentinel 集成的容错处理就配置完成了。