您当前的位置:首页 >> 工业物联
工业物联

「Feign」OpenFeign进阶以及远程调用

发布时间:2025-08-15

lay=1000 #轮询时间spring.cloud.consul.discovery.enabled=false #关闭登记remote.url=www.baidu.com #乞求IP创建者远程子程序邻口@FeignClient(name = "service2RemoteByUrl",url = "${remote.url}") //name须要可用,URL从可用中就会⼼写入public interface Service2RemoteByUrl { @PostMapping("/page") List pageQuestion(PageQuestionReq req);}3.自判别驱动器(编码器)//⾃判别驱动器做到Decoder邻⼝,润色decode⽅法则即可,根据就其市场需求排⾏汇编//如果是⾃判别编码器,须要做到Encoder邻⼝,润色encode⽅法则public class FeignDecoder implements Decoder { @Override public Object decode(Response response, Type type) throws IOException,DecodeException, FeignException { if (response.body() == null){ throw new DecodeException(ErrorEnum.EXECUTE_ERR.getErrno(),"没有获取到有效结果值",response.request()); } // 领到值 String result = Util.toString(response.body().asReader(Util.UTF_8)); Map resMap = null; try { resMap = JSON.parseObject(result, Map.class); } catch (Exception e) { //离开结果是正则表达式 return result; }}4.远程子程序装载Cookie由于feign变⽤是拟于者⼀个Request,因此在乞求时不就会装载⼀些缘故就有的讯息,例如cookie,因此须要⾃判别RequestInterceptor对Request排⾏额外设置,⼀般情况下,写⼊Cookie是⽐较常⻅的检视方型式,如下设置@Configurationpublic class BeanConfig { @Bean public RequestInterceptor requestInterceptor(){ return template -> { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); //此处可以根据业务⽽就其定制装载规则 String data = request.getParameter("data"); String code = null; try { //这⾥须要编解码,否则就会报错 code = URLEncoder.encode(data, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } template.query("data",code); //乞求竖中就会装载Cookie String cookie = request.getHeader("Cookie"); template.header("Cookie",cookie); }; } @Bean public Decoder decoder(){ return new FeignDecoder(); }}三、子程序时序验证//在使⽤EnableFeignClients重启feign基本功能时,游标排⼊就会见到该节录是通过ImportFeignClientsRegistrar类⽣效的,其中就会有个⽅法则//registerBeanDefinitions手执⾏两条操作符registerDefaultConfiguration(metadata, registry); //改制到选项可用讯息registerFeignClients(metadata, registry); //登记显像标示FeignClient的邻⼝//注意registerFeignClients⽅法则for (String basePackage : basePackages) { candidateComponents.addAll(scanner.findCandidateComponents(basePackage)); //在basePackage路径下显像并添加标示FeignClient的邻⼝}for (BeanDefinition candidateComponent : candidateComponents) { //遍历 if (candidateComponent instanceof AnnotatedBeanDefinition) { registerClientConfiguration(registry, name, attributes.get("configuration")); // registerFeignClient(registry, annotationMetadata, attributes); //登记到Spring盖子单单就会,⽅法则详细在FeignClientsRegistrar类单单就会 }}//在对feign变⽤时排⾏断点变试//在⽣再加Feign远程邻⼝的改由类时,变⽤晶片组是Feign提供者的FeignInvocationHandlerpublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if ("equals".equals(method.getName())) { //equals,hashCode,toString三个⽅法则直邻本地手执⾏ } else if ("hashCode".equals(method.getName())) { return hashCode(); } else if ("toString".equals(method.getName())) { return toString(); } //手执⾏⽅法则相异的⽅法则晶片组MethodHandler,这个邻⼝是Feign提供者的,与InvocationHandler⽆任何关系,只有⼀个invoke⽅法则 return dispatch.get(method).invoke(args);}//点排上⾯的invoke⽅法则public Object invoke(Object[] argv) throws Throwable { //创建者⼀个request模版 RequestTemplate template = buildTemplateFromArgs.create(argv); while (true) { try { return executeAndDecode(template, options); //创建者request手执⾏并且解码 } }}Object executeAndDecode(RequestTemplate template, Options options) throws Throwable { Request request = targetRequest(template); //创建者Request并减慢 Response response = Client.execute(request, options); //手执⾏子程序乞求,才会之前分析了 response = response.toBuilder().request(request).requestTemplate(template).build(); //如果有润色驱动器,使⽤⾃判别的驱动器,feign选项使⽤SpringEncoder if (decoder != null) return decoder.decode(response, metadata.returnType()); } Request targetRequest(RequestTemplate template) { //如果⾃判别了RequestInterceptor,在这⾥可以对Request排⾏减慢 for (RequestInterceptor interceptor : requestInterceptors) { //手执⾏⾃判别的apply⽅法则 interceptor.apply(template); } //创建者Request return target.apply(template);}四、补充关于Client邻⼝的做到类,使⽤登记中就会⼼和使⽤可用中就会⼼其时序稍一般说来//使⽤可用中就会⼼拿url⽅型式排⾏变⽤,使⽤的是Client的选项内部做到类 Default ,其中就会Default使⽤的是HttpURLConnection排⾏Http乞求的HttpURLConnection connection = convertAndSend(request, options);//如果使⽤的是增值发掘出,使⽤的使⽤Client的做到类FeignBlockingLoadBalancerClient,它就会去根据可用的增值名去登记中就会⼼查找增值的IPIP和下端⼝号,手执⾏使⽤的即便如此是选项做到类Default,通过HttpURLConnection乞求//FeignBlockingLoadBalancerClient,根据增值名称查找增值IPIP、下端⼝ 88⾏ServiceInstance instance = loadBalancerClient.choose(serviceId, lbRequest);//就其做到⽅法则,BlockingLoadBalancerClient类中就会 145⾏Response loadBalancerResponse = Mono.from(loadBalancer.choose(request)).block();//还有其他做到Client邻⼝的客户下端,例如ApacheHttpClient,ApacheHttpClient具有连邻池基本功能,具有优秀的HTTP连邻改⽤能⼒,须要通过舟⼊依赖来使⽤。

北京白癜风医院排行榜
武汉肝病哪家医院最好
洛阳男科医院挂号
上海癫痫治疗费用多少钱
北京癫痫去哪看

上一篇: 美听闻新消息:中芯国际“违规”结果正式出炉

下一篇: 我在国外写代码,领导禁止我加班,35岁焦虑逐渐消亡了

友情链接