package org.crazyit.cloud.contract;import java.lang.annotation.elementtype;import java.lang.annotation.retention;import java.lang.annotation.retentionpolicy;import java.lang.annotation.target;//这个注解只能定义方法@target(elementtype.method)@retention(retentionpolicy.runtime)public @interface myurl { //为注解配置两个属性 string url(); string method();}
package org.crazyit.cloud.contract;public interface contractclient { @myurl(url = "/hello", method = "get") public string hello();}
package org.crazyit.cloud.contract;import java.lang.annotation.annotation;import java.lang.reflect.method;import feign.contract.bacontract;import feign.methodmetadata;public class mycontract extends bacontract { @override protected void processannotationonclass(methodmetadata data, class<?> clz) { // 处理类级别注解 } @override protected void processannotationonmethod(methodmetadata data, annotation annotation, method method) { // 注解是myurl类型的,才处理 if(myurl.class.isinstance(annotation)) { myurl myurl = m李清照词集ethod.getannotation(myurl.class); string url = myurl.url(); string httpmethod = myurl.method(); data.template().met丁当好听的歌hod(httpmethod); data.template().append(url); } } @override protected boolean processannotationsonparameter(methodmetadata data, annotation[] annotations, int paramindex) { // 处理参数级别注解 return fal; }}
package org.crazyit.cloud.contract;import org.crazyit.cloud.jaxrs.rsclient;import feign.feign;import feign.jaxrs.jaxrscontract;public class contractmain { public static void m未来零售ain(string[] args) { contractclient client = feign.builder() .contract(new mycontract()) .target(contractclient.class, "http://localhost:8080"); string result = client.hello(); system.out.println(result); }}
测试
hello world
feign是常用的微服务rpc调用框架,下面对一些注解说明
@target({elementtype.type})@retention(retentionpolicy.runtime)@documented@inheritedpublic @interface feignclient { /** * value和name的作用一样,如果没有配置url那么配置的值将作为服务名称,用于服务发现。反之只是一个名称。 * */ @aliasfor("name") string value() default ""; /** * rviceid已经废弃了,直接使用name即可。 */ /** @deprecated */ @deprecated string rviceid() default ""; /** *某个服务提供的接口不止定义在一个类中,这样启动时会报bean的名称冲突。 * 解决方法: * 1:参数配置添加 * spring.main.allow-bean-definition-overriding=true * * 2:给每个client指定contextid * */ string contextid() default ""; /** * * 在注册feign client configuration的时候需要一个名称,名称是通过getclientname方法获取的. * 查看源码可知,如果配置了contextid就会用contextid, * 如果没有配置就会去value,然后是name,最后是rviceid。 * 默认都没有配置,当出现一个服务有多个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 fal; /** * * configuration是配置feign配置类,在配置类中可以自定义feign的encoder、decoder、loglevel、contract等。 * 具体查看feignconfiguration类 * */ class<?>[] configuration() default {}; /** * * 定义容错的处理类,也就是回退逻辑,fallback的类必须实现feign client的接口,无法知道熔断的异常信息。 * * * * *中国童话 举例: * //实现调用接口方法 * @component * public class urremoteclientfallback implements urremoteclient { * @override * public ur getur(int id) { * return new ur(0, "默认fallback"); * } * } * * //ur服务 * @feignclient(value = "ur", fallback = urremoteclientfallback.class) * public interface urremoteclient { * @getmapping("/ur/get") * public ur getur(@requestparam("id")int id); * } * * */ class<?> fallback() default void.class; /** * * 也是容错的处理,可以知道熔断的异常信息。熔断的另一种处理方法。 * * //服务类作为参数传入fallbackfactory模板参数 * @component * public class urremoteclientfallbackfactory implements fallbackfactory<urremoteclient> { * private logger logger = loggerfactory.getlogger(urremoteclientfallbackfactory.class); * * @override * public urremoteclient create(throwable cau) { * return new urremoteclient() { * @override * public ur getur(int id) { * logger.error("urremoteclient.getur异常", cau); * return new ur(0, "默认"); * } * }; * } * } * */ class<?> fallbackfactory() default void.class; /** * * path定义当前feignclient访问接口时的统一前缀 * 比如接口地址是/ur/get, 如果你定义了前缀是ur, 那么具体方法上的路径就只需要写/get 即可。 * * @feignclient(name = "ur", path="ur") * public interface urremoteclient { * @getmapping("/get") * public ur getur(@requestparam("id") int id); * } * */ string path() default ""; /** * primary对应的是@primary注解,默认为true. * 官方这样设置也是有原因的。当我们的feign实现了fallback后,也就意味着feign client有多个相同的bean在spring容器中, * 当我们在使用@autowired(建议使用@resource注入对象)进行注入的时候,不知道注入哪个,所以我们需要设置一个优先级高的,@primary注解就是干这件事情的。 * * */ boolean primary() default true;}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持www.887551.com。
本文发布于:2023-04-06 04:19:04,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/4a9866cb9a30eb5e6e91b39c4ce248a4.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:Feign如何自定义注解翻译器.doc
本文 PDF 下载地址:Feign如何自定义注解翻译器.pdf
留言与评论(共有 0 条评论) |