feign支持哪些注解,feign 注解

  feign支持哪些注解,feign 注解

  

目录

假装自定义注解翻译器新建自定义注解我的网址新建接口,使用我的网址注解定义注解翻译器测试类启动服务类假装注解说明

 

  

Feign自定义注解翻译器

 

  

新建自定义注解MyUrl

包org。疯狂吧。云。合同;导入Java。郎。注释。元素类型;导入Java。郎。注释。保留;导入Java。郎。注释。保留政策;导入Java。郎。注释。目标;//这个注解只能定义方法@Target(ElementType .方法)@Retention(RetentionPolicy .运行时)public @interface MyUrl { //为注解配置两个属性字符串URL();线方法();}

 

  

新建接口,使用MyUrl注解

包org。疯狂吧。云。合同;公共接口合同客户端{ @ MyUrl(URL=/hello ,method=GET )公共字符串hello();}

 

  

定义注解翻译器

包org。疯狂吧。云。合同;导入Java。郎。注释。注释;导入Java。郎。反思。方法;导入佯。合同。基础合同;导入佯方法。元数据;公共类我的合同扩展基协定{ @ Override protected void processAnnotationOnclass(方法元数据数据,类?clz) { //处理类级别注解} @覆盖受保护的void processAnnotationOnMethod(方法元数据数据,批注批注,方法方法){ //注解是我的网址类型的,才处理如果(MyUrl。班级。is instance(annotation)){ MyUrl MyUrl=method。获取注释(MyUrl。类);字符串URL=myurl。URL();string http method=myurl。方法();data.template().方法(http方法);data.template().追加(网址);} } @ Override protected boolean processAnnotationsOnParameter(方法元数据数据,批注[]批注,int paramIndex) { //处理参数级别注解返回false}}

 

  

测试类

包org。疯狂吧。云。合同;导入org。疯狂吧。云。jaxrs。RS客户端;导入佯。假装;导入假装。jaxrs。jaxrs合同;公共类contract main { public static void main(String[]args){ contract client client=feign。构建器().合同(new MyContract()).target(ContractClient.class, http://localhost :8080 );

 

     String result = client.hello();        System.out.println(result);    } }

 

  

启动服务类

测试

 

  

Hello World

 

  

 

  

Feign注解说明

Feign是常用的微服务rpc调用框架,下面对一些注解说明

 

  

@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inheritedpublic @interface FeignClient { /** * value和name的作用一样,如果没有配置url那么配置的值将作为服务名称,用于服务发现。反之只是一个名称。 * */ @AliasFor("name") String value() default ""; /** * serviceId已经废弃了,直接使用name即可。 */ /** @deprecated */ @Deprecated String serviceId() default ""; /** *某个服务提供的接口不止定义在一个类中,这样启动时会报Bean的名称冲突。 * 解决方法: * 1:参数配置添加 * spring.main.allow-bean-definition-overriding=true * * 2:给每个client指定contextid * */ String contextId() default ""; /** * * 在注册Feign Client Configuration的时候需要一个名称,名称是通过getClientName方法获取的. * 查看源码可知,如果配置了contextId就会用contextId, * 如果没有配置就会去value,然后是name,最后是serviceId。 * 默认都没有配置,当出现一个服务有多个Feign Client的时候就会报错了。 * * 其次的作用是在注册FeignClient中,contextId会作为Client 别名的一部分,如果配置了qualifier优先用qualifier作为别名。 * */ /** *见 value * */ @AliasFor("value") String name() default ""; /** * * 在注册FeignClient中,指定client别名 * */ String qualifier() default ""; /** * * url用于配置指定服务的地址,相当于直接请求这个服务,不经过Ribbon的服务选择。像调试等场景可以使用。 * */ String url() default ""; /** * * 当调用请求发生404错误时,decode404的值为true,那么会执行decoder解码,否则抛出异常。 * */ boolean decode404() default false; /** * * configuration是配置Feign配置类,在配置类中可以自定义Feign的Encoder、Decoder、LogLevel、Contract等。 * 具体查看FeignConfiguration类 * */ Class<?>[] configuration() default {}; /** * * 定义容错的处理类,也就是回退逻辑,fallback的类必须实现Feign Client的接口,无法知道熔断的异常信息。 * * * * * 举例: * //实现调用接口方法 * @Component * public class UserRemoteClientFallback implements UserRemoteClient { * @Override * public User getUser(int id) { * return new User(0, "默认fallback"); * } * } * * //user服务 * @FeignClient(value = "user", fallback = UserRemoteClientFallback.class) * public interface UserRemoteClient { * @GetMapping("/user/get") * public User getUser(@RequestParam("id")int id); * } * * */ Class<?> fallback() default void.class; /** * * 也是容错的处理,可以知道熔断的异常信息。熔断的另一种处理方法。 * * //服务类作为参数传入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, "默认"); * } * }; * } * } * */ Class<?> fallbackFactory() default void.class; /** * * path定义当前FeignClient访问接口时的统一前缀 * 比如接口地址是/user/get, 如果你定义了前缀是user, 那么具体方法上的路径就只需要写/get 即可。 * * @FeignClient(name = "user", path="user") * public interface UserRemoteClient { * @GetMapping("/get") * public User getUser(@RequestParam("id") int id); * } * */ String path() default ""; /** * primary对应的是@Primary注解,默认为true. * 官方这样设置也是有原因的。当我们的Feign实现了fallback后,也就意味着Feign Client有多个相同的Bean在Spring容器中, * 当我们在使用@Autowired(建议使用@Resource注入对象)进行注入的时候,不知道注入哪个,所以我们需要设置一个优先级高的,@Primary注解就是干这件事情的。 * * */ boolean primary() default true;}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行IT。

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: