springcloud hystrix断路器的作用:
springcloud的一套远程调用的微服务架构,当架构中某个模块发生故障或是网络延迟的时候,有可能倒是系统发生异常。这时候,sprongcloud hystrix的作用就显示出来了,它会想调用方返回一个错误的相应,而不是长时间的等待,这样就不会是的线程因调用故障被长时间的等待,不释放。倒是异常。
代码:
1、首先引入hystrix的jar包。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
ps:我是用的springboot的版本是2.0.6。springcloud的版本是Finchley.SR3。这两种可以兼容。有时候由于springboot与spring丑陋的版本兼容问题,可能导致运行报错。具体的springboot与springcloud的版本兼容问题,可以看我另一篇文章《springcloud项目jar包引用报错》
2、在启动类上加上注解@EnableDiscoveryClient 和@EnableCircuitBreaker
@EnableDiscoveryClient :表示将本服务注册到服务中心eureka中,需配合application.properties或者yml文件。
@EnableCircuitBreaker:表示启动断路器功能。在远程调用的时候可以指定。
(ps:此时,启动类的注解已经有三个。@SpringBootApplication,@EnableDiscoveryClient ,@EnableCircuitBreaker。
他们可以用一个注解替换,@SpringCloudApplication,使用工具看@springcloud源码,他就是这几个注解组合而成)
3、配置文件application.properties
spring.application.name=ribbon-consumer
server.port=1113
eureka.client.service-url.defaultZone=http://peer1:8761/eureka/
4、编写代码。调用方ribbon-consummer。
控制器:
package com.springcloud.ribbonconsumer.controller;
import com.springcloud.ribbonconsumer.entity.User;
import com.springcloud.ribbonconsumer.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.net.InetAddress;
/**
* @Author:sgchen
* @Date:2019/8/7 14:22
* @Description:
*/
@RestController
public class ConsumerController {
@Autowired
private HelloService helloService;
@RequestMapping(value = "/ribbon-consummer",method = RequestMethod.GET)
public String consummerHello(){
return helloService.hello();
}
}
service类的方法
package com.springcloud.ribbonconsumer.service;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.springcloud.ribbonconsumer.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
/**
* @Author:sgchen
* @Date:2019/8/8 15:48
* @Description:
*/
@Service
public class HelloService {
@Autowired
private RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "error")//熔断机制,如果此方法发生错误,则调用error方法
public String hello(){
String str = restTemplate.getForObject("http://HELLO-SERVICE/hello", String.class);
return str;
}
public String error(){
return "error";
}
}
5、启动服务
首先起送eureka服务器,(代码可查看文章《springcloud服务治理Eureka》)
然后启动eureka-client服务。(代码可查看文章《springcloud服务治理Eureka》)
最后启动调用方,ribbon-consummer,也就是上方编写的代码。
访问url:localhost:1113/ribbon-consummer,返回结果helll springcloud
然后,关闭eureka-client的服务,再访问url:localhost:1113/ribbon-consummer返回结果error
此时说明,断路器功能正常。当调用失败时,执行@HystrixCommand注解中配置的方法。