目录:
springcloud费话之Eureka服务访问(restTemplate)
springcloud费话之Eureka接口调用(feign)
springcloud费话之断路器(hystrix in feign)
使用eureka服务发现实现服务器之间的http访问(feign)并添加断路器hystrix
断路器,是springcloud中的一种熔断机制的实现方式
熔断机制,是达到了某个异常以后,后续判断不进行,直接否定的一种方式,类似于&&或者||的熔断的感觉
因为服务器之间的调用,判断错误链,以及出现问题以后的回调,时间可能会很长,如果不尽快阻止,
很可能导致很多请求都等待几十秒的超时而造成服务器阻塞,进而造成服务器崩溃
因此熔断机制十分重要
在springcloud的熔断机制,叫做Spring Cloud Circuit Breaker
具体使用的是hystrix断路器
具体使用方式和流程如下
1.依赖
在springcloud官方网站中找到断路器()的依赖,如下图,并导入pom
2.在启动类添加注解
在启动类添加注解@EnableHystrix,添加后代码如下:
package com.lyh.lyh_eureka_server; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.hystrix.EnableHystrix; import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication @EnableEurekaClient @EnableFeignClients @EnableHystrix public class EurekaClientRun { public static void main(String[] args) { SpringApplication.run(EurekaClientRun.class, args); } }
3.在请求方法上添加熔断注解,并指定熔断的方法,具体代码如下:
熔断注解@HystrixCommand(fallbackMethod = "errorBreak"),其中的fallbackMethod为要调用的熔断的方法
package com.lyh.lyh_eureka_server.controller; import java.net.URI; import java.net.URISyntaxException; import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import com.lyh.lyh_eureka_server.Interface.FeignService; import com.netflix.appinfo.InstanceInfo; import com.netflix.discovery.EurekaClient; import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import com.netflix.ribbon.proxy.annotation.Hystrix; @RestController @EnableEurekaClient public class TestController { @Autowired private EurekaClient eurekaClient; @Resource private FeignService feignService; @RequestMapping("/getServerInfo") public Object getServerInfo() { // 通过eurekaClient访问服务器获取某个命名的集群。 // getNextServerFromEureka的第一个参数是服务器名称,可重复 // 因为获得的是下一个,所以是负载均衡的 InstanceInfo nextServerFromEureka = eurekaClient.getNextServerFromEureka("eureka-client", false); System.out.println("name:" + nextServerFromEureka.getAppName() + " port:" + nextServerFromEureka.getPort()); return nextServerFromEureka; } // 触发的接口 @RequestMapping("/getInfoFromClient") @HystrixCommand(fallbackMethod = "errorBreak") public Object getInfoFromClient() throws URISyntaxException { InstanceInfo nextServerFromEureka = eurekaClient.getNextServerFromEureka("eureka-client", false); System.out.println("name:" + nextServerFromEureka.getAppName() + " port:" + nextServerFromEureka.getPort()); RestTemplate restTemplate = new RestTemplate(); String u = "http://" + nextServerFromEureka.getIPAddr() + ":" + nextServerFromEureka.getPort() + "/getInfo"; URI uri = new URI(u); String obj = restTemplate.getForObject(uri, String.class); System.out.println(obj.toString()); return obj; } // 接口访问的服务 添加熔断方法errorBreak @RequestMapping("/getInfo") @HystrixCommand(fallbackMethod = "errorBreak") public Object getInfo() { return "I am info from client 9020"; } // 触发的接口 by feign 添加熔断方法errorBreak @RequestMapping("/getInfoFromClientByFeign") @HystrixCommand(fallbackMethod = "errorBreak") public Object getInfoFromClientByFeign() throws Exception { // 测试熔断效果 // System.out.println(1/0); String obj = feignService.getInfo(); System.out.println(obj.toString()); return obj; } //hystrix熔断调用的方法 public String errorBreak() { return "this is error break by hystrix"; } }
4.测试
后端并没有报错,前端返回了该熔断效果