前期准备:
启动nacos和sentinel
新建cloudalibaba-provider-payment9003/9004
-
- "1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <parent>
- <artifactId>mscloud03artifactId>
- <groupId>com.atguigu.springcloudgroupId>
- <version>1.0-SNAPSHOTversion>
- parent>
- <modelVersion>4.0.0modelVersion>
-
- <artifactId>cloudalibaba-provider-payment9003artifactId>
-
-
-
- <dependencies>
-
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
- dependency>
- <dependency>
- <groupId>com.atguigu.springcloudgroupId>
- <artifactId>cloud-api-commonsartifactId>
- <version>${project.version}version>
- dependency>
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-webartifactId>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-actuatorartifactId>
- dependency>
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-devtoolsartifactId>
- <scope>runtimescope>
- <optional>trueoptional>
- dependency>
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- <optional>trueoptional>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-testartifactId>
- <scope>testscope>
- dependency>
- dependencies>
- project>
- server:
- port: 9003
-
- spring:
- application:
- name: nacos-payment-provider
- cloud:
- nacos:
- discovery:
- server-addr: localhost:8848 #配置Nacos地址
-
- management:
- endpoints:
- web:
- exposure:
- include: '*'
配置9004的时候记得修改端口
- @SpringBootApplication
- @EnableDiscoveryClient
- public class PaymentMain9003
- {
- public static void main(String[] args) {
- SpringApplication.run(PaymentMain9003.class, args);
- }
- }
- @RestController
- public class PaymentController
- {
- @Value("${server.port}")
- private String serverPort;
-
- public static HashMap
hashMap = new HashMap<>(); - static
- {
- hashMap.put(1L,new Payment(1L,"28a8c1e3bc2742d8848569891fb42181"));
- hashMap.put(2L,new Payment(2L,"bba8c1e3bc2742d8848569891ac32182"));
- hashMap.put(3L,new Payment(3L,"6ua8c1e3bc2742d8848569891xt92183"));
- }
-
- @GetMapping(value = "/paymentSQL/{id}")
- public CommonResult
paymentSQL(@PathVariable("id") Long id) - {
- Payment payment = hashMap.get(id);
- CommonResult
result = new CommonResult(200,"from mysql,serverPort: "+serverPort,payment); - return result;
- }
-
-
-
- }
测试1
启动9003访问localhost:9003/paymentSQL/1
新建cloudalibaba-consumer-nacos-order84
- "1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <parent>
- <artifactId>mscloud03artifactId>
- <groupId>com.atguigu.springcloudgroupId>
- <version>1.0-SNAPSHOTversion>
- parent>
- <modelVersion>4.0.0modelVersion>
-
- <artifactId>cloudalibaba-consumer-nacos-order84artifactId>
-
- <dependencies>
-
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
- dependency>
-
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
- dependency>
-
- <dependency>
- <groupId>com.atguigu.springcloudgroupId>
- <artifactId>cloud-api-commonsartifactId>
- <version>${project.version}version>
- dependency>
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-webartifactId>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-actuatorartifactId>
- dependency>
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-devtoolsartifactId>
- <scope>runtimescope>
- <optional>trueoptional>
- dependency>
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- <optional>trueoptional>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-testartifactId>
- <scope>testscope>
- dependency>
- dependencies>
- project>
- server:
- port: 84
-
-
- spring:
- application:
- name: nacos-order-consumer
- cloud:
- nacos:
- discovery:
- server-addr: localhost:8848
- sentinel:
- transport:
- #配置Sentinel dashboard地址
- dashboard: localhost:8080
- #默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口
- port: 8719
-
-
- #消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
- service-url:
- nacos-user-service: http://nacos-payment-provider
- @EnableDiscoveryClient
- @SpringBootApplication
- public class OrderNacosMain84
- {
- public static void main(String[] args) {
- SpringApplication.run(OrderNacosMain84.class, args);
- }
- }
- @Configuration
- public class ApplicationContextConfig
- {
- @Bean
- @LoadBalanced
- public RestTemplate getRestTemplate()
- {
- return new RestTemplate();
- }
- }
- @RestController
- @Slf4j
- public class CircleBreakerController
- {
- public static final String SERVICE_URL = "http://nacos-payment-provider";
-
- @Resource
- private RestTemplate restTemplate;
-
- @RequestMapping("/consumer/fallback/{id}")
- @SentinelResource(value = "fallback")
- public CommonResult
fallback(@PathVariable Long id) - {
- CommonResult
result = restTemplate.getForObject(SERVICE_URL + "/paymentSQL/"+id,CommonResult.class,id); -
- if (id == 4) {
- throw new IllegalArgumentException ("IllegalArgumentException,非法参数异常....");
- }else if (result.getData() == null) {
- throw new NullPointerException ("NullPointerException,该ID没有对应记录,空指针异常");
- }
-
- return result;
- }
- }
测试2
启动9003 9004 84
访问http://localhost:84/consumer/fallback/1
再访问http://localhost:84/consumer/fallback/1
可以发现第一次是9004端口,第二次是9003端口,这里面的话,就可以就知道意见实现了ribbon中的轮训
测试3
访问http://localhost:84/consumer/fallback/4
http://localhost:84/consumer/fallback/4
给客户error页面,不友好
- @RestController
- @Slf4j
- public class CircleBreakerController
- {
- public static final String SERVICE_URL = "http://nacos-payment-provider";
-
- @Resource
- private RestTemplate restTemplate;
-
- @RequestMapping("/consumer/fallback/{id}")
- @SentinelResource(value = "fallback",fallback = "handlerFallback") //fallback负责业务异常
- public CommonResult
fallback(@PathVariable Long id) - {
- CommonResult
result = restTemplate.getForObject(SERVICE_URL + "/paymentSQL/"+id,CommonResult.class,id); -
- if (id == 4) {
- throw new IllegalArgumentException ("IllegalArgumentException,非法参数异常....");
- }else if (result.getData() == null) {
- throw new NullPointerException ("NullPointerException,该ID没有对应记录,空指针异常");
- }
-
- return result;
- }
- public CommonResult handlerFallback(@PathVariable Long id,Throwable e) {
- Payment payment = new Payment(id,"null");
- return new CommonResult<>(444,"兜底异常handlerFallback,exception内容 "+e.getMessage(),payment);
- }
- }

本例sentinel无配置
测试4
访问http://localhost:84/consumer/fallback/4
这里可以发现没有出现error界面,而是我们自己配置的兜底的处理方案
- @RestController
- @Slf4j
- public class CircleBreakerController
- {
- public static final String SERVICE_URL = "http://nacos-payment-provider";
-
- @Resource
- private RestTemplate restTemplate;
-
- @RequestMapping("/consumer/fallback/{id}")
- @SentinelResource(value = "fallback",blockHandler = "blockHandler") //blockHandler负责在sentinel里面配置的降级限流
- public CommonResult
fallback(@PathVariable Long id) - {
- CommonResult
result = restTemplate.getForObject(SERVICE_URL + "/paymentSQL/"+id,CommonResult.class,id); - if (id == 4) {
- throw new IllegalArgumentException ("非法参数异常....");
- }else if (result.getData() == null) {
- throw new NullPointerException ("NullPointerException,该ID没有对应记录");
- }
- return result;
- }
- public CommonResult handlerFallback(@PathVariable Long id,Throwable e) {
- Payment payment = new Payment(id,"null");
- return new CommonResult<>(444,"fallback,无此流水,exception "+e.getMessage(),payment);
- }
- public CommonResult blockHandler(@PathVariable Long id,BlockException blockException) {
- Payment payment = new Payment(id,"null");
- return new CommonResult<>(445,"blockHandler-sentinel限流,无此流水: blockException "+blockException.getMessage(),payment);
- }
-
- }
配置sentinel
测试5
访问2次以后http://localhost:84/consumer/fallback/4
- @RestController
- @Slf4j
- public class CircleBreakerController
- {
- public static final String SERVICE_URL = "http://nacos-payment-provider";
-
- @Resource
- private RestTemplate restTemplate;
-
- @RequestMapping("/consumer/fallback/{id}")
- @SentinelResource(value = "fallback",fallback = "handlerFallback",blockHandler = "blockHandler")
- public CommonResult
fallback(@PathVariable Long id) - {
- CommonResult
result = restTemplate.getForObject(SERVICE_URL + "/paymentSQL/"+id,CommonResult.class,id); - if (id == 4) {
- throw new IllegalArgumentException ("非法参数异常....");
- }else if (result.getData() == null) {
- throw new NullPointerException ("NullPointerException,该ID没有对应记录");
- }
- return result;
- }
- public CommonResult handlerFallback(@PathVariable Long id,Throwable e) {
- Payment payment = new Payment(id,"null");
- return new CommonResult<>(444,"fallback,无此流水,exception "+e.getMessage(),payment);
- }
- public CommonResult blockHandler(@PathVariable Long id,BlockException blockException) {
- Payment payment = new Payment(id,"null");
- return new CommonResult<>(445,"blockHandler-sentinel限流,无此流水: blockException "+blockException.getMessage(),payment);
- }
-
- }
测试 6
访问http://localhost:84/consumer/fallback/4
再访问的时候,那就意味着这个时候会被限流处理
若 blockHandler 和 fallback 都进行了配置,则被限流降级而抛出 BlockException 时只会进入 blockHandler 处理逻辑。
修改业务类(忽略属性.......)
- @RestController
- @Slf4j
- public class CircleBreakerController
- {
- public static final String SERVICE_URL = "http://nacos-payment-provider";
-
- @Resource
- private RestTemplate restTemplate;
-
- @RequestMapping("/consumer/fallback/{id}")
- @SentinelResource(value = "fallback", fallback = "handlerFallback", blockHandler = "blockHandler",
- exceptionsToIgnore = {IllegalArgumentException.class})
- public CommonResult
fallback(@PathVariable Long id) - {
- CommonResult
result = restTemplate.getForObject(SERVICE_URL + "/paymentSQL/"+id,CommonResult.class,id); - if (id == 4) {
- throw new IllegalArgumentException ("非法参数异常....");
- }else if (result.getData() == null) {
- throw new NullPointerException ("NullPointerException,该ID没有对应记录");
- }
- return result;
- }
- public CommonResult handlerFallback(@PathVariable Long id,Throwable e) {
- Payment payment = new Payment(id,"null");
- return new CommonResult<>(444,"fallback,无此流水,exception "+e.getMessage(),payment);
- }
- public CommonResult blockHandler(@PathVariable Long id,BlockException blockException) {
- Payment payment = new Payment(id,"null");
- return new CommonResult<>(445,"blockHandler-sentinel限流,无此流水: blockException "+blockException.getMessage(),payment);
- }
- }

测试7
访问http://localhost:84/consumer/fallback/4