一、Feign实战应用
Feign的客户端与服务提供者的controller代码非常相似:
 有没有一种办法简化这种重复的代码编写呢?
 方式一:继承
 优点: 简单。实现了代码共享。
 缺点:服务提供方、服务消费方紧耦合。参数列表中的注解映射并不会继承,因此Controller中必须再次声明方法、参数列表、注解。
  方式二:抽取。
抽取:将Feign的Client抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给所有消费者使用。
例如,将UserClient、User、Feign的默认配置都抽取到一个feign-api包中,所有微服务引用该依赖包,即可直接使用。

实现抽取的步骤如下:
1.首先创建一个module,命名为feign-api,然后引入feign的starter依赖
 2.将order-service中编写的UserClient、User、DefaultFeignConfiguration都复制到feign-api项目中
 3.在order-service中引入feign-api的依赖
 4.修改order-service中的所有与上述三个组件有关的import部分,改成导入feign-api中的包
 5.重启测试
具体实现如下:
 步骤1:首先创建一个module,命名为feign-api:
步骤2:在feign-api中然后引入feign的starter依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>步骤3:然后,order-service中编写的UserClient、User、DefaultFeignConfiguration都复制到feign-api项目中:
步骤4:在order-service中使用feign-api
首先,删除order-service中的UserClient、User、DefaultFeignConfiguration等类或接口。
在order-service的pom文件中中引入feign-api的依赖:
<dependency>
    <groupId>cn.it.feign</groupId>
    <artifactId>feign-api</artifactId>
    <version>1.0</version>
</dependency>修改order-service中的所有与上述三个组件有关的导包部分,改成导入feign-api中的包
步骤5:重启测试:
因为UserClient现在在cn.it.feign.clients包下,而order-service的@EnableFeignClients注解是在cn.it.order包下,不在同一个包,无法扫描到UserClient。
解决扫描包问题:
方式一:
指定Feign应该扫描的包:
@EnableFeignClients(basePackages = "cn.it.feign.clients")方式二:
指定需要加载的Client接口:
@EnableFeignClients(clients = {UserClient.class})二、Feign性能优化
Feign底层的客户端实现:
 URLConnection:默认实现,不支持连接池。
 Apache HttpClient :支持连接池。
 OKHttp:支持连接池。
因此优化Feign的性能主要包括:
1.使用连接池代替默认的URLConnection。
 2.日志级别,最好用basic或none。
Feign的优化:
 1.日志级别尽量用basic
 2.使用HttpClient或OKHttp代替URLConnection:(1)引入feign-httpClient依赖。(2)配置文件开启httpClient功能,设置连接池参数












![LeetCode[中等] 17. 电话号码的字母组合](https://i-blog.csdnimg.cn/direct/379252bcc4684e7a8a609be563d80bb1.png)






