OpenFeign技术可以让远程调用像本地方法调用一样简单,OpenFeign是一个声明式的HTTP客户端框架,它简化了编写 REST 客户端的过程
1. 添加依赖
在项目中添加OpenFeign的依赖,最好就在抽取的api工程中
1 2 3 4
| <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
|
2. 创建Feign客户端
- 在api工程定义一个接口来描述远程服务。
- 使用
@FeignClient
注解来标识远程调用接口,并指定服务名、接口路径.
- 对应服务工程引入api工程
1 2 3 4 5
| <dependency> <groupId>com.hmall</groupId> <artifactId>hm-api</artifactId> <version>1.0.0</version> </dependency>
|
- 对应服务工程的
Controller
实现该Feign
接口
1 2 3 4 5 6 7 8 9 10 11
| @FeignClient(name = "xxx-service") public interface XxxClient { @GetMapping("/xxxx/{id}") Xxx getXxx(@PathVariable("id") String id);
@PostMapping("/xxxx") Xxx createXxx(@RequestBody Xxx xxx);
...... }
|
接口中的几个关键信息:
@FeignClient(name="xxx-service")
:声明服务名称
@FeignClient(path = "/xxxx")
: 相当于XxxController类上的@RequestMapping(“/xxxx”)指定的路径
@GetMapping
:声明请求方式
@RequestParam("ids") Collection<Long> ids
:声明请求参数
List<XxxDTO>
:返回值类型
3. 使用Feign客户端
在调用者工程的实现类调用XxxClient
的方法
1 2 3 4 5 6 7 8 9 10
| @Service public class XxxServiceImpl { @Autowired private XxxClient xxxClient;
public void Handle(String id) { List<XxxDTO> xxxDTOList = xxxClient.getXxx(id); } }
|
4. 启用OpenFeign
在调用者工程的启动类添加@EnableFeignClients
注解,启用OpenFeign
1 2 3 4 5 6 7 8
| @SpringBootApplication @EnableFeignClients @MapperScan("com.xxx.mapper") public class XxxApplication { public static void main(String[] args) { SpringApplication.run(XxxApplication.class, args); } }
|
5. OKHttp
Feign底层发起http请求,依赖于第三方的http客户端框架.常用的http客户端有:
- HttpURLConnection:默认实现,不支持连接池
- Apache HttpClient :支持连接池
- OKHttp:支持连接池
5.1. 更换为OKHttp
在调用者工程添加OKHttp的依赖
1 2 3 4 5
| <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-okhttp</artifactId> </dependency>
|
在调用者工程的application.yml
中添加配置开启Feign的连接池功能
1 2 3
| feign: okhttp: enabled: true
|