当前位置:   article > 正文

【Spring Cloud、OpenFeign】搭建Spirng Cloud项目(七):Spring Cloud使用OpenFeign调用其他服务_openfeign 调用其他服务接口

openfeign 调用其他服务接口

一、环境准备

1、环境搭建,查看Spring Cloud专栏

2、提供服务方准备一个接口供该使用服务方(OpenFeign)使用

在这里插入图片描述

二、OpenFeign使用:调用提供方服务的接口就是直接调用提供方服务的Http请求,跟调用本地方法一样。

1、pom依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-openfeign</artifactId>
  4. </dependency>

2、创建一个接口类,注意类上的注解“@FeignClient”和方法上的注解“@GetMapping”,类上注解“@FeignClient”的value值等于提供方注册到nacos中的名称,方法上的注解“@GetMapping”需要跟提供服务方一致和Url需要一致。

  1. package com.cyun.security.oauth2.feign.server;
  2. import com.cyun.core.vo.LoginUserVO;
  3. import com.cyun.security.oauth2.feign.config.FeignSysUserConfiguration;
  4. import com.cyun.security.oauth2.feign.config.FeignSysUserFallbackFactory;
  5. import org.springframework.cloud.openfeign.FeignClient;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.RequestParam;
  8. /**
  9. * 系统服务 接口
  10. *
  11. * @author He PanFu
  12. * @date 2022-03-12 10:50:02
  13. */
  14. @FeignClient(value = "sys-server")
  15. public interface IFeignSysUserService {
  16. /**
  17. * 获取登录用户信息
  18. *
  19. * @param username 用户名
  20. * @param clientId 客户端标识
  21. * @return 登录用户信息
  22. */
  23. @GetMapping(value = "/sys_server/user/get/login/info")
  24. LoginUserVO getLoginUserInfo(@RequestParam String username,
  25. @RequestParam String clientId);
  26. }

3、调用:直接调用IFeignSysUserService 服务的方法

在这里插入图片描述

  1. package com.cyun.security.oauth2.service.impl;
  2. import com.cyun.core.vo.LoginUserVO;
  3. import com.cyun.security.oauth2.exception.RetryException;
  4. import com.cyun.security.oauth2.feign.server.IFeignSysUserService;
  5. import com.cyun.security.oauth2.service.AccountUserDetailsService;
  6. import lombok.RequiredArgsConstructor;
  7. import org.springframework.security.authentication.DisabledException;
  8. import org.springframework.security.authentication.InternalAuthenticationServiceException;
  9. import org.springframework.security.core.authority.AuthorityUtils;
  10. import org.springframework.security.core.userdetails.User;
  11. import org.springframework.security.core.userdetails.UserDetails;
  12. import org.springframework.security.core.userdetails.UsernameNotFoundException;
  13. import org.springframework.security.crypto.password.PasswordEncoder;
  14. import org.springframework.stereotype.Service;
  15. /**
  16. * 账号服务
  17. *
  18. * @author He PanFu
  19. * @date 2021-12-07 20:36:15
  20. */
  21. @Service("accountDetailsServiceImpl")
  22. @RequiredArgsConstructor
  23. public class AccountDetailsServiceImpl implements AccountUserDetailsService {
  24. private final IFeignSysUserService sysUserService;
  25. /**
  26. * 获取用户信息
  27. *
  28. * @param username 用户名
  29. * @return 用户信息
  30. * @throws UsernameNotFoundException 用户不存在
  31. */
  32. @Override
  33. public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
  34. final LoginUserVO loginUserVO = sysUserService.getLoginUserInfo(username, "test");
  35. return new User(loginUserVO.getUsername(), loginUserVO.getPassword(), AuthorityUtils.createAuthorityList(loginUserVO.getAuthorities()));
  36. }
  37. }

三、服务降级处理:当提供方超时或者异常时,调用降级方法。

1、方式一:配置fallback

  • 新增FeignSysUserFallback类,实现IFeignSysUserService接口
  1. package com.cyun.security.oauth2.feign.config;
  2. import com.cyun.core.vo.LoginUserVO;
  3. import com.cyun.security.oauth2.feign.server.IFeignSysUserService;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.springframework.stereotype.Component;
  6. /**
  7. * 系统服务 服务降级
  8. *
  9. * @author He PanFu
  10. * @date 2022-03-12 10:50:02
  11. */
  12. @Component
  13. @Slf4j
  14. public class FeignSysUserFallback implements IFeignSysUserService {
  15. @Override
  16. public LoginUserVO getLoginUserInfo(String username, String clientId) {
  17. log.error("获取用户登录信息失败,用户名:{},客户端标识:{}", username, clientId);
  18. return null;
  19. }
  20. }
  • @FeignClient注解上添加配置: fallback在这里插入图片描述
@FeignClient(value = "sys-server", fallback = FeignSysUserFallback.class)

2、方式二:配置fallbackFactory,可以获取异常报错信息

  • 新增FeignSysUserFallbackFactory类,实现FallbackFactory接口
    在这里插入图片描述
  1. package com.cyun.security.oauth2.feign.config;
  2. import com.cyun.core.vo.LoginUserVO;
  3. import com.cyun.security.oauth2.feign.server.IFeignSysUserService;
  4. import feign.hystrix.FallbackFactory;
  5. import lombok.extern.slf4j.Slf4j;
  6. import org.springframework.stereotype.Component;
  7. /**
  8. * 系统服务 服务降级(能得到错误信息)
  9. *
  10. * @author He PanFu
  11. * @date 2022-03-12 10:50:02
  12. */
  13. @Component
  14. @Slf4j
  15. public class FeignSysUserFallbackFactory implements FallbackFactory<IFeignSysUserService> {
  16. @Override
  17. public IFeignSysUserService create(Throwable throwable) {
  18. log.error(throwable.getMessage(), throwable);
  19. return new IFeignSysUserService() {
  20. @Override
  21. public LoginUserVO getLoginUserInfo(String username, String clientId) {
  22. log.error("获取用户登录信息失败,用户名:{},客户端标识:{}", username, clientId);
  23. return LoginUserVO.builder().failedFlag(true).build();
  24. }
  25. };
  26. }
  27. }
  • @FeignClient注解上添加配置: fallbackFactory
    在这里插入图片描述
@FeignClient(value = "sys-server", fallbackFactory = FeignSysUserFallbackFactory.class)

四、OpenFeign请求添加token,在请求头上添加内容

  • 创建FeignSysUserConfiguration类实现RequestInterceptor接口
    在这里插入图片描述
  1. package com.cyun.security.oauth2.feign.config;
  2. import com.cyun.tools.jwt.JwtUtil;
  3. import feign.RequestInterceptor;
  4. import feign.RequestTemplate;
  5. import org.springframework.beans.factory.annotation.Value;
  6. import org.springframework.context.annotation.Configuration;
  7. import org.springframework.web.context.request.RequestContextHolder;
  8. import org.springframework.web.context.request.ServletRequestAttributes;
  9. import javax.servlet.http.HttpServletRequest;
  10. /**
  11. * 系统服务 请求添加token
  12. *
  13. * @author He PanFu
  14. * @date 2022-03-12 10:50:02
  15. */
  16. @Configuration
  17. public class FeignSysUserConfiguration implements RequestInterceptor {
  18. @Override
  19. public void apply(RequestTemplate requestTemplate) {
  20. ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  21. HttpServletRequest request = attributes.getRequest();
  22. //添加token
  23. requestTemplate.header("Authorization", request.getHeader("Authorization"));
  24. }
  25. }
  • @FeignClient注解上添加配置: configuration
    在这里插入图片描述
@FeignClient(value = "sys-server", fallbackFactory = FeignSysUserFallbackFactory.class, configuration = FeignSysUserConfiguration.class)

五、问题总结

1、配置了(fallback)服务降级之后启动报错

解决方案:接口上不能添加@RequestMapper请求,去掉类上的@RequestMapper注解就能解决问题。参考链接

2、配置了(fallback)服务降级之后不生效

解决方案:查看依赖中是否依赖了Sentinel或Hystrix熔断框架,和是否配置了开启;
Sentinel:feign.sentinel.enabled=true
Hystrix:feign.hystrix.enabled=true

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

闽ICP备14008679号