服务熔断
1.ribbon+resttempalte+hystrix
在所需方法上添加注解@HystrixCommand(fallbackMethod=“consumerServiceRibbonFallback”)
参数为你的处理方法consumerServiceRibbonFallback();
@RestController
public class ServiceController {
@Autowired
RestTemplate restTemplate;
@Autowired
public DiscoveryClient discoveryClient;
@Value("${server.port}")
String port;
// 调用:localhost:6007/consumerServiceRibbon?token=1
@RequestMapping("/consumerServiceRibbon")
@HystrixCommand(fallbackMethod="consumerServiceRibbonFallback")
public String consumerServiceRibbon(){
List<String> services = discoveryClient.getServices();
System.out.println("services:");
for (String service : services) {
System.out.println(service);
}
String result = this.restTemplate.postForObject("http://springbootService/service/rest?token=1", null, String.class);
return result;
}
public String consumerServiceRibbonFallback(){
return "consumerServiceRibbon异常,端口:" + port + ",Name=" ;
}
}
2.openfeign+hystrix
写一个接口添加@FeignClient(value = “springbootService”, fallback=ServiceFallback.class),第二个参数为处理的类
@Component
@FeignClient(value = "springbootService", fallback=ServiceFallback.class) //这里的value对应调用服务的spring.applicatoin.name
public interface ServiceFeignClient {
@RequestMapping(value = "/service/hello")
RestfulResult hello();
}
ServiceFallback.java
@Component
public class ServiceFallback implements ServiceFeignClient{
@Override
public RestfulResult hello() {
RestfulResult result = new RestfulResult();
result.setData("服务调用失败");
return result;
}
}
3.zuul+hystrix
直接实现FallbackProvider接口,重写方法即可
在启动类的同级先创建包,再把这个文件放进包里
@Component
public class ServiceFallbackProvider implements FallbackProvider {
@Override
// 指定熔断器功能应用于哪些路由的服务
public String getRoute() {
// 这里只针对"springbootService"服务进行熔断
// 如果需要针对所有服务熔断,则return "*"
return "*";
}
@Override
public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
System.out.println("route:"+route);
return new ClientHttpResponse() {
@Override
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.OK;
}
@Override
public int getRawStatusCode() throws IOException {
return 200;
}
@Override
public String getStatusText() throws IOException {
return "ok";
}
@Override
public void close() {
}
@Override
// 发生熔断式,返回的信息
public InputStream getBody() throws IOException {
return new ByteArrayInputStream("Sorry, the service is unavailable now.".getBytes());
}
@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return headers;
}
};
}