Sentinel服務熔斷Ribbon
阿新 • • 發佈:2022-03-16
一、建立生產者模組
建立兩個生產者9001埠和9002埠,便於測試Ribbon負載均衡。
1.1建立一個Module
建立一個名稱為“cloudalibaba-provider-payment9001”Module
1.2 改POM
<?xml version="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>springcloud-nacos</artifactId> <groupId>com.ckfuture.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloudalibaba-provider-payment9001</artifactId> <dependencies> <!--SpringCloud alibaba nacos--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> </project>
1.3 建YML
server: port: 9001 spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: localhost:8848 #配置Nacos地址 management: endpoints: web: exposure: include: '*'
1.4 主啟動類
package com.ckfuture.springcloud.alibaba; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;/** * @descrption: 生產提供者-主啟動類 * @author: CKFuture * @since: 2022-02-14 10:37 * @version: v1.0 * @LastEditTime: * @LastEditors: * @copyright: hrbckfuture.com */ @SpringBootApplication @EnableDiscoveryClient public class PaymentMain9001 { public static void main(String[] args) { SpringApplication.run(PaymentMain9001.class,args); } }
1.5 業務類
package com.ckfuture.springcloud.alibaba.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; /** * @descrption: 生產提供者 * @author: CKFuture * @since: 2022-02-14 10:21 * @version: v1.0 * @LastEditTime: * @LastEditors: * @copyright: hrbckfuture.com */ @RestController public class PaymentController { @Value("${server.port}") private String serverPort; @GetMapping(value = "/payment/nacos/{id}") public String getPayment(@PathVariable("id") Integer id){ return "nacos registry,serverPort:"+serverPort+"\t id"+id; } }
參考9001建立9002
二、建立消費者模組
2.1 建立Module
建立名稱為“cloudalibaba-consumer-nacos-order84”的Module
2.2 改POM
<?xml version="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>springcloud-nacos</artifactId> <groupId>com.ckfuture.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloudalibaba-consumer-nacos-order84</artifactId> <dependencies> <!--SpringCloud alibaba nacos--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--web+actuator--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> </project>
2.3 建YML
server: port: 84 spring: application: name: nacos-order-consumer cloud: nacos: discovery: server-addr: localhost:8848 sentinel: transport: #配置Sentinel dashboard地址 dashboard: localhost:8080 port: 8719 #消費者將要去訪問的微服務名稱(註冊成功進nacos的微服務提供者) service-url: nacos-user-service: http://nacos-payment-provider
2.4 主啟動類
package com.ckfuture.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class OrderNacosMain84 { public static void main(String[] args) { SpringApplication.run(OrderNacosMain84.class,args); } }
2.5 業務類
package com.ckfuture.springcloud.controller; import com.alibaba.csp.sentinel.annotation.SentinelResource; import com.alibaba.csp.sentinel.slots.block.BlockException; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; @RestController public class OrderNacosController { @Resource private RestTemplate restTemplate; @Value("${service-url.nacos-user-service}") private String serverURL; @GetMapping(value = "/consumer/fallback/{id}") @SentinelResource(value="fallback",fallback = "handlerFallback",blockHandler = "blockHandler") public String paymentInfo(@PathVariable("id") Long id) { //生產者提供的訪問地址 String result = restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class); if(id==4){ throw new IllegalArgumentException("IllegalArgumentException,非法引數異常..."); }else if(result==""){ throw new NullPointerException("NullPointerException,空指標異常"); } return result; } //fallback 只負責業務異常 public String handlerFallback(@PathVariable Long id,Throwable e){ return "兜底異常handlerFallback,exception內容"+e.getMessage(); } // blockHandler 只負責流量控制 public String blockHandler(@PathVariable Long id, BlockException blockException){ return "blockHandler-sentinel限流,blockException:"+blockException.getMessage(); } }
三、測試
啟動 9001和9002生產者
此時在Nacos中可以檢視兩個服務提供者
啟動消費者84
3.1 測試負載均衡
在合理的資料範圍內請求資料
3.2 測試fallback
3.3 測試sentinel
在Sentinel中新增流控規則
快速請求觸發限流兜底方法