Spring Cloud Finchley版本Demo笔记,服务通信RestTemplate和Feign断路器(Hystrix服务降级)的使用
本文demo是在Spring Cloud Finchley版本Demo笔记,服务之间的通信RestTemplate和Feign及负载均衡基础上搭建的
一、在consumer模块pom.xml加上熔断依赖spring-cloud-starter-netflix-hystrix
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.cobra</groupId>
<artifactId>springcloud</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.cobra</groupId>
<artifactId>consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>consumer</name>
<description>Demo project for Spring Boot</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--使用feign添加依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--熔断依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
二、RestTemplate中熔断的使用
1、在注入RestTemplate的类加上注解@EnableHystrix,使熔断生效
package com.cobra.consumer.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* @Author: Baron
* @Description:
* @Date: Created in 2019/3/12 17:18
*/
@Configuration
@EnableHystrix
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
2、在使用RestTemplate的方法上加上@HystrixCommand(fallbackMethod = "fallback"),fallbackMethod 赋上方法值同时写上方法:
package com.cobra.consumer.controller;
import com.cobra.consumer.client.ProviderClient;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @Author: Baron
* @Description:
* @Date: Created in 2019/3/12 15:57
*/
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
/**
* 测试通讯
* @return
*/
@RequestMapping("/connect")
@HystrixCommand(fallbackMethod = "fallback")
public String connect(){
String result =restTemplate.getForObject("http://provider/provider/get", String.class);
return "connect to " + result;
}
public String fallback() {
return "发生熔断了!!!";
}
}
3、测试,启动eureka和consumer,发送请求得到下面结果,说明熔断生效:
三、Feign中使用熔断:
1、改造Feign接口客户端,定义内部类实现接口Feign客户端接口和默认返回值,在@FeignClient指定fallback的类,将实现类注入IOC容器:
package com.cobra.consumer.client;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
/**
* @Author: Baron
* @Description:
* @Date: Created in 2019/3/12 19:40
*/
@FeignClient(name = "provider",fallback =ProviderClient.ProviderClientFallBack.class )
public interface ProviderClient {
@GetMapping("/provider/get")
String get();
@PostMapping("/provider/post")
String post();
@Component
public static class ProviderClientFallBack implements ProviderClient {
@Override
public String get() {
return "get容错返回值";
}
@Override
public String post() {
return "post容错返回值";
}
}
}
2、在配置文件上配置开启Feign熔断
feign:
hystrix:
enabled: true
server:
port: 8082
spring:
application:
name: consumer
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
feign:
hystrix:
enabled: true
#provider:
# ribbon:
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
3、改造ConsumerController,引用ProviderClient的bean,直接使用接口方法用于获取provider的资源:
package com.cobra.consumer.controller;
import com.cobra.consumer.client.ProviderClient;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @Author: Baron
* @Description:
* @Date: Created in 2019/3/12 15:57
*/
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@Autowired
private ProviderClient providerClient;
/**
* 测试通讯
* @return
*/
@RequestMapping("/connect")
public String connect(){
String get = providerClient.get();
String post = providerClient.post();
return "connect to " + get +post;
}
}
4、在consumer启动类上加上@EnableHystrix服务启动使用熔断生效
package com.cobra.consumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
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 ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
5、测试,启动eureka注册中心和consumer模块,发送请求,得到结果,说明熔断生效: