Hystrix
hystrix简单来说就是服务器错,服务器不会应为出错而消耗性能,而是调用预备的方法。也就是说服务器出错会掉用备案方法,不直接把错误放回客户端。
服务断融(服务提供者)
简单来说就是服务提供者出现错误,我们就在服务提供者端处理。也就是说需要在服务提供者者端配置Hystrix
服务提供(7003)配置如下:
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
记得eureka配置,这里就不写了。
主启动类
开启hystrix
@SpringBootApplication
@EnableEurekaClient
@EnableHystrix
@EnableCircuitBreaker //添加对熔断的支持
public class SpringcxloudProvide7003Application {
public static void main(String[] args) {
SpringApplication.run(SpringcxloudProvide7003Application.class, args);
}
}
contrllor
@RestController
public class TagController {
@RequestMapping("getname")
@HystrixCommand(fallbackMethod = "getNamee")
public String getName(@RequestParam("name")String name) {
System.out.println("springcloud_provide_7003 ----getName---被调用了 name is" + name);
if (!name.equals("admin")) {
int i = 1 / 0;
throw new RuntimeException("出差从");
}
return name;
}
public String getNamee(@RequestParam("name")String name) {
return name+"出错了";
}
}
配置一个服务提供者(7004),我们不是用hystrix,就一个很普通的提供者,主要用于分别hystrix是怎么回事!!!!
@RestController
public class TagController {
@RequestMapping("getname")
public String getName(@RequestParam("name")String name){
System.out.println("springcloud_provide_7004 ----getName---被调用了 name is"+name);
return name;
}
}
服务消费者
我们使用了feig方式来远程调用服务提供者。
@RestController
public class TagController {
@Autowired
TagService tagService=null;
@RequestMapping("getname")
public String getName(@RequestParam("name")String name){
System.out.println(name);
return tagService.getName(name);
}
}
测试:
开一个eureka服务端,开两服务提供者(7003有hystrix、7004)、一个服务消费者。
走了7003服务提供者(有Hystrix),我们子在7003中设置了放回方法
走了7004服务消费
服务降级(服务消费者)
服务降级在我们生活中有许多的实例,比如在每年的双十一的时候,淘宝会把退款业务关闭。淘宝关闭退款业务这个操作就是服务降级,当然啦我们也可以做这样的操作,而且特别简单。
简单来说服务降级是服务消费者找不到服务提供者,服务消费者告诉用户服务不可用,而不会把报错信息直接返回用户。
1、搭建服务降级
服务降级是在Feign的基础上实现的,所以我们的客户端必须支持feign。
2、公共模块
我们之前在搭建feign项目是已经创建了一个公共的模块接口,我们在原来是基础添加fallbackFactory属性,指定返回方法的类
@Component
@FeignClient(value = "springcloudeprovides",fallbackFactory=TagFallbackFactory.class)
public interface TagService {
@RequestMapping("getname")
public String getName(@RequestParam("name")String name);
}
编写子类并实现FallbackFactory接口及其create方法,这个方法返回我们的自定义接口的实现类(这里用了匿名内部类)
@Component
public class TagFallbackFactory implements FallbackFactory {
@Override
public TagService create(Throwable throwable) {
return new TagService() {
@Override
public String getName(@RequestParam("name")String name){;
return "服务器当前不可用,请重试";
}
};
}
}
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
3、服务消费
依赖(只要eureka与feign的依赖及其公共模块)
<!--公共模块依赖-->
<dependency>
<groupId>com.example</groupId>
<artifactId>springcloud-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!--eureka-client模块依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--openfeign模块依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
配置文件
server:
port: 8003
eureka:
client:
service-url:
defaultZone: http://localhost:6998/eureka/,http://localhost:6999/eureka/
register-with-eureka: false
# 开启服务降级
feign:
hystrix:
enabled: true
主启动类
下面注解缺一不可。
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages = {"com.example.springcloudapi"})//公共模块的包,没有这个注解找不到公共模块的类
@ComponentScan("com.example")//这个最好是项目与公共模块目录相同的包,没有这个报No fallbackFactory这个错误
public class SpringcloudConsumeHystrix8003Application {
public static void main(String[] args) {
SpringApplication.run(SpringcloudConsumeHystrix8003Application.class, args);
}
}
4、controller
@RestController
public class TagControllerhystrix {
@Autowired
TagService tagService=null;
@RequestMapping("getname")
public String getName(@RequestParam("name")String name){
System.out.println(name);
return tagService.getName(name);
}
}
5、测试
我们之启动我们这个服务,其他的都不启动。故意自造服务器关闭效果。根据结果可看到页面没有报错信心,而是执行了备用的方法。