微服务之OpenFeigin
在我们工程中怎么添加Feign
定义一个03-ms-alibaba-feign-api工程
- ①:第一步,引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring‐cloud‐starter‐openfeign</artifactId>
</dependency>
- ②:第二步:修改打包方式(因为该工程式一个普通的jar 不需要打可执行的jar)
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
</plugin>
</plugins>
</build>
- 第三步:编写声明式接口
@FeignClient(name = "product-center", configuration = ProductCenterFeignConfig.class)
//@FeignClient(name = "product-center")
public interface ProductCenterFeignApi {
/**
* 声明式接口,远程调用http://product-center/selectProductInfoById/{productNo}
* @param productNo
* @return
*/
@
RequestMapping("/selectProductInfoById/{productNo}")
ProductInfo selectProductInfoById(@PathVariable("productNo") String productNo);
@
RequestMapping("/getToken4Header")
String getToken4Header();
}
调用者工程03-ms-alibaba-feign-order
- 第一步:引入依赖包 03-ms-alibaba-feign-api
<dependency>
<groupId>com.tuling</groupId>
<artifactId>03-ms-alibaba-feign-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
- 第二步: 开启注解加入 @EnableFeignClients
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class 03MsAlibabaFeignOrderApplication {
public static void main(String[] args) {
SpringApplication.run(03MsAlibabaFeignOrderApplication.class, args);
}
}
- 第三步:调用方式(像调用本地方式一样调用远程服务)
@Autowired
private ProductCenterFeignApi productCenterFeignApi;
ProductInfo productInfo = productCenterFeignApi.selectProductInfoById(orderNo);
如何自定义Feign
- 默认情况下,Feign的调用式不打印日志,我们需要通过自定义来打印我们的Feign的日志 (basic适 用于生产环境)
我们在03-ms-alibaba-feign-api工程中添加Feign的自定义配置
/**
* 这个类上千万不要添加@Configuration,不然会被作为全局配置文件共享
* Created by smlz on 2019/11/22.
*/
public class ProductCenterFeignConfig {
@Bean
public Logger.Level level() {
//return Logger.Level.FULL;
//return Logger.Level.HEADERS;
return Logger.Level.BASIC;
//return Logger.Level.NONE;
}
/**
* 根据SpringBoot自动装配FeignClientsConfiguration 的FeignClient的契约是SpringMvc
*
通过修改契约为默认的Feign的锲约,那么就可以使用默认的注解
* @return
*/
/*@Bean
public Contract feiContract() {
return new Contract.Default();
}*/
@Bean
public RequestInterceptor requestInterceptor() {
return new RequestInterceptor();
}
}
②:针对调用端工程03-ms-alibaba-customcfg-feign-order针对日志com.tuling.feignapi 包下的日志级 别必须调整为DEBUG级别的 不然是不会打印日志的
logging:
level:
com:
tuling:
feignapi: debug
拦截器的应用配置
// 拦截器类
public class TulingRequestInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
template.header("Token",request.getHeader("Token"));
}
}
//feign自定义配置中配置
public class ProductCenterFeignConfig {
@Bean
public RequestInterceptor requestInterceptor() {
return new RequestInterceptor();
}
}
// 接口定义
@FeignClient(name = "product-center",configuration = ProductCenterFeignConfig.class)
public interface ProductCenterFeignApi {
@RequestMapping("/getToken4Header")
String getToken4Header(@RequestHeader("token") String token);
}
服务提供者
@RestController
@Slf4j
public class ProductInfoController{
@Autowired
private ProductInfoMapper productInfoMapper;
@RequestMapping("/getToken4Header")
public String getToken4Header(@RequestHeader("Token") String token) {
log.info("token:{}",token);
return token;
}
Feign调用优化方案
feign:
client:
config:
product‐center:
loggerLevel: full
httpclient:
#让feign底层使用HttpClient去调用
enabled: true
max‐connections: 200 #最大连接数
max‐connections‐per‐route: 50 #为每个url请求设置最大连接数