若依 Feign 使用经验

一、简介

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、先看整体的结构

api结构

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,不然会不生效

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小陈正在努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值