目录:
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.测试
后端并没有报错,前端返回了该熔断效果