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

本文详细介绍了如何在Spring Cloud环境中使用OpenFeign进行服务调用,包括添加依赖、创建接口、配置服务降级处理(通过fallback和fallbackFactory两种方式),以及在请求头中添加token。同时,文中提到了在服务降级后可能出现的问题及其解决方案,如去除@RequestMapper注解以解决启动报错问题。

一、环境准备

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

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

在这里插入图片描述

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

1、pom依赖

		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

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

package com.cyun.security.oauth2.feign.server;

import com.cyun.core.vo.LoginUserVO;
import com.cyun.security.oauth2.feign.config.FeignSysUserConfiguration;
import com.cyun.security.oauth2.feign.config.FeignSysUserFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * 系统服务 接口
 *
 * @author He PanFu
 * @date 2022-03-12 10:50:02
 */
@FeignClient(value = "sys-server")
public interface IFeignSysUserService {

    /**
     * 获取登录用户信息
     *
     * @param username 用户名
     * @param clientId 客户端标识
     * @return 登录用户信息
     */
    @GetMapping(value = "/sys_server/user/get/login/info")
    LoginUserVO getLoginUserInfo(@RequestParam String username,
                                 @RequestParam String clientId);
}

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

在这里插入图片描述

package com.cyun.security.oauth2.service.impl;

import com.cyun.core.vo.LoginUserVO;
import com.cyun.security.oauth2.exception.RetryException;
import com.cyun.security.oauth2.feign.server.IFeignSysUserService;
import com.cyun.security.oauth2.service.AccountUserDetailsService;
import lombok.RequiredArgsConstructor;
import org.springframework.security.authentication.DisabledException;
import org.springframework.security.authentication.InternalAuthenticationServiceException;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

/**
 * 账号服务
 *
 * @author He PanFu
 * @date 2021-12-07 20:36:15
 */
@Service("accountDetailsServiceImpl")
@RequiredArgsConstructor
public class AccountDetailsServiceImpl implements AccountUserDetailsService {

    private final IFeignSysUserService sysUserService;

    /**
     * 获取用户信息
     *
     * @param username 用户名
     * @return 用户信息
     * @throws UsernameNotFoundException 用户不存在
     */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        final LoginUserVO loginUserVO = sysUserService.getLoginUserInfo(username, "test");
        return new User(loginUserVO.getUsername(), loginUserVO.getPassword(), AuthorityUtils.createAuthorityList(loginUserVO.getAuthorities()));
    }
}

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

1、方式一:配置fallback

  • 新增FeignSysUserFallback类,实现IFeignSysUserService接口
package com.cyun.security.oauth2.feign.config;

import com.cyun.core.vo.LoginUserVO;
import com.cyun.security.oauth2.feign.server.IFeignSysUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * 系统服务 服务降级
 *
 * @author He PanFu
 * @date 2022-03-12 10:50:02
 */
@Component
@Slf4j
public class FeignSysUserFallback implements IFeignSysUserService {

    @Override
    public LoginUserVO getLoginUserInfo(String username, String clientId) {
        log.error("获取用户登录信息失败,用户名:{},客户端标识:{}", username, clientId);
        return null;
    }
}
  • @FeignClient注解上添加配置: fallback在这里插入图片描述
@FeignClient(value = "sys-server", fallback = FeignSysUserFallback.class)

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

  • 新增FeignSysUserFallbackFactory类,实现FallbackFactory接口
    在这里插入图片描述
package com.cyun.security.oauth2.feign.config;

import com.cyun.core.vo.LoginUserVO;
import com.cyun.security.oauth2.feign.server.IFeignSysUserService;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * 系统服务 服务降级(能得到错误信息)
 *
 * @author He PanFu
 * @date 2022-03-12 10:50:02
 */
@Component
@Slf4j
public class FeignSysUserFallbackFactory implements FallbackFactory<IFeignSysUserService> {

    @Override
    public IFeignSysUserService create(Throwable throwable) {
        log.error(throwable.getMessage(), throwable);

        return new IFeignSysUserService() {
            @Override
            public LoginUserVO getLoginUserInfo(String username, String clientId) {
                log.error("获取用户登录信息失败,用户名:{},客户端标识:{}", username, clientId);
                return LoginUserVO.builder().failedFlag(true).build();
            }
        };
    }
}
  • @FeignClient注解上添加配置: fallbackFactory
    在这里插入图片描述
@FeignClient(value = "sys-server", fallbackFactory = FeignSysUserFallbackFactory.class)

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

  • 创建FeignSysUserConfiguration类实现RequestInterceptor接口
    在这里插入图片描述
package com.cyun.security.oauth2.feign.config;

import com.cyun.tools.jwt.JwtUtil;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

/**
 * 系统服务 请求添加token
 *
 * @author He PanFu
 * @date 2022-03-12 10:50:02
 */
@Configuration
public class FeignSysUserConfiguration implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate requestTemplate) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        //添加token
        requestTemplate.header("Authorization", request.getHeader("Authorization"));
    }

}
  • @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

飞飞影视导航系统简介飞飞影视导航系统FeiFeiCms是一套专为不同需求的站长而设计的视频点播系统,灵活,方便是最大的特色,为初学者快速架设网站首选,只需5分钟即可建立一个海量的视频讯息的行业网站。FeiFeiCms采用PHP MYSQL架构,国内优秀TP的框架为开发基础,其卓越的访问速度和负载能力免去您的后顾之优。本着免费开源的宗旨、将 FeiFeiCms 努力打造成为您身边最贴近的建站程序!不需要庞大的空间与高带宽;一个普通的虚拟空间就可以迅速搭建起一个内容丰富的视频、资讯网站,使你的建站成本低至极点!免费开源,模版分离,动态标签,万条数据,只要会HTML就可以做出属于您的个性化的网站。飞飞影视导航系统特性建站1:内核安全稳定(基于ThinkPhp框架开发/PHP MYSQL架构/Jquery类包/超强的负载能力与缓存/UTF8编码)2:安装使用简单(一健安装/一键采集/一键备份/一键切换动静态模式/操作简便/灵活实用)3:影片资源丰富(多播放器/多浏览器支持/百万集片库/24小时不间断更新/一键采集/自定义采集)4:多终端跨平台(windows、Linux均可安装/PC、手机、平板同步观看)5:建站资源丰富(SEO优化模板免费下载/实用插件工具免费下载/完善的教程学习)6:网站管理轻松(支持定时采集/定时生成/做最懒最赚钱的站长)流量1:SEO优化工具篇(百度,谷歌地图/rss订阅/单文件RSS聚合/TAG关键字聚合/专题编辑)2:SEO优化模板篇(标签灵活调用/播放页每集静态标题描述/自定义常用标签/专题匹配/关联词匹配)3:SEO优化路径篇(静态模式/伪静态模式/动态模式/自定义生成路径)4:网站互动守住流量(评分/顶踩/评论/留言/会员等用来提升人气的模块可大幅提搞回头客留住流量)变现流量变现(自定义缓冲广告/内置广告模块/推荐流量互换/推荐广告联盟/友情链接交换)飞飞影视导航系统部份功能展示1: 前台模板自适应(PC、手机、平板自动适应)2:支持二级域名手机模块独立3:图片延迟加载技术4:搜索联想功能5: Tag关键词分词聚合功能6:专题聚合功能7:影片评分功能8:影片分享功能9:影片人气功能10:影片顶踩功能11:影片评论功能(系统自带、有言、畅言)一键切换12:影片剧集分集介绍功能13:影片自定义播放器功能(自带30多种播放器外可扩展)14:影片解析功能(后台一键添加)15:影片版权跳转功能16:影片自带24小时不间断更新聚合资源库,第一时间更新17:支持影片频道页聚合18:支持影片列表页展示(可支持ajax无刷新加载)19:支持影片多条件筛选20:支持影片多种排序(人气、评分、上映时间等)21:文章影讯频道功能22:后台一键API采集上万部影片(同时支持火车头自定义免登录采集)23:后台智能添加更改广告24:运行速度快、性能高(支持生成静态网页、支持memcache缓存、文件缓存)25:可定时采集、定时生成(“懒站人”的最佳选择)26:自定义导航菜单27:首页轮播系统28:友情链接管理系统29:数据库备份还原系统30:数据库管理系统31:模板在线管理功能32:前台模板标签自定义数据调用33:海量模板下载34:微信公众号模块35:明星系统36:角色系统37:直播模块飞飞影视导航系统 v4.0.190209更新日志关闭SESSION自动开启,提高系统性能系统增加明星模块功能系统增加角色模块功能增加(预告片、在线观看、下载观看、新闻资讯、经典台词、演员表、影评、评分、看点、上映时间、大结局)增加观看记录精确到集数功能增加dplayer播放器(支持前贴片与暂停广告)增加(排行,最新,地图)等多个内置单页增加明星资源库分享接口增加角色资源库分享接口增加剧情火车头入库接口增加角色火车头入库接口增加明星火车头入库接口更多升级内容请看升级补本说明... 飞飞影视导航系统前台页面飞飞影视导航系统后台管理后台路径:域名/admin.php用户名与密码:admin admin888后台页面相关阅读同类推荐:站长常用源码
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值