当前位置:   article > 正文

微服务feign调用异常传递处理 fallbackFactory_springcloud异常处理

springcloud异常处理

若依的处理方式:

通过fallbackFactory进行容错处理,调用后判断是否返回失败,失败就抛异常,通过Throwable透传异常message,报错到前端页面。

注意:客户端要熔断降级必须在yaml文件里进行配置。例如:

  1. feign:
  2. hystrix:
  3. enabled:true

SysUserController :

  1. package com.ruoyi.system.controller;
  2. import java.io.IOException;
  3. import java.util.List;
  4. import java.util.Set;
  5. import java.util.stream.Collectors;
  6. import javax.servlet.http.HttpServletResponse;
  7. import org.apache.commons.lang3.ArrayUtils;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.validation.annotation.Validated;
  10. import org.springframework.web.bind.annotation.DeleteMapping;
  11. import org.springframework.web.bind.annotation.GetMapping;
  12. import org.springframework.web.bind.annotation.PathVariable;
  13. import org.springframework.web.bind.annotation.PostMapping;
  14. import org.springframework.web.bind.annotation.PutMapping;
  15. import org.springframework.web.bind.annotation.RequestBody;
  16. import org.springframework.web.bind.annotation.RequestMapping;
  17. import org.springframework.web.bind.annotation.RestController;
  18. import org.springframework.web.multipart.MultipartFile;
  19. import com.ruoyi.common.core.constant.UserConstants;
  20. import com.ruoyi.common.core.domain.R;
  21. import com.ruoyi.common.core.utils.StringUtils;
  22. import com.ruoyi.common.core.utils.poi.ExcelUtil;
  23. import com.ruoyi.common.core.web.controller.BaseController;
  24. import com.ruoyi.common.core.web.domain.AjaxResult;
  25. import com.ruoyi.common.core.web.page.TableDataInfo;
  26. import com.ruoyi.common.log.annotation.Log;
  27. import com.ruoyi.common.log.enums.BusinessType;
  28. import com.ruoyi.common.security.annotation.InnerAuth;
  29. import com.ruoyi.common.security.annotation.RequiresPermissions;
  30. import com.ruoyi.common.security.utils.SecurityUtils;
  31. import com.ruoyi.system.api.domain.SysDept;
  32. import com.ruoyi.system.api.domain.SysRole;
  33. import com.ruoyi.system.api.domain.SysUser;
  34. import com.ruoyi.system.api.model.LoginUser;
  35. import com.ruoyi.system.service.ISysConfigService;
  36. import com.ruoyi.system.service.ISysDeptService;
  37. import com.ruoyi.system.service.ISysPermissionService;
  38. import com.ruoyi.system.service.ISysPostService;
  39. import com.ruoyi.system.service.ISysRoleService;
  40. import com.ruoyi.system.service.ISysUserService;
  41. /**
  42. * 用户信息
  43. *
  44. * @author ruoyi
  45. */
  46. @RestController
  47. @RequestMapping("/user")
  48. public class SysUserController extends BaseController
  49. {
  50. @Autowired
  51. private ISysUserService userService;
  52. @Autowired
  53. private ISysRoleService roleService;
  54. @Autowired
  55. private ISysDeptService deptService;
  56. @Autowired
  57. private ISysPostService postService;
  58. @Autowired
  59. private ISysPermissionService permissionService;
  60. @Autowired
  61. private ISysConfigService configService;
  62. /**
  63. * 获取当前用户信息
  64. */
  65. @InnerAuth
  66. @GetMapping("/info/{username}")
  67. public R<LoginUser> info(@PathVariable("username") String username)
  68. {
  69. SysUser sysUser = userService.selectUserByUserName(username);
  70. if (StringUtils.isNull(sysUser))
  71. {
  72. return R.fail("用户名或密码错误");
  73. }
  74. // 角色集合
  75. Set<String> roles = permissionService.getRolePermission(sysUser);
  76. // 权限集合
  77. Set<String> permissions = permissionService.getMenuPermission(sysUser);
  78. LoginUser sysUserVo = new LoginUser();
  79. sysUserVo.setSysUser(sysUser);
  80. sysUserVo.setRoles(roles);
  81. sysUserVo.setPermissions(permissions);
  82. return R.ok(sysUserVo);
  83. }
  84. /**
  85. * 注册用户信息
  86. */
  87. @InnerAuth
  88. @PostMapping("/register")
  89. public R<Boolean> register(@RequestBody SysUser sysUser)
  90. {
  91. String username = sysUser.getUserName();
  92. if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser"))))
  93. {
  94. return R.fail("当前系统没有开启注册功能!");
  95. }
  96. if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(sysUser)))
  97. {
  98. return R.fail("保存用户'" + username + "'失败,注册账号已存在");
  99. }
  100. return R.ok(userService.registerUser(sysUser));
  101. }
  102. }

RemoteUserService:

  1. package com.ruoyi.system.api;
  2. import org.springframework.cloud.openfeign.FeignClient;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. import org.springframework.web.bind.annotation.PathVariable;
  5. import org.springframework.web.bind.annotation.PostMapping;
  6. import org.springframework.web.bind.annotation.RequestBody;
  7. import org.springframework.web.bind.annotation.RequestHeader;
  8. import com.ruoyi.common.core.constant.SecurityConstants;
  9. import com.ruoyi.common.core.constant.ServiceNameConstants;
  10. import com.ruoyi.common.core.domain.R;
  11. import com.ruoyi.system.api.domain.SysUser;
  12. import com.ruoyi.system.api.factory.RemoteUserFallbackFactory;
  13. import com.ruoyi.system.api.model.LoginUser;
  14. /**
  15. * 用户服务
  16. *
  17. * @author ruoyi
  18. */
  19. @FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class)
  20. public interface RemoteUserService
  21. {
  22. /**
  23. * 通过用户名查询用户信息
  24. *
  25. * @param username 用户名
  26. * @param source 请求来源
  27. * @return 结果
  28. */
  29. @GetMapping("/user/info/{username}")
  30. public R<LoginUser> getUserInfo(@PathVariable("username") String username, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
  31. /**
  32. * 注册用户信息
  33. *
  34. * @param sysUser 用户信息
  35. * @param source 请求来源
  36. * @return 结果
  37. */
  38. @PostMapping("/user/register")
  39. public R<Boolean> registerUserInfo(@RequestBody SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
  40. }
RemoteUserFallbackFactory:
  1. package com.ruoyi.system.api.factory;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.cloud.openfeign.FallbackFactory;
  5. import org.springframework.stereotype.Component;
  6. import com.ruoyi.common.core.domain.R;
  7. import com.ruoyi.system.api.RemoteUserService;
  8. import com.ruoyi.system.api.domain.SysUser;
  9. import com.ruoyi.system.api.model.LoginUser;
  10. /**
  11. * 用户服务降级处理
  12. *
  13. * @author ruoyi
  14. */
  15. @Component
  16. public class RemoteUserFallbackFactory implements FallbackFactory<RemoteUserService>
  17. {
  18. private static final Logger log = LoggerFactory.getLogger(RemoteUserFallbackFactory.class);
  19. @Override
  20. public RemoteUserService create(Throwable throwable)
  21. {
  22. log.error("用户服务调用失败:{}", throwable.getMessage());
  23. return new RemoteUserService()
  24. {
  25. @Override
  26. public R<LoginUser> getUserInfo(String username, String source)
  27. {
  28. //throwable会把报错带过来
  29. return R.fail("获取用户失败:" + throwable.getMessage());
  30. }
  31. @Override
  32. public R<Boolean> registerUserInfo(SysUser sysUser, String source)
  33. {
  34. return R.fail("注册用户失败:" + throwable.getMessage());
  35. }
  36. };
  37. }
  38. }

在auth服务中远程调用system服务:通过返回码判断是否成功,失败抛异常打异常message

  1. /**
  2. * 登录
  3. */
  4. public LoginUser login(String username, String password)
  5. {
  6. // 查询用户信息
  7. R<LoginUser> userResult = remoteUserService.getUserInfo(username, SecurityConstants.INNER);
  8. if (R.FAIL == userResult.getCode())
  9. {
  10. //判断如果失败,就抛异常,打出远程调用的报错message
  11. throw new ServiceException(userResult.getMsg());
  12. }
  13. if (StringUtils.isNull(userResult) || StringUtils.isNull(userResult.getData()))
  14. {
  15. recordLogininfor(username, Constants.LOGIN_FAIL, "登录用户不存在");
  16. throw new ServiceException("登录用户:" + username + " 不存在");
  17. }
  18. LoginUser userInfo = userResult.getData();
  19. SysUser user = userResult.getData().getSysUser();
  20. if (UserStatus.DELETED.getCode().equals(user.getDelFlag()))
  21. {
  22. recordLogininfor(username, Constants.LOGIN_FAIL, "对不起,您的账号已被删除");
  23. throw new ServiceException("对不起,您的账号:" + username + " 已被删除");
  24. }
  25. if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
  26. {
  27. recordLogininfor(username, Constants.LOGIN_FAIL, "用户已停用,请联系管理员");
  28. throw new ServiceException("对不起,您的账号:" + username + " 已停用");
  29. }
  30. if (!SecurityUtils.matchesPassword(password, user.getPassword()))
  31. {
  32. recordLogininfor(username, Constants.LOGIN_FAIL, "用户密码错误");
  33. throw new ServiceException("用户不存在/密码错误");
  34. }
  35. recordLogininfor(username, Constants.LOGIN_SUCCESS, "登录成功");
  36. return userInfo;
  37. }

博客12处理方式很类似:

博客1:

feign异常传递的两种方式 fallbackfactory和全局处理 获取服务端自定义异常

博客2:

SpringCloud feign微服务调用之间的异常处理_zf12178的博客-CSDN博客_feign微服务调用之间的异常处理方式

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/878110
推荐阅读
相关标签
  

闽ICP备14008679号