前文示例中是使用RestTemplate实现REST API调用的,使用的是拼接字符串的形式来构造url,这种方式显然是具有很多缺点的,在现实中请求往往带着很多参数,如果使用拼接url的方式,会导致效率低下,难以维护。Feign可以很好解决这个问题。
Feign 简介
Feign是netflix开发的声明式,模板化的客户端,可以帮助我们更加便捷,优雅的调用HTTP API,在spring cloud中使用Feign是非常简单的一件事,创建一个接口,并在接口上添加一些注解就可以了。spring cloud对Feign进行了增强,使得Feign支持了Spring MVC注解,并且整合了Ribbon和Eureka。
1.为原有的consumer项目添加Feign 依赖
project(':maoj-eureka-consumer'){
dependencies {
compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
// compile('org.springframework.cloud:spring-cloud-starter-netflix-ribbon')
compile('org.springframework.cloud:spring-cloud-starter-openfeign')
}
}
2.创建一个Feign接口,并添加@FeignClient注解
@FeignClient("maoj-eureka-provider")
public interface UserFeignClient {
@GetMapping(value = "/users/{id}")
User findUser(@PathVariable("id") Long id);
}
注解中的maoj-eureka-provider可以换成任意客户端的名称,用于创建Ribbon负载均衡器。本例中使用了Eureka,所以Ribbon会把maoj-eureka-provider解析成eureka中服务的名称。
3.修改启动类,为其添加@EnableFeginClients注解
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class MaojEurekaConsumerApplication {
// @Bean
// @LoadBalanced
// public RestTemplate restTemplate(){
// return new RestTemplate();
// }
public static void main(String[] args) {
SpringApplication.run(MaojEurekaConsumerApplication.class, args);
}
}
4.启动注册中心,和多个provider实例,和本项目,访问http://localhost:8010/consumer/users/1即可实现和和上篇文章一样的效果。
自定义Feign配置
在spring cloud中Feign的默认配置是FeignClientsConfiguration,该类定义了Feign默认使用的编码器,解码器,所使用的契约等。在spring cloud中,Feign默认使用的契约是SpringMvcContract,因此它可以使用Spring MVC的注解。
1.添加feign的配置文件
@Configuration
public class FeignConfiguration {
@Bean
public Contract feignContract(){
return new feign.Contract.Default();
}
}
2.在feign接口注解中标注使用的configuration
@FeignClient(name = "maoj-eureka-provider",configuration = FeignConfiguration.class)
public interface UserFeignClient {
@GetMapping(value = "/users/{id}")
User findUser(@PathVariable("id") Long id);
}
这样就实现了自定义feign配置,同理也可以对Feign的编码器,解码器等进行配置。