本文将带你学习sentinel+Feign熔断降级处理的入门知识,包括Sentinel和Feign的基本概念、作用和优势。通过实际配置和示例,你将了解如何在项目中集成Sentinel和Feign,并实现服务的熔断降级处理。
Sentinel 是阿里巴巴开源的一款轻量级、高性能的 Java 应用防护框架。它提供了强大的流量控制、熔断降级、系统保护等功能,能够帮助开发者解决流量过载和系统稳定性的问题。Sentinel 采用了流式的数据处理模型,通过单一的API进行集成,支持Java SE、Java EE、Spring Cloud、Dubbo等多种运行环境。
Feign 是一个声明式的Web服务客户端,它可以生成HTTP请求,它是基于Ribbon和RestTemplate进行的封装,可以用来进行服务间通信。Feign的核心特性是它支持多种注解,例如@GET
、@POST
等,使得开发者可以像调用本地方法一样调用远程服务。
Sentinel的作用和优势:
首先,你需要安装Java开发环境,确保你的计算机上已经安装了JDK。你可以通过以下命令来检查是否已经安装了JDK:
java -version
如果还没有安装,你可以从Oracle官网或者OpenJDK下载安装相应的版本。
在你的项目中引入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>
在Spring Boot项目中,可以通过配置文件来设置Sentinel和Feign的基本参数。以下是一个基本的配置示例:
spring: cloud: sentinel: transport: port: 8719 dashboard: localhost:8080 feign: client: config: default: connectTimeout: 5000 readTimeout: 5000
服务提供者是一个提供服务的微服务应用。以下是一个简单的服务提供者示例:
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); } }
在服务消费者中,我们可以通过注入ServiceProviderClient
来调用服务提供者的接口,如下所示:
@GetMapping("/consumer") public String getConsumer(@RequestParam("id") int id) { return serviceProviderClient.getProvider(id); }
在服务提供者中,我们可以通过配置Sentinel规则来进行流控和熔断配置。在application.yml
中添加以下配置:
spring: cloud: sentinel: filter: enabled: true transport: dashboard: localhost:8080
为了演示服务故障场景,可以在服务提供者中模拟一个异常情况,例如:
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"; } }
在application.yml
中配置Feign的熔断降级策略:
feign: hystrix: enabled: true client: config: default: connectTimeout: 5000 readTimeout: 5000 hystrix: enabled: true
在服务提供者中,可以通过Sentinel控制台来查看熔断状态。在控制台中,我们可以设置熔断规则,例如:
provider
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控制台是一个Web应用,可以通过控制台来监控和调试服务的运行状态。控制台提供了丰富的监控视图,例如:
控制台地址:http://localhost:8080