1、引用依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath />
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR1</spring-cloud.version>
</properties>
<dependencies>
<!-- springboot整合 web组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</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>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>16.0.1</version>
</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>
</project>
2、接口类
package com.sirius.order.api.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.sirius.order.fegin.member.MemberApiFegin;
@RestController
public class OrderApiController {
@Autowired
private MemberApiFegin memberApiFegin;
//没有解决服务雪崩效应
@RequestMapping("/getOrder")
public String getOrder(){
return memberApiFegin.getMember();----------线程池名称不一样
}
//解决服务雪崩效应
//@HystrixCommand默认开启线程池隔离方式(不同线程池),服务降级(默认开启服务降级执行方法)、服务熔断; //fallbackMethod:服务降级执行
@HystrixCommand(fallbackMethod = "getOrderHystrixFallBack")
@RequestMapping("/getOrderHystrix")
public String getOrderHystrix(){
System.out.println(Thread.currentThread().getName());
return memberApiFegin.getMember();
}
public String getOrderHystrixFallBack(){
System.out.println(Thread.currentThread().getName());----------线程池名称不一样
return "服务降级,服务器忙,请稍后重试.";
}
}
会员接口调用类:
package com.sirius.order.fegin.member;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient("sirius-member")
public interface MemberApiFegin {
@RequestMapping("/getMember")
public String getMember();
}
-- 会员接口Feign调用类改造采用继承会员服务定义的接口,就不用拷贝
@RequestMapping("/getMember")
public String getMember();
内容
变成:
@FeignClient(value = "sirius-member")
public interface MemberApiFegin extends MemberApi {
}
-- 基于类的Hystrix服务降级、熔断、隔离
改造
@FeignClient(value = "sirius-member" fallback=MemberApiFallBack .class)
public interface MemberApiFegin extends MemberApi {
}
@Component
public interface MemberApiFallBack implements MemberApiFegin {
.......
}
3、配置文件
#端口号
server.port=9004
#服务名称
spring.application.name=sirius-order-fegin
#注册中心
eureka.client.serviceUrl.defaultZone=http://admin:123456@127.0.0.1:9001/eureka/
#表示是否将自己注册到Eureka Server
eureka.client.registerWithEureka = true
#表示是否从Eureka Server获取注册信息
eureka.client.fetchRegistry = true
#开启hystrix断路器
feign.hystrix.enabled = true
#hystrix超时时间
#禁止服务超时时间
hystrix.command.default. execution.timeout.enabled=false
#hystrix的超时时间要大于 (1 + MaxAutoRetries + MaxAutoRetriesNextServer) * ReadTimeout 比较好
#hystrix.command.default. execution.isolation.thread.timeoutInMilliseconds=8000
#Feign客户端超时时间设置
ribbon.ReadTimeout=3000
ribbon.ConnectTimeout=3000
#同一台实例最大重试次数,不包括首次调用
ribbon.MaxAutoRetries = 1
#重试负载均衡其他的实例最大重试次数,不包括首次调用
ribbon.MaxAutoRetriesNextServer = 1
#是否所有操作都重试
ribbon.OkToRetryOnAllOperations = false
#日志
#LOG
logging.file = ./logs/log.log
4、启动类
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients //可以开启feign客户端权限
@EnableHystrix
public class OrderApplicationStart {
public static void main(String[] args) {
SpringApplication.run(OrderApplicationStart.class, args);
}
}
---------------------------------------------------------------------------------------------------------
1、基于hystrix解决服务雪崩效应原理:
a、服务降级
在高并发情况下,防止用户一直等待,使用服务降级方式(返回一个友好提示直接给客户端,不会去处理请求,调用fallback本地方法),目的是为了用户体验。
b、服务熔断
熔断的目的是为了保护服务,在搞并发情况下,如果请求达到一定的极限阈值,超出设置的阈值自动开启保护服务功能,使用服务降级方式返回一个友好的提示。熔断机制和服务降级一起使用。
c、服务隔离
线程池和信号量隔离。
采用服务隔离机制 线程池隔离:每个服务接口都有自己独立的线程池。每个线程池互不影响。缺点:cpu占用率非常高。不是所有接口都采用哦......