项目源代码:https://download.csdn.net/download/weixin_42950079/87177425
Feign 是 Netflix 公司开发的声明式 HTTP 客户端,能够帮助我们更加便捷、优雅的调用 HTTP API。并且 Feign 内置了 Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。
Feign 有一套自己的注解,想要使用 Feign 是需要学习这一套注解 ( 如:@RequestMapping
--> @RequestLine
,@Pathvairable
--> @Param
)。
Spring Cloud 1 早期版本就是用的原生Fegin. 随着netflix的停更替换成了Open feign
前面讲了一大堆,还想都还是没有讲到什么是契约配置,契约配置有什么作用?
根据前面的概念描述,我们知道了 Spring Cloud 的早期版本使用的就是 Feign。所以有些公司开发使用的就是早期的 Spring Cloud,而在后期公司想进行版本升级的时候,改成使用Spring Cloud OpenFeign,但 Feign 使用的是他自己独有的那一套注解,如果我们想全部进行修改成 Spring MVC注解的话,就会非常麻烦!那么有没有办法,让我们升级版本又不需要改动太多代码呢?
也就是说:通过契约配置,我们可以在 OpenFeign 中使用 Feign 的注解,那么该如何配置呢?
import feign.Contract;
import feign.Logger;
import org.springframework.context.annotation.Bean;
/**
* 全局配置:加了@Configuration注解表示全局配置,对所有服务起作用
* 局部配置:不加@Configuration注解表示局部配置,只针对指定的一个服务起作用
*/
public class OpenFeignConfig {
// 日志配置
@Bean
public Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}
// 契约配置
@Bean
public Contract feignContract(){
return new Contract.Default();
}
}
import com.cd.order8010.config.OpenFeignConfig;
import feign.RequestLine;
import org.springframework.cloud.openfeign.FeignClient;
/**
* 添加 Feign 接口和方法:
* * name:指定调用rest接口所对应的服务名
* * path:指定调用rest接口所在的StockController指定的RequestMapping的路径,如果StockController上没有RequestMapping,则不指定path属性
* * configuration:指定OpenFeign接口的扩展
*/
//@FeignClient(name = "stock-service", path = "/stock", configuration = OpenFeignConfig.class) //OpenFeign写法
@FeignClient(value = "stock-service", path = "/stock", configuration = OpenFeignConfig.class) //Feign写法
public interface StockFeignService {
// 声明要调用的rest接口对应的方法
//@RequestMapping("/reduce")
@RequestLine("GET /reduce")
public String reduce();
}
feign:
client:
config:
stock-service: # 这里用default就是全局配置。如果是写服务名称(如:stock-service),则是针对某个微服务的配置,即局部配置
contract: feign.Contract.Default # 设置成默认的契约(即将SpringMVC注解还原成feign原生注解)
import com.cd.order8010.config.OpenFeignConfig;
import feign.RequestLine;
import org.springframework.cloud.openfeign.FeignClient;
/**
* 添加 Feign 接口和方法:
* * name:指定调用rest接口所对应的服务名
* * path:指定调用rest接口所在的StockController指定的RequestMapping的路径,如果StockController上没有RequestMapping,则不指定path属性
* * configuration:指定OpenFeign接口的扩展
*/
//@FeignClient(name = "stock-service", path = "/stock")
@FeignClient(value = "stock-service", path = "/stock")
public interface StockFeignService {
// 声明要调用的rest接口对应的方法
//@RequestMapping("/reduce")
@RequestLine("GET /reduce")
public String reduce();
}