SpringCloud各个服务之间是通过RestApi调用的,像HttpClient、restTemplate用起来都比较麻烦。Feign就提供了一种优雅的方式。
pom
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<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.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
配置
server.port=9001
spring.application.name=feign-consumer
# 配置中心的地址
eureka.client.service-url.defaultZone=http://192.168.1.4:1111/eureka
# 这个必须开启,不然服务降级不生效
feign.hystrix.enabled=true
使用
启动类加注解
@EnableEurekaClient
@EnableFeignClients
@SpringBootApplication
public class FeignConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(FeignConsumerApplication.class, args);
}
}
代码中使用
// 调用的服务名是:hello-service。断路之后调用:HelloServiceImpl中相应的方法
@FeignClient(value = "hello-service",fallback = HelloServiceImpl.class)
public interface HelloService {
// 和hello-service相应的api对应方法名返回值类型,参数列表都要对应
@RequestMapping("/hello")
String hello();
}
// hello调用超时,就会使用短路器中的返回值
@Component
public class HelloServiceImpl implements HelloService {
@Override
public String hello() {
return "error";
}
}
@RestController
public class ConsumerController {
@Autowired
private HelloService helloService;
@RequestMapping("feign-consumer")
public String hello() {
// 这里就会去调用其他的相应的api了
return helloService.hello();
}
}