Feign的封装和使用

matevip 2021-6-3 大约 2 分钟

# 一、Feign介绍

Feign旨在是编写Java Http客户端变得更加容易,主要是解决微服务之间跨模块的调用,当然也可以用于与其他模块请求使用。

之前使用Ribbon+RestTemplate时,利用RESTTemplate请求的封装处理,形成了一套模板化的调用方法。但是在实际开发中,有偶遇对于服务依赖的调用可能不止一处,往往一个借口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,Feign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务借口的定义。在Feign的实现下,我们只需创建一个接口并使用注解的方式来配置它(以前是Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),即可完成对服务提供方的接口绑定,简化了使用Spring Cloud Ribbon自动封装服务调用客户端的开发量。

# 二、模块集成方法

# 2.1 引入依赖

<dependency>
    <groupId>vip.mate</groupId>
    <artifactId>mate-starter-feign</artifactId>
</dependency>
1
2
3
4

其中微服务模块中必须要引入mate-starter-cloud,此模块也集成了mate-starter-feign。两者引用其一即可。

# 2.2 启用feign

在项目的启动类中,增加一段注解

@EnableMateFeign
1

# 2.3 接口类示例

@FeignClient(value = "mate-system")
public interface ISysUserProvider {
    @GetMapping("/provider/user/id")
	Result<User> getUserById(@RequestParam("id") Long id);
}
1
2
3
4
5

此接口类放在mate-xxx-api模块的feign包下 主要写如下内容:

@FeignClient: 指定value为微服务名称

# 2.4 实现类示例

实现类就是一个RestController,实现其方法就可以。示例如下:

@Slf4j
@RestController
@AllArgsConstructor
@Api(tags = "用户远程调用")
public class SysUserProvider implements ISysUserProvider {

	private final IUserService userService;
	private final HttpServletRequest request;

	@Override
	@GetMapping(ProviderConstant.PROVIDER_USER_ID)
	@Log(value = "用户ID查询", exception = "用户ID查询请求失败")
	@ApiOperation(value = "用户ID查询", notes = "用户ID查询")
	public Result<User> getUserById(Long id) {
		User user = userService.getById(id);
		return Result.data(user);
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 2.5 配置文件对feign的一些配置项

#feign配置
feign:
  hystrix:
    enabled: true
    #sentinel:
    #enabled: true
  okhttp:
    enabled: true
  httpclient:
    enabled: false
1
2
3
4
5
6
7
8
9
10

# 三、题外话

建议尽量按样例的语法规范来写feign调用接口,这样,在服务模块的扫描中,可以快速区分出来是普通的 controller 还是 feign 调用。

上次编辑于: 2021年6月6日 17:30
贡献者: matevip