目录
一、简介
Feign是一种轻量级的Java REST客户端,它简化了与RESTful服务的交互。Feign是Netflix开源的项目,旨在提供一种简单的方法来定义、绑定和使用HTTP请求,使得开发者可以更容易地使用和测试RESTful服务。
Feign提供了一种声明式的方式来定义HTTP请求,可以通过创建一个接口来定义请求方法、路径、参数和头部信息。Feign使用了基于注解的方式来实现这些定义,使得开发者可以很方便地进行请求的调用和维护。
Feign内部使用了Java的动态代理技术来生成实际的HTTP请求处理代码,它支持多种HTTP请求方式,包括GET、POST、PUT、DELETE等。Feign还提供了一些对请求的处理和错误处理的配置选项,以及对请求日志和统计的支持。
使用Feign可以减少开发者编写HTTP客户端的工作量,使得调用RESTful服务变得更加简单和高效。Feign还与Netflix的其他开源项目(如Ribbon和Hystrix)有良好的集成,可以与它们一起使用以实现更强大的功能。
二、例子
2.1、先看整体的结构
Feign相关的放在了api里面,里面有着实体,factory,service等。
2.2、然后看service(以userService用户服务为例)
/**
* 用户服务
*
* @author ruoyi
*/
@FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class)
public interface RemoteUserService
{
/**
* 通过用户名查询用户信息
*
* @param username 用户名
* @param source 请求来源
* @return 结果
*/
@GetMapping("/user/info/{username}")
public R<LoginUser> getUserInfo(@PathVariable("username") String username, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
/**
* 注册用户信息
*
* @param sysUser 用户信息
* @param source 请求来源
* @return 结果
*/
@PostMapping("/user/register")
public R<Boolean> registerUserInfo(@RequestBody SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}
这个里面重要的就是@FeignClient注解,@Mapping 注解。
@FeignClient用于以声明的方式定义一个微服务的客户端。它与@RequestMapping注解一起使用,可以在Spring Boot应用程序中发送HTTP请求到另一个微服务。
2.3、远程调用的Controller层
/**
* 用户信息
*
* @author ruoyi
*/
@RestController
@RequestMapping("/user")
public class SysUserController extends BaseController
{
/**
* 获取当前用户信息
*/
@InnerAuth
@GetMapping("/info/{username}")
public R<LoginUser> info(@PathVariable("username") String username)
{
SysUser sysUser = userService.selectUserByUserName(username);
if (StringUtils.isNull(sysUser))
{
return R.fail("用户名或密码错误");
}
// 角色集合
Set<String> roles = permissionService.getRolePermission(sysUser);
// 权限集合
Set<String> permissions = permissionService.getMenuPermission(sysUser);
LoginUser sysUserVo = new LoginUser();
sysUserVo.setSysUser(sysUser);
sysUserVo.setRoles(roles);
sysUserVo.setPermissions(permissions);
return R.ok(sysUserVo);
}
}
这里就是普通的Controller
注意点: Mapping里面的路径要和相应Controller的相对应,Controller中的@RequestMapping(“/user”)也要加上到Feign里面去。
2.4、fallbackFactory = RemoteUserFallbackFactory
/**
* 用户服务降级处理
*
* @author ruoyi
*/
@Component
public class RemoteUserFallbackFactory implements FallbackFactory<RemoteUserService>
{
private static final Logger log = LoggerFactory.getLogger(RemoteUserFallbackFactory.class);
@Override
public RemoteUserService create(Throwable throwable)
{
log.error("用户服务调用失败:{}", throwable.getMessage());
return new RemoteUserService()
{
@Override
public R<LoginUser> getUserInfo(String username, String source)
{
return R.fail("获取用户失败:" + throwable.getMessage());
}
@Override
public R<Boolean> registerUserInfo(SysUser sysUser, String source)
{
return R.fail("注册用户失败:" + throwable.getMessage());
}
};
}
}
这个里面就是遇到错误时的处理,记得名字对应
2.5、resource里面也要配置
记得填入新增的Factory,不然会不生效