基于feign的远程调用
1.引入依赖
1 2 3 4
| <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
|
2.在服务调用方即消费者的服务启动类上加上注解 @EnableFeignClients
1 2 3 4 5 6 7
| @EnableFeignClients() public class OrderApplication {
public static void main(String[] args) { SpringApplication.run(OrderApplication.class, args); } }
|
3.编写客户端
1 2 3 4 5 6
| @FeignClient(value = "userservice") public interface UserClient {
@GetMapping("/user/{id}") User findById(@PathVariable("id") Long id); }
|
Feign主要是基于注解来声明远程调用的信息,如:
- 服务名称:userservice
- 请求方式:GET
- 请求路径:/user/{id}
- 请求参数:Long id
- 返回值类型:User
自定义Feign配置
方式一:配置文件方式
1.全局生效:
1 2 3 4 5
| feign: client: config: default: loggerLevel: Full
|
2.局部服务生效:
1 2 3 4 5
| feign: client: config: userservice: loggerLevel: Full
|
方式二:java代码方式
1.声明一个bean
1 2 3 4 5 6
| public class DefaultFeignConfiguration { @Bean public Logger.Level logLevel(){ return Logger.Level.BASIC; } }
|
2.全局配置:
1
| @EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)
|
3.局部配置:
1
| @FeignClient(value = "userservice", defaultConfiguration = DefaultFeignConfiguration.class)
|
Feign性能优化
Feign底层客户端实现:
- URLConnection:默认实现,不支持连接池
- Apache HttpClient:支持连接池
- OKHttp:支持连接池
优化点:
- 使用有连接池的代替默认的URLConnection
- 日志级别,最好用basic或none
连接池配置:
1.引入依赖:
1 2 3 4 5
| <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency>
|
2.配置连接池:
1 2 3 4 5 6 7 8 9
| feign: client: config: default: loggerLevel: BASIC httpclient: enabled: true max-connections: 200 max-connections-per-route: 50
|
Feign实践方式
将FeignClient单独抽取一个模块,将pojo、默认配置等放到模块中。
1.新建一个module,命名例如user-api,引入feign的starter依赖
1 2 3 4
| <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
|
2.编写Client、pojo、默认配置类
3.消费者引入user-api的依赖
4.在@EnableFeignClients上指定client位置。
1
| @EnableFeignClients(clients = UserClient.class, defaultConfiguration = DefaultFeignConfiguration.class)
|