Sentinel+Feign熔断降级处理学习入门

2024/11/7 23:02:59

本文主要是介绍Sentinel+Feign熔断降级处理学习入门,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

概述

本文将带你学习sentinel+Feign熔断降级处理的入门知识,包括Sentinel和Feign的基本概念、作用和优势。通过实际配置和示例,你将了解如何在项目中集成Sentinel和Feign,并实现服务的熔断降级处理。

引入Sentinel和Feign

什么是Sentinel

Sentinel 是阿里巴巴开源的一款轻量级、高性能的 Java 应用防护框架。它提供了强大的流量控制、熔断降级、系统保护等功能,能够帮助开发者解决流量过载和系统稳定性的问题。Sentinel 采用了流式的数据处理模型,通过单一的API进行集成,支持Java SE、Java EE、Spring Cloud、Dubbo等多种运行环境。

什么是Feign

Feign 是一个声明式的Web服务客户端,它可以生成HTTP请求,它是基于Ribbon和RestTemplate进行的封装,可以用来进行服务间通信。Feign的核心特性是它支持多种注解,例如@GET@POST等,使得开发者可以像调用本地方法一样调用远程服务。

Sentinel和Feign的作用和优势

  • Sentinel的作用和优势

    • 高性能的流量控制:Sentinel 可以根据业务需求设置流量的阈值,从而限制请求的通过率,防止因流量过大导致服务过载。
    • 熔断降级:当服务出现故障时,Sentinel 可以自动熔断这些故障服务,防止故障服务影响整个系统。
    • 系统保护:Sentinel 可以监控系统的整体负载情况,当系统负载过高时,可以自动进行熔断,保证系统的稳定性。
  • Feign的作用和优势
    • 简单易用:通过注解的方式定义服务接口,使得服务调用变得非常简单。
    • 与Ribbon集成:Feign 默认集成了Ribbon,可以方便地进行负载均衡。
      .
    • 与Spring Cloud集成:Feign 可以非常方便地与Spring Cloud集成,使得微服务架构的构建变得更加简单。

设置项目环境

安装Java开发环境

首先,你需要安装Java开发环境,确保你的计算机上已经安装了JDK。你可以通过以下命令来检查是否已经安装了JDK:

java -version

如果还没有安装,你可以从Oracle官网或者OpenJDK下载安装相应的版本。

引入Sentinel和Feign依赖

在你的项目中引入Sentinel和Feign的依赖,以Spring Boot为例,你可以在pom.xml中添加以下依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-feign</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>
</dependencies>

配置Sentinel和Feign的基本设置

在Spring Boot项目中,可以通过配置文件来设置Sentinel和Feign的基本参数。以下是一个基本的配置示例:

spring:
  cloud:
  sentinel:
    transport:
      port: 8719
      dashboard: localhost:8080
feign:
  client:
    config:
      default:
        connectTimeout: 5000
        readTimeout: 5000

Sentinel和Feign的基础使用

创建服务提供者

服务提供者是一个提供服务的微服务应用。以下是一个简单的服务提供者示例:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@FeignClient(name = "service-provider", url = "http://localhost:8081")
public interface ServiceProviderClient {
    @GetMapping("/provider")
    String getProvider(@RequestParam("id") int id);
}

创建服务消费者

服务消费者是一个调用服务提供者服务的微服务应用。以下是一个简单的服务消费者示例:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ServiceConsumerController {
    @Autowired
    private ServiceProviderClient serviceProviderClient;

    @GetMapping("/consumer")
    public String getConsumer(@RequestParam("id") int id) {
        return serviceProviderClient.getProvider(id);
    }
}

使用Feign进行服务调用

在服务消费者中,我们可以通过注入ServiceProviderClient来调用服务提供者的接口,如下所示:

@GetMapping("/consumer")
public String getConsumer(@RequestParam("id") int id) {
    return serviceProviderClient.getProvider(id);
}

使用Sentinel进行流控和熔断配置

在服务提供者中,我们可以通过配置Sentinel规则来进行流控和熔断配置。在application.yml中添加以下配置:

spring:
  cloud:
    sentinel:
      filter:
        enabled: true
      transport:
        dashboard: localhost:8080

实现Feign的熔断降级处理

演示服务故障场景

为了演示服务故障场景,可以在服务提供者中模拟一个异常情况,例如:

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.SphU;
import org.springframework.stereotype.Service;

@Service
public class ServiceProviderImpl {

    @GetMapping("/provider")
    @SentinelResource(value = "provider", blockHandler = "handleException")
    public String getProvider(@RequestParam("id") int id) {
        try (SphU.SphEntry entry = SphU.entry("provider")) {
            if (id == 1) {
                throw new RuntimeException("Service Error");
            }
            return "Provider " + id;
        } catch (BlockException e) {
            return "Fallback";
        }
    }

    public String handleException(BlockException blockException) {
        return "Fallback";
    }
}

配置Feign的熔断降级策略

application.yml中配置Feign的熔断降级策略:

feign:
  hystrix:
    enabled: true
  client:
    config:
      default:
        connectTimeout: 5000
        readTimeout: 5000
        hystrix:
          enabled: true

利用Sentinel进行熔断处理的实战演示

在服务提供者中,可以通过Sentinel控制台来查看熔断状态。在控制台中,我们可以设置熔断规则,例如:

  • 设置资源名称为provider
  • 设置异常比例为50%
  • 设置最小请求数为5

Sentinel规则详解

熔断降级规则

Sentinel的熔断降级规则主要通过SphU方法来实现,例如:

try (Entry entry = SphU.entry("provider")) {
    // 业务逻辑处理
} catch (BlockException ex) {
    // 处理熔断逻辑
}

流量控制规则

Sentinel的流量控制规则主要是通过FlowRule类来定义,例如:

FlowRule rule = new FlowRule("provider");
rule.setCount(10);
rule.setGrade(FlowRuleConstant.FLOW_GRADE_QPS);
rule.setLimitCount(10);
rule.setWarmUpPeriodMs(1000);
rule.setWarmUpMaxRequestCount(100);
FlowRuleManager.loadRules(Collections.singletonList(rule));

系统保护规则

Sentinel的系统保护规则主要是通过SystemRule类来定义,例如:

SystemRule rule = new SystemRule();
rule.setCpuThreshold(60);
rule.setLoadThreshold(1000);
SystemRuleManager.loadRules(Collections.singletonList(rule));

测试与调试

单元测试和集成测试方法

单元测试通常使用JUnit和Mockito等工具,例如:

import static org.junit.Assert.assertEquals;

import org.junit.Test;
import org.mockito.Mockito;

public class ServiceConsumerControllerTest {
    @Test
    public void testGetConsumer() {
        ServiceProviderClient mockClient = Mockito.mock(ServiceProviderClient.class);
        Mockito.when(mockClient.getProvider(1)).thenReturn("Provider 1");

        ServiceConsumerController controller = new ServiceConsumerController();
        controller.serviceProviderClient = mockClient;

        String result = controller.getConsumer(1);
        assertEquals("Provider 1", result);
    }
}

集成测试则可以通过Spring Boot的测试支持来完成,例如:

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;

@WebMvcTest(ServiceConsumerController.class)
public class ServiceConsumerControllerIntegrationTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void testGetConsumer() throws Exception {
        mockMvc.perform(get("/consumer?id=1"))
            .andExpect(status().isOk())
            .andExpect(content().string("Provider 1"));
    }
}

使用Sentinel控制台进行监控和调试

Sentinel控制台是一个Web应用,可以通过控制台来监控和调试服务的运行状态。控制台提供了丰富的监控视图,例如:

  • 实时的流量监控
  • 慢调用的监控
  • 熔断降级的状态
  • 异常的监控

控制台地址:http://localhost:8080

常见问题及解决方案

  • 问题1:服务调用失败
    • 解决方案:检查服务提供者和消费者之间的网络连接,确保服务提供者能够正常接收请求。
  • 问题2:Sentinel规则配置不生效
    • 解决方案:检查Sentinel的配置文件是否正确加载,确保规则配置文件的路径正确。
  • 问题3:熔断降级逻辑不生效
    • 解决方案:检查Sentinel的熔断降级规则是否配置正确,确保熔断降级逻辑的业务代码能够正常运行。


这篇关于Sentinel+Feign熔断降级处理学习入门的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程