远程调用@FeignClient注解属性使用详解

 更新时间:2022年10月20日 08:34:08   作者:austin流川枫  
这篇文章主要为大家介绍了远程调用@FeignClient注解属性使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

Feign是声明性的web服务客户端。它使编写web服务客户端更加容易。通过Feign我们可以实现调用远程服务像调用本地一样便捷。本篇文章主要详细聊聊Feign下的一个核心注解@FeignClient相关属性。

通过查阅@FeignClient源码,可以看到它的注解包括以下属性:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FeignClient {
    @AliasFor("name")
    String value() default "";
    /** @deprecated */
    @Deprecated
    String serviceId() default "";
    String contextId() default "";
    @AliasFor("value")
    String name() default "";
    String qualifier() default "";
    String url() default "";
    boolean decode404() default false;
    Class<?>[] configuration() default {};
    Class<?> fallback() default void.class;
    Class<?> fallbackFactory() default void.class;
    String path() default "";
    boolean primary() default true;
}

name

定义当前客户端Client的名称,等同于value属性。

value

定义当前客户端Client的名称,等同于name属性。

serviceId

目前serviceId已经废弃了,直接使用name即可。

contextId

比如我们有个user服务,但user服务中有很多个接口,我们不想将所有的调用接口都定义在一个类中,比如UserFeignClientAUserFeignClentB,当不同的Feignname一致的时候,这时候Bean的名称就会冲突,解决方式可以通过指定不同的contextId来解决问题,举个栗子:

UserFeignClientA

@FeignClient(name = "user.service", contextId = "userServiceA", url = "${user.service.url}", configuration = UserRemoteConfig.class)
public interface UserFeignClientA {
    /**
     * 获取用户默认身份信息
     */
    @RequestMapping("/user/identity/default") 
    ResultData<UserVisaIdentity> getDefaultIdentity(@RequestParam("userId") String userId);
}

UserFeignClientB

@FeignClient(name = "user.service", contextId = "userServiceB" url = "${user.service.url}", configuration = UserRemoteConfig.class)
public interface UserFeignClientB {
    /**
     * 新增大客户信息
     */
    @RequestMapping(value = {"/user/identity/saveIdentity"}, method = RequestMethod.POST)
    ResultData<UserVisaIdentity> saveIdentity(@RequestBody UserVisaIdentity userVisaIdentity);
}

url

url用于配置指定服务的地址,相当于直接请求这个服务。

path

@FeignClient(name = "template-service", url = "${universal.service.url}", path = "template", configuration = {RemoteErrorDecoder.class})
public interface ITemplateFeignService {
    /**
     * 多条件查询
     *
     * @param templateSearchDto 多条件查询
     * @return 模板列表
     */
    @GetMapping("/search")
    ApiResult<PageResult<TemplateVo>> search(@Valid @SpringQueryMap TemplateSearchDto templateSearchDto);
}

path定义当前FeignClient访问接口时的统一前缀,比如接口地址是/user/get, 如果你定义了前缀是user, 那么具体方法上的路径就只需要写/get 即可。上面将假设universal.service.url地址为 http://universal.com ,那么调用search请求地址为:universal.com/template/se…

configuration

configuration是配置Feign配置类,在配置类中可以自定义FeignEncoderDecoderLogLevelContract等。

fallback

fallback定义容错的处理类,也就是回退逻辑,fallback的类必须实现Feign Client的接口,无法知道熔断的异常信息。比如:

@FeignClient(name = "account-service") 
 public interface AccountServiceClient { 
     @RequestMapping(method = RequestMethod.GET, value = "/accounts/{accountName}", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, fallback = AccountServiceClientFallback.class) 
     String getAccount(@PathVariable("accountName") String accountName); 
} 
@Component
public class AccountServiceClientFallback implements AccountServiceClient {
     private static final Logger LOGGER = LoggerFactory.getLogger(AccountServiceClientFallback.class); 
     @Override 
     public String getAccount(String accountName) { 
         LOGGER.error("Error during getAccount, accountName: {}", accountName); 
     } 
}

fallbackFactory

也是容错的处理,可以知道熔断的异常信息。可以自定义fallbackFactory

@Component
public class UserRemoteClientFallbackFactory implements FallbackFactory<UserRemoteClient> {
    private Logger logger = LoggerFactory.getLogger(UserRemoteClientFallbackFactory.class);
    @Override
    public UserRemoteClient create(Throwable cause) {
        return new UserRemoteClient() {
            @Override
            public User getUser(int id) {
                logger.error("UserRemoteClient.getUser异常", cause);
                return new User(0, "默认");
            }
        };
    }
}
@FeignClient(value = "user-service", fallbackFactory = UserRemoteClientFallbackFactory.class)
public interface UserRemoteClient {
	@GetMapping("/user/get")
	public User getUser(@RequestParam("id") int id);
}

primary

primary对应的是@Primary注解,默认为true,官方这样设置也是有原因的。当我们的Feign实现了fallback后,也就意味着FeignClient有多个相同的BeanSpring容器中,当我们在使用@Autowired进行注入的时候,不知道注入哪个,所以我们需要设置一个优先级高的,@Primary注解就是干这件事情的。

qualifier

qualifier对应的是@Qualifier注解,使用场景跟上面的primary关系很淡,一般场景直接@Autowired直接注入就可以了。

如果我们的Feign Clientfallback实现,默认@FeignClient注解的primary=true, 意味着我们使用@Autowired注入是没有问题的,会优先注入你的FeignClient

如果你把primary设置成false了,直接用@Autowired注入的地方就会报错,不知道要注入哪个对象。

解决方案很明显,你可以将primary设置成true即可,如果由于某些特殊原因,你必须得去掉primary=true的设置,这种情况下我们怎么进行注入,我们可以配置一个qualifier,然后使用@Qualifier注解进行注入,示列如下:

@FeignClient(name = "optimization-user", path="user", qualifier="userRemoteClient")
public interface UserRemoteClient {
	@GetMapping("/get")
	public User getUser(@RequestParam("id") int id);
}

Feign Client注入

@Autowired
@Qualifier("userRemoteClient")
private UserRemoteClient userRemoteClient;

好了,以上就是@FeignClient注解相关属性说明。

以上就是远程调用@FeignClient注解属性使用详解的详细内容,更多关于@FeignClient 远程调用的资料请关注脚本之家其它相关文章!

相关文章

  • java将m3u8格式转成视频文件的方法

    java将m3u8格式转成视频文件的方法

    这篇文章主要介绍了如何java将m3u8格式转成视频文件,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • Java实现平铺列表(List)互转树形(Tree)结构

    Java实现平铺列表(List)互转树形(Tree)结构

    本文主要介绍了Java实现平铺列表(List)互转树形(Tree)结构,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • java文件下载设置中文名称的实例(response.addHeader)

    java文件下载设置中文名称的实例(response.addHeader)

    下面小编就为大家分享一篇java文件下载设置中文名称的实例(response.addHeader),具有很好的参考价值,希望对大家有所帮助
    2017-12-12
  • Netty客户端接入流程NioSocketChannel创建解析

    Netty客户端接入流程NioSocketChannel创建解析

    这篇文章主要为大家介绍了Netty客户端接入流程NioSocketChannel创建源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • 如何使用Java模拟退火算法优化Hash函数

    如何使用Java模拟退火算法优化Hash函数

    为了解决局部最优解问题,1983年,Kirkpatrick等提出了模拟退火算法(SA)能有效的解决局部最优解问题。模拟退火算法包含两个部分即Metropolis算法和退火过程。Metropolis算法就是如何在局部最优解的情况下让其跳出来,是退火的基础
    2021-06-06
  • 浅谈Java中对类的主动引用和被动引用

    浅谈Java中对类的主动引用和被动引用

    这篇文章主要介绍了浅谈Java中对类的主动引用和被动引用,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • java获取整点与凌晨的时间戳

    java获取整点与凌晨的时间戳

    这篇文章主要给大家介绍了关于java获取凌晨与整点时间戳的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • mybatis 返回Integer,Double,String等类型的数据操作

    mybatis 返回Integer,Double,String等类型的数据操作

    这篇文章主要介绍了mybatis 返回Integer,Double,String等类型的数据操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • vue+springboot上传文件、图片、视频及回显到前端详解

    vue+springboot上传文件、图片、视频及回显到前端详解

    一般来说vue可以使用axios或者fetch等ajax库发送文件请求,而springboot则可以使用Spring MVC的方式来处理上传文件请求,下面这篇文章主要给大家介绍了关于vue+springboot上传文件、图片、视频及回显到前端的相关资料,需要的朋友可以参考下
    2023-04-04
  • Java设计模式之单例模式

    Java设计模式之单例模式

    这篇文章主要给大家介绍了关于Java单例模式,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2021-10-10

最新评论