服务熔断:应对微服务雪崩效应的一种链路保护机制,类似保险丝。
需要完成Sentinel整合Ribbon+openFeign,所以我们先要搭建环境,那么先从整合Ribbon开始
环境搭建 为了演示操作,所以在这里我们需要利用Ribbon进行负载均衡的调用,所以我们需要创建一个服务消费者cloudalibaba-consumer8084和两个服务提供者cloudalibaba-provider9003和cloudalibaba-provider9004,以下是结构图
其实我们之前就搭建过这种结构,比较简单,所以我们快速搭建
新建cloudalibaba-provider-9003/9004 在建立9003和9004之前,先建立一个共享项目cloudalibaba-commons,在其中新建一个类型JsonResult,这个类型用于返回JSON数据类型
1 2 3 4 5 6 7 8 9 10 11 12 13 package com.mashibing.cloudalibabacommons.entity;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data @AllArgsConstructor @NoArgsConstructor public class JsonResult <T> { private Integer code; private T data; }
创建服务提供者9003,9004基本上是一样的,所以我们建立9003复制就可以得到9004
pom
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 <?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 https://maven.apache.org/xsd/maven-4.0.0.xsd" > <modelVersion>4.0 .0 </modelVersion> <parent> <groupId>com.mashibing</groupId> <artifactId>SpringAlibabaMSB</artifactId> <version>0.0 .1 -SNAPSHOT</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.mashibing</groupId> <artifactId>cloudalibaba-provider-9003 </artifactId> <version>0.0 .1 -SNAPSHOT</version> <name>cloudalibaba-provider-9003 </name> <description>cloudalibaba-provider-9003 </description> <properties> <java.version>1.8 </java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.mashibing</groupId> <artifactId>cloudalibaba-commons</artifactId> <version>0.0 .1 -SNAPSHOT</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 server: port: 9003 spring: application: name: nacos-provider cloud: nacos: discovery: server-addr: localhost:8848 #配置Nacos地址 management: endpoints: web: exposure: include: '*'
主启动添加注解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package com.mashibing.cloudalibabaprovider9003;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication @EnableDiscoveryClient public class CloudalibabaProvider9003Application { public static void main (String[] args) { SpringApplication.run(CloudalibabaProvider9003Application.class, args); } }
控制器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 package com.mashibing.cloudalibabaprovider9003.controller;import com.mashibing.cloudalibabacommons.entity.JsonResult;import lombok.extern.java.Log;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 java.util.HashMap;@RestController public class DataController { @Value("${server.port}") private String serverPort; public static HashMap<Long,String> hashMap = new HashMap <>(); static { hashMap.put(1l ,"鼠标" ); hashMap.put(2l ,"键盘" ); hashMap.put(3l ,"耳机" ); } @GetMapping("info/{id}") public JsonResult<String> msbSql (@PathVariable("id") Long id) { JsonResult<String> result = new JsonResult (1L ,200 ,hashMap.get(id)); return result; } }
注意: 9004和9003 一致,但是要注意修改yml文件端口号
新建cloudalibaba-consumer8084 pom
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 <?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 https://maven.apache.org/xsd/maven-4.0.0.xsd" > <modelVersion>4.0 .0 </modelVersion> <parent> <groupId>com.mashibing</groupId> <artifactId>SpringAlibabaMSB</artifactId> <version>0.0 .1 -SNAPSHOT</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.mashibing</groupId> <artifactId>cloudalibaba-consumer8084</artifactId> <version>0.0 .1 -SNAPSHOT</version> <name>cloudalibaba-consumer8084</name> <description>cloudalibaba-consumer8084</description> <properties> <java.version>1.8 </java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--SpringCloud ailibaba nacos --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--SpringCloud ailibaba sentinel --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <dependency> <groupId>com.mashibing</groupId> <artifactId>cloudalibaba-commons</artifactId> <version>0.0 .1 -SNAPSHOT</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 server: port: 8084 spring: application: name: nacos-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:
主启动添加注解和9003/9004一致
控制器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 package com.mashibing.cloudalibabaconsumer8084;import com.mashibing.cloudalibabacommons.entity.JsonResult;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;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;@RestController @Slf4j public class DemoController { @Value("${service-url.nacos-user-service}") private String SERVICE_URL; @Autowired private RestTemplate restTemplate; @GetMapping("/consumer/fallback/{id}") public JsonResult<String> fallback (@PathVariable Long id) { JsonResult<String> result = restTemplate.getForObject(SERVICE_URL+"/info/" +id,JsonResult.class); return result; } }
最后测试 访问http://localhost:8084/consumer/fallback/1
查看最后结果是否为9003/9004切换调用