Feign
通过Feign可以实现服务间的Http调用。
Feign组成:
1. Feign的简单使用
-
maven引入坐标
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
-
每个需要被发现与注册的服务加上
@EnableDiscoveryClient
注解调用方通过
@EnableFeignClients
表示Feign客户端。@EnableFeignClients
的basePackages
属性指明Feign接口所在的包@SpringBootApplication @EnableDiscoveryClient @MapperScan("com.banmingi.nodeapp.usercenter") public class UserCenterApplication { public static void main(String[] args) { SpringApplication.run(UserCenterApplication.class); } }
@SpringBootApplication @MapperScan("com.banmingi.nodeapp.contentcenter") @EnableFeignClients @EnableDiscoveryClient public class ContentCenterApplication { public static void main(String[] args) { SpringApplication.run(ContentCenterApplication.class); } }
-
定义Feign接口,实现远程http调用,接口里的方法和user-center服务里面的 UserController一致。
在这里可以通过
path
属性指定前缀,比如path = “users”,这样下面的GetMapping里面的内容只要"/{id}“就可以了,比如UserController上面有个@RequestMapping(”/users"),可以设置path与之对应。UserController:
@RestController @RequestMapping("/users") public class UserController { @Resource private UserService userService; /** * 根据id查询用户 * @param id * @return */ @GetMapping("/{id}") public User findById(@PathVariable Integer id) { System.out.println("我被请求了"); return this.userService.findById(id); } }
UserCenterFeignClient:
@FeignClient(name = "user-center",path = "users") public interface UserCenterFeignClient { /** * * @param id * @return */ @GetMapping("/{id}") User findById(@PathVariable Integer id); }
-
如果有多个Feign接口同时使用一个微服务,为了避免冲突(Spring只允许一个微服务存在),则需要在配置文件里面添加如下内容,表示后发现的bean会覆盖之前相同名称的bean。
spring: main: allow-bean-definition-overriding: true
2. Feign的日志配置
Feign的日志级别有NONE BASIC HEADERS FULL(从小到大),默认为NONE。
feign的日志是建立在 debug日志模式的基础上的,不管是全局配置还是局部配置,代码配置还是属性配置,都需要先把日志模式调成debug模式:(下面与调用UserCenterFeignClient接口的日志模式为例)
logging:
level:
com.banmingi.nodeapp.contentcenter.feignclient.UserCenterFeignClient: debug
-
局部日志配置(只作用在需要被调用的Feign接口上)
-
代码方式配置
别加@Configuration注解,否则必须挪到 @ComponentScan 所扫描的包以外 (Spring父子上下文)
写一个配置类:
/** * @auther 半命i 2020/4/7 * @description feign的配置类 * 别加@Configuration注解,否则必须挪到 @ComponentScan 所扫描的包以外 */ public class CenterFeignConfiguration { /** * 设置feign日志级别: NONE BASIC HEADERS FULL * @return */ @Bean public Logger.Level level() { return Logger.Level.FULL; } }
在 Feign接口
@FeignClient
中使用configuration属性指定配置类@FeignClient(name = "user-center",configuration = CenterFeignConfiguration.class) public interface UserCenterFeignClient { /** * * @param id * @return */ @GetMapping("/users/{id}") UserDTO findById(@PathVariable Integer id); }
-
属性方式配置
feign: client: config: #想要调用的微服务的名称 user-center: loggerLevel: FULL
-
-
全局日志配置(所有的Feign接口都将被影响)
-
代码方式配置
写一个全局配置类:
public class GlobalFeignConfiguration { /** * 设置feign日志级别: NONE BASIC HEADERS FULL * @return */ @Bean public Logger.Level level() { return Logger.Level.FULL; } }
在主启动类的
@EnableFeignClients
注解中配置属性defaultConfiguration@SpringBootApplication @MapperScan("com.banmingi.nodeapp.contentcenter") @EnableFeignClients(defaultConfiguration = CenterFeignConfiguration.class) @EnableDiscoveryClient public class ContentCenterApplication { public static void main(String[] args) { SpringApplication.run(ContentCenterApplication.class); } }
-
属性方式配置:
feign: client: config: #全局配置 default: loggerLevel: BASIC
-
3. Feign支持的配置项
除了日志,Feign还支持一下的配置项,但代码方式和属性方式有所不同
- 代码方式配置
-
属性方式配置
3. 通过 Feign 进行http请求网址
-
接口
@FeignClient(name = "baidu",url = "http://www.baidu.com") public interface TestBaiduFeignClient { @GetMapping("") String index(); }
name必须指明,否则会报错。值可以随便取。
url为请求的地址
-
测试
@RestController @RequestMapping("test") public class TestController { @Autowired private TestBaiduFeignClient testBaiduFeignClient; @GetMapping("/baidu") public String baiduIndex() { return this.testBaiduFeignClient.index(); } }
-
请求结果
4. RestTemplate vs Feign
5. Feign 性能优化
-
日志级别
日志级别越低,性能越高,但有时候我们需要打印日志来查看一些请求情况,这里建议设置成 BASIC
-
Feign连接池
Feign支持httpclient和okhttp作为连接池提升性能,下面与httpclient为例(okhttp也是这样配置的)
-
引如httpclient坐标
<dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency>
-
属性配置
feign: # 让feign使用 apache 的httpclient做请求,而不是默认的 urlconnection httpclient: enabled: true # feign 最大连接数 max-connections: 200 # feign 单个路径的最大连接数 max-connections-per-route: 50
-
6. Feign常见问题总结
详见这篇文章:Feign常见问题总结