diff --git a/spring-cloud/pom.xml b/spring-cloud/pom.xml index c0e452afaf..efa9df40d9 100644 --- a/spring-cloud/pom.xml +++ b/spring-cloud/pom.xml @@ -44,6 +44,7 @@ spring-cloud-circuit-breaker spring-cloud-eureka-self-preservation + spring-cloud-sentinel diff --git a/spring-cloud/spring-cloud-sentinel/pom.xml b/spring-cloud/spring-cloud-sentinel/pom.xml new file mode 100644 index 0000000000..612cbcbfbe --- /dev/null +++ b/spring-cloud/spring-cloud-sentinel/pom.xml @@ -0,0 +1,42 @@ + + + 4.0.0 + spring-cloud-sentinel + spring-cloud-sentinel + http://maven.apache.org + pom + + com.baeldung.spring.cloud + spring-cloud + 1.0.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter-web + + + com.alibaba.csp + sentinel-core + 1.8.0 + + + com.alibaba.csp + sentinel-annotation-aspectj + 1.8.0 + + + com.alibaba.csp + sentinel-transport-simple-http + 1.8.0 + + + + + UTF-8 + + diff --git a/spring-cloud/spring-cloud-sentinel/src/main/java/com/baeldung/spring/cloud/sentinel/SentinelApplication.java b/spring-cloud/spring-cloud-sentinel/src/main/java/com/baeldung/spring/cloud/sentinel/SentinelApplication.java new file mode 100644 index 0000000000..4d921844df --- /dev/null +++ b/spring-cloud/spring-cloud-sentinel/src/main/java/com/baeldung/spring/cloud/sentinel/SentinelApplication.java @@ -0,0 +1,11 @@ +package com.baeldung.spring.cloud.sentinel; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SentinelApplication { + public static void main(String[] args) { + SpringApplication.run(SentinelApplication.class, args); + } +} diff --git a/spring-cloud/spring-cloud-sentinel/src/main/java/com/baeldung/spring/cloud/sentinel/config/SentinelAspectConfiguration.java b/spring-cloud/spring-cloud-sentinel/src/main/java/com/baeldung/spring/cloud/sentinel/config/SentinelAspectConfiguration.java new file mode 100644 index 0000000000..4dfacef999 --- /dev/null +++ b/spring-cloud/spring-cloud-sentinel/src/main/java/com/baeldung/spring/cloud/sentinel/config/SentinelAspectConfiguration.java @@ -0,0 +1,65 @@ +package com.baeldung.spring.cloud.sentinel.config; + +import com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect; +import com.alibaba.csp.sentinel.slots.block.RuleConstant; +import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule; +import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager; +import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; +import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; +import com.alibaba.csp.sentinel.slots.system.SystemRule; +import com.alibaba.csp.sentinel.slots.system.SystemRuleManager; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.PostConstruct; +import java.util.ArrayList; +import java.util.List; + +@Configuration +public class SentinelAspectConfiguration { + + public static final String RESOURCE_NAME = "greeting"; + + @Bean + public SentinelResourceAspect sentinelResourceAspect() { + return new SentinelResourceAspect(); + } + + @PostConstruct + public void init() { + initFlowRules(); + initDegradeRules(); + initSystemProtectionRules(); + } + + private void initFlowRules() { + List flowRules = new ArrayList<>(); + FlowRule flowRule = new FlowRule(); + // Defined resource + flowRule.setResource(RESOURCE_NAME); + flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS); + // number of requests that QPS can pass in a second + flowRule.setCount(1); + flowRules.add(flowRule); + FlowRuleManager.loadRules(flowRules); + } + + private void initDegradeRules() { + List rules = new ArrayList(); + DegradeRule rule = new DegradeRule(); + rule.setResource(RESOURCE_NAME); + rule.setCount(10); + rule.setTimeWindow(10); + rules.add(rule); + DegradeRuleManager.loadRules(rules); + } + + private void initSystemProtectionRules() { + List rules = new ArrayList<>(); + SystemRule rule = new SystemRule(); + rule.setHighestSystemLoad(10); + rules.add(rule); + SystemRuleManager.loadRules(rules); + } + +} diff --git a/spring-cloud/spring-cloud-sentinel/src/main/java/com/baeldung/spring/cloud/sentinel/controller/GreetingController.java b/spring-cloud/spring-cloud-sentinel/src/main/java/com/baeldung/spring/cloud/sentinel/controller/GreetingController.java new file mode 100644 index 0000000000..fa3852466d --- /dev/null +++ b/spring-cloud/spring-cloud-sentinel/src/main/java/com/baeldung/spring/cloud/sentinel/controller/GreetingController.java @@ -0,0 +1,20 @@ +package com.baeldung.spring.cloud.sentinel.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.spring.cloud.sentinel.service.GreetingService; + +@RestController +public class GreetingController { + + @Autowired + private GreetingService greetingService; + + @GetMapping("/hello") + public String getGreeting() { + return greetingService.getGreeting(); + } + +} diff --git a/spring-cloud/spring-cloud-sentinel/src/main/java/com/baeldung/spring/cloud/sentinel/service/GreetingService.java b/spring-cloud/spring-cloud-sentinel/src/main/java/com/baeldung/spring/cloud/sentinel/service/GreetingService.java new file mode 100644 index 0000000000..e60d679b92 --- /dev/null +++ b/spring-cloud/spring-cloud-sentinel/src/main/java/com/baeldung/spring/cloud/sentinel/service/GreetingService.java @@ -0,0 +1,19 @@ +package com.baeldung.spring.cloud.sentinel.service; + +import com.alibaba.csp.sentinel.annotation.SentinelResource; +import org.springframework.stereotype.Service; + +@Service +public class GreetingService { + + @SentinelResource(value = "greeting", fallback = "getGreetingFallback") + public String getGreeting() { + return "Hello World!"; + } + + public String getGreetingFallback(Throwable e) { + e.printStackTrace(); + return "Bye world!"; + } + +}