一、hystrix
服务雪崩效应
当并发请求 去请求某一个服务时,超过tomcat的最大请求数,其他服务请求就会等待,造成服务雪崩,大量服务请求延迟等待
1、断路器
2、服务降级
在高并发情况下,防止用户一直等待,没有线程处理客户端请求时候,给客户端反馈
fallback
3、服务熔断
为了保护服务,在高并发情况下,如果请求达到一定的极限,请求数达到一定的极限,流量达到一定阀值,自动开启保护服务功能,使用服务降级方式返回一个友好的提示
4、服务隔离机制
线程池和信号量隔离,一般使用线程池隔离
每个服务接口都有自己独立的线程池,每个线程池互补影响,默认线程池隔离
缺点:CPU占用率高
5、服务雪崩效应
通过服务降级,服务隔离,服务熔断
二、两种实现方式,一种是接口,一种注解
zk-member 调用zk-user服务
zk-member
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR3</spring-cloud.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- feign客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- hystrix -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-all</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
@SpringBootApplication //ribbon @EnableDiscoveryClient //feign @EnableFeignClients //Hystrix @EnableHystrix public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } /** * 将RestTemplate注入spring容器 * @return */ @Bean @LoadBalanced //加入ribbon 的负载均衡器 ,轮询调用 RestTemplate restTemplate() { return new RestTemplate(); } }
@RestController public class MemberApi { @Autowired private UserService userService; /** * * springcloud中接口制件调用有两种方式 * 1.RestTemplate * 2.fegin * * * **/ @Autowired private RestTemplate restTemplate; @Autowired private DiscoveryClient discoveryClient; @RequestMapping(value="/addMember") public String addMember(String name) { //url = "http://localhost:8300/getUser" //通过discoveryClient 获取服务信息列表 //List<ServiceInstance> services = discoveryClient.getInstances("zk-user"); /** * restTemplate.getForObject("http://localhost:8300/getUser", String.class); * restTemplate 以别名的方式访问需要添加 * * * **/ String s = restTemplate.getForObject("http://zk-user/getUser", String.class); System.out.println(s); return "添加会员"; } /** * feign客户单调用 * @return */ @RequestMapping(value="/getMember") public String getMember() { String s = userService.getUser(); return "会员调用用户服务-----"+s; } /** * 开启Hystrix服务保护 * @return */ @RequestMapping(value="/memberHystrix") @HystrixCommand(fallbackMethod = "memberHystrixFallBack") public String memberHystrix() { //默认线程池隔离,服务降级memberHystrixFallBack //默认熔断10次请求 System.out.println(Thread.currentThread().getName()); String s = userService.getUser(); return "会员调用用户服务-----"+s; } public String memberHystrixFallBack() { return "当前网络繁忙"; } }
@Component public class MemberServiceFallBack implements UserService{ /** * Hystrix 统一返回 */ public String getUser() { return "用户忙"; } }
/**
* Hystrix 统一返回 不用以下
* @HystrixCommand(fallbackMethod = "memberHystrixFallBack")
* @author Administrator
*
*/
@FeignClient(name = "zk-user",fallback = MemberServiceFallBack.class)
public interface UserService {
/**
* 调用user服务中getUser
* @return
*/
@GetMapping(value = "/getUser")
String getUser();
}
spring.application.name=zk-member server.port=9200 #只能是本地才能这么写,如果连接远程需要加bootstrap.yml,zookeeper创建的是临时节点,服务关掉后节点也会被删除 #spring.cloud.zookeeper.connect-string=localhost:2181 #设置ribbon 读取和超时时间 默认1秒 超过1秒调用失败 ribbon.ConnectTimeout=5000 # Read timeout used by Apache HttpClient ribbon.ReadTimeout=5000 #开启hystrix feign.hystrix.enabled: true #禁止hystrix超时时间设置,默认开启,1秒,如果不设置,接口调用超过1秒 会执行fallbackMethod hystrix.command.default.execution.timeout.enabled:false
zk-user
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR3</spring-cloud.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-all</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
@SpringBootApplication /** * 使用zookeeper 或使用connsoul时@EnableDiscoveryClient注册到注册中心 * @author Administrator * */ @EnableDiscoveryClient public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } }
@RestController public class UserApi { @RequestMapping("/getUser") public String getUser() { try { Thread.currentThread().sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } return "获取用户"; } }
spring.application.name=zk-user server.port=9100 #只能是本地才能这么写,如果连接远程需要加bootstrap.yml,zookeeper创建的是临时节点,服务关掉后节点也会被删除 #spring.cloud.zookeeper.connect-string=localhost:2181