欧博百家乐

排列五彩票网如何在博彩赢钱_深刻相识 OpenFeign 的架构旨趣

发布日期:2023-10-30 00:48    点击次数:130

排列五彩票网如何在博彩赢钱_深刻相识 OpenFeign 的架构旨趣

排列五彩票网如何在博彩赢钱_

太平洋在线百家乐

皇冠客服飞机:@seo3687

 太平洋在线百家乐全球好,我是悟空呀。

前次咱们深刻素养了 Ribbon 的架构旨趣,此次咱们再来看下 Feign 汉典调用的架构旨趣。

一、相识汉典调用

汉典调用何如相识呢?

汉典调用和腹地调用是相对的,那咱们先说腹地调用更好相识些,腹地调用即是合并个 Service 内部的技艺 A 调用技艺 B。

威尼斯人娱乐城诈骗

那汉典调用即是不同 Service 之间的技艺调用。Service 级的技艺调用,即是咱们我方构造肯求 URL和肯求参数,就不错发起汉典调用了。

在劳动之间调用的话,咱们王人是基于 HTTP 左券,一般用到的汉典劳动框架有 OKHttp3,Netty, HttpURLConnection 等。其调用经过如下:

可是这种虚线方框中的构造肯求的过程是很繁琐的,有莫得更方便的方式呢?

Feign 即是来简化咱们发起汉典调用的代码的,那简化到什么进程呢?简化成就像调用腹地技艺那样通俗。

比如我的开源相貌 PassJava 中的使用 Feign 履行汉典调用的代码:

//汉典调用拿到该用户的学习时长 R memberStudyTimeList = studyTimeFeignService.getMemberStudyTimeListTest(id); 

而 Feign 又是 Spring Cloud 微劳动工夫栈中相等要紧的一个组件,如若让你来盘算推算这个微劳动组件,你会何如来盘算推算呢?

咱们需要商酌这几个要素:

若何使汉典调用像腹地技艺调用通俗? Feign 若何找到汉典劳动的地址的? Feign 是若何进行负载平衡的?

接下来咱们围绕这些中枢问题来通盘看下 Feign 的盘算推算旨趣。

二、Feign 和 OpenFeign

OpenFeign 组件的前身是 Netflix Feign 相貌,它最早是动作 Netflix OSS 项主义一部分,由 Netflix 公司修复。自后 Feign 相貌被孝敬给了开源组织,于是才有了咱们今天神用的 Spring Cloud OpenFeign 组件。

Feign 和 OpenFeign 有好多大同小异之处,不同的是 OpenFeign 维持 MVC 注解。

不错觉得 OpenFeign 为 Feign 的增强版。

通俗回来下 OpenFeign 能用来作念什么:

OpenFeign 是声明式的 HTTP 客户端,让汉典调用更通俗。 提供了HTTP肯求的模板,编写通俗的接口和插入注解,就不错界说好HTTP肯求的参数、时势、地址等信息 整合了Ribbon(负载平衡组件)和 Hystix(劳动熔断组件),不需要表露使用这两个组件 Spring Cloud Feign 在 Netflix Feign的基础上彭胀了对SpringMVC注解的维持 三、OpenFeign 若何用?

OpenFeign 的使用也很通俗,这里如故用我的开源 SpringCloud 相貌 PassJava 动作示例。

开源地址: https://github.com/Jackson0714/PassJava-Platform

可爱的小伙伴来点个 Star 吧,冲 2K Star。

Member 劳动汉典调用 Study 劳动的技艺 memberStudyTime(),如下图所示。

第一步:Member 劳动需要界说一个 OpenFeign 接口:

@FeignClient("passjava-study") public interface StudyTimeFeignService {     @RequestMapping("study/studytime/member/list/test/{id}")     public R getMemberStudyTimeListTest(@PathVariable("id") Long id); } 

咱们不错看到这个 interface 上添加了注解@FeignClient,而且括号内部指定了劳动名:passjava-study。表露声明这个接口用来汉典调用 passjava-study劳动。

第二步:Member 启动类上添加 @EnableFeignClients注解开启汉典调用劳动,且需要开启劳动发现。如下所示:

@EnableFeignClients(basePackages = "com.jackson0714.passjava.member.feign") @EnableDiscoveryClient 

第三步:Study 劳动界说一个技艺,其技艺旅途和 Member 劳动中的接口 URL 地址一致即可。

URL 地址:"study/studytime/member/list/test/{id}"

@RestController @RequestMapping("study/studytime") public class StudyTimeController {     @RequestMapping("/member/list/test/{id}")     public R memberStudyTimeTest(@PathVariable("id") Long id) {        ...      } } 

第四步:Member 劳动的 POM 文献中引入 OpenFeign 组件。

李强是个忙碌的企业家,每天都在为公司的业务四处奔波。而小红,则是一个贤良淑德的家庭主妇,照顾着家庭的日常,等待李强疲惫而归。然而,小红的温柔背后,却隐藏着一个李强无法接受的事实——他的妻子一直在出轨。

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

第五步:引入 studyTimeFeignService,Member 劳动汉典调用 Study 劳动即可。

Autowired private StudyTimeFeignService studyTimeFeignService;  studyTimeFeignService.getMemberStudyTimeListTest(id); 

通过上头的示例,咱们知说念,加了 @FeignClient 注解的接口后,咱们就不错调用它界说的接口,然后就不错调用到汉典劳动了。

这里你是否有疑问:为什么接口王人莫得完毕,就不错调用了?

OpenFeign 使用起来倒是通俗,可是内部的旨趣可莫得那么通俗,OpenFeign 帮咱们作念了好多事情,接下来咱们来看下 OpenFeign 的架构旨趣。

四、梳理 OpenFeign 的中枢经过

先看下 OpenFeign 的中枢经过图:

1、在 Spring 相貌启动阶段,劳动 A 的OpenFeign 框架会发起一个主动的扫包经过。 2、从指定的目次下扫描并加载所有被 @FeignClient 注解修饰的接口,然后将这些接口养息成 Bean,赞助交给 Spring 来管制。 3、把柄这些接口会经过 MVC Contract 左券认知,将技艺上的注解王人认知出来,放到 MethodMetadata 元数据中。 4、基于上头加载的每一个 FeignClient 接口,会生成一个动态代理对象,指向了一个包含对应技艺的 MethodHandler 的 HashMap。MethodHandler 对元数据有援用掂量。生成的动态代理对象会被添加到 Spring 容器中,并注入到对应的劳动里。 5、劳动 A 调用接口,准备发起汉典调用。 6、从动态代理对象 Proxy 中找到一个 MethodHandler 实例,生成 Request,包含有劳动的肯求 URL(不包含劳动的 IP)。 7、经过负载平衡算法找到一个劳动的 IP 地址,拼接出肯求的 URL 8、劳动 B 处理劳动 A 发起的汉典调用肯求,履行业务逻辑后,复返反应给劳动 A。

针对上头的经过,咱们再来看下每一步的盘算推算旨趣。领先主动扫包是若何扫的呢?

五、OpeFeign 包扫描旨趣

上头的 PassJava 示例代码中,触及到了一个 OpenFeign 的注解:@EnableFeignClients。把柄字面意念念不错知说念,不错注解是开启 OpenFeign 功能的。

包扫描的基本经过如下:

(1)@EnableFeignClients 这个注解使用 Spring 框架的 Import 注解导入了 FeignClientsRegistrar 类,运行了 OpenFeign 组件的加载。PassJava 示例代码如下所示。

// 启动类加上这个注解 @EnableFeignClients(basePackages = "com.jackson0714.passjava.member.feign")  // EnableFeignClients 类还引入了 FeignClientsRegistrar 类 @Import(FeignClientsRegistrar.class) public @interface EnableFeignClients {   ... } 

(2)FeignClientsRegistrar 崇敬 Feign 接口的加载。

源码如下所示:

 

@Override public void registerBeanDefinitions(AnnotationMetadata metadata,       BeanDefinitionRegistry registry) {    // 注册树立    registerDefaultConfiguration(metadata, registry);    // 注册 FeignClient    registerFeignClients(metadata, registry); } 

 

(3)registerFeignClients 会扫描指定包。

中枢源码如下,调用 find 技艺来查找指定旅途 basePackage 的所有辖有 @FeignClients 注解的带有 @FeignClient 注解的类、接口。

 

Set<BeanDefinition> candidateComponents = scanner       .findCandidateComponents(basePackage); 

 

(4)只保留带有 @FeignClient 的接口。

 

// 判断是否是带有注解的 Bean。 if (candidateComponent instanceof AnnotatedBeanDefinition) {   // 判断是否是接口    AnnotatedBeanDefinition beanDefinition = (AnnotatedBeanDefinition) candidateComponent;    AnnotationMetadata annotationMetadata = beanDefinition.getMetadata();   // @FeignClient 只可指定在接口上。    Assert.isTrue(annotationMetadata.isInterface(),          "@FeignClient can only be specified on an interface"); 

 

稳定

接下来咱们再来看这些扫描到的接口是若何注册到 Spring 中。

六、注册 FeignClient 到 Spring 的旨趣

如故在 registerFeignClients 技艺中,当 FeignClient 扫描完后,就要为这些 FeignClient 接口生成一个动态代理对象。

搜根剔齿,进到这个技艺内部,不错看到这一段代码:

 

皇冠hg86a

BeanDefinitionBuilder definition = BeanDefinitionBuilder       .genericBeanDefinition(FeignClientFactoryBean.class); 

 

体育彩票大乐透

中枢即是 FeignClientFactoryBean 类,把柄类的名字咱们不错知说念这是一个工场类,用来创建 FeignClient Bean 的。

咱们最运行用的 @FeignClient,内部有个参数 "passjava-study",这个是注解的属性,当 OpenFeign 框架去创建 FeignClient Bean 的时期,就会使用这些参数去生成 Bean。经过图如下:

认知 @FeignClient 界说的属性。 将注解@FeignClient 的属性 + 接口 StudyTimeFeignService的信息构变成一个 StudyTimeFeignService 的 beanDefinition。 然后将 beanDefinition 养息成一个 holder,这个 holder 即是包含了 beanDefinition, alias, beanName 信息。 终末将这个 holder 注册到 Spring 容器中。

源码如下:

 

// 生成 beanDefinition AbstractBeanDefinition beanDefinition = definition.getBeanDefinition(); // 养息成 holder,包含了 beanDefinition, alias, beanName 信息 BeanDefinitionHolder holder = new BeanDefinitionHolder(beanDefinition, className,     new String[] { alias }); // 注册到 Spring 凹凸文中。 BeanDefinitionReaderUtils.registerBeanDefinition(holder, registry); 

 

上头咱们依然知说念 FeignClient 的接口是若何注册到 Spring 容器中了。背面劳动要调用接口的时期,就不错径直用 FeignClient 的接口技艺了,如下所示:

 

@Autowired private StudyTimeFeignService studyTimeFeignService;  // 概略部分代码 // 径直调用  studyTimeFeignService.getMemberStudyTimeListTest(id); 

 

可是咱们并莫得细讲这个 FeignClient 的创建细节,底下咱们看下 FeignClient 的创建细节,这个亦然 OpenFeign 中枢旨趣。

七、OpenFeign 动态代理旨趣

上头的源码认知中咱们也提到了是由这个工场类 FeignClientFactoryBean 来创建 FeignCient Bean,是以咱们有必要对这个类进行领悟。

在创建 FeignClient Bean 的过程中就会去生成动态代理对象。调用接口时,欧博游戏平台注册其实即是调用动态代理对象的技艺来发起肯求的。

分析动态代理的进口技艺为 getObject()。源码如下所示:

 

Targeter targeter = get(context, Targeter.class); return (T) targeter.target(this, builder, context,       new HardCodedTarget<>(this.type, this.name, url)); 

 

接着调用 target 技艺这一块,内部的代码确实好多很细,我把中枢的代码拿出来给全球讲下,这个 target 会有两种完毕类:

DefaultTargeter 和 HystrixTargeter。而不论是哪种 target,王人需要去调用 Feign.java 的 builder 技艺去构造一个 feign client。

西子湖四季酒店金沙厅

在构造的过程中,依赖 ReflectiveFeign 去构造。源码如下:

 

// 概略部分代码 public class ReflectiveFeign extends Feign {   // 为 feign client 接口中的每个接口技艺创建一个 methodHandler  public <T> T newInstance(Target<T> target) {     for(...) {       methodToHandler.put(method, handler);     }     // 基于 JDK 动态代理的机制,创建了一个 passjava-study 接口的动态代理,所有对接口的调用王人会被防止,然后转交给 handler 的技艺。     InvocationHandler handler = factory.create(target, methodToHandler);     T proxy = (T) Proxy.newProxyInstance(target.type().getClassLoader(),           new Class<?>[] {target.type()}, handler); } 

 

排列五彩票网

ReflectiveFeign 作念的责任即是为带有 @FeignClient 注解的接口,创建出接口技艺的动态代理对象。

比如示例代码中的接口 StudyTimeFeignService,会给这个接口中的技艺 getMemberStudyTimeList 创建一个动态代理对象。

 

@FeignClient("passjava-study") public interface StudyTimeFeignService {     @RequestMapping("study/studytime/member/list/test/{id}")     public R getMemberStudyTimeList(@PathVariable("id") Long id); } 

 

创建动态代理的旨趣图如下所示:

认知 FeignClient 接口上各个技艺级别的注解,比如汉典接口的 URL、接口类型(Get、Post 等)、各个肯求参数等。这里用到了 MVC Contract 左券认知,背面会讲到。

然后将认知到的数据封装成元数据,并为每一个技艺生成一个对应的 MethodHandler 类动作技艺级别的代理。荒谬于把劳动的肯求地址、接口类型等王人帮咱们封装好了。这些 MethodHandler 技艺会放到一个 HashMap 中。 然后会生成一个 InvocationHandler 用来管制这个 hashMap,其中 Dispatch 指向这个 HashMap。 然后使用 Java 的 JDK 原生的动态代理,完毕了 FeignClient 接口的动态代理 Proxy 对象。这个 Proxy 会添加到 Spring 容器中。 当要调用接口技艺时,其实会调用动态代理 Proxy 对象的 methodHandler 来发送肯求。

这个动态代理对象的结构如下所示,它包含了所有接口技艺的 MethodHandler。

八、认知 MVC 注解的旨趣

上头咱们讲到了接口上是有一些注解的,比如 @RequestMapping,@PathVariable,这些注解统称为 Spring MVC 注解。可是由于 OpenFeign 是不睬解这些注解的,是以需要进行一次认知。

认知的经过图如下:

而认知的类即是 SpringMvcContract 类,调用 parseAndValidateMetadata 进行认知。认知完之后,就会生成元数据列表。源码如下所示:

List<MethodMetadata> metadata = contract.parseAndValidateMetadata(target.type()); 

这个类在这个旅途下,全球不错自行翻阅下若何认知的,不在本篇的商议鸿沟内。

https://github.com/spring-cloud/spring-cloud-openfeign/blob/main/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/support/SpringMvcContract.java 

这个元数据 MethodMetadata 内部有什么东西呢?

技艺的界说,如 StudyTimeFeignService 的 getMemberStudyTimeList 技艺。 技艺的参数类型,如 Long。 发送 HTTP 肯求的地址,如 /study/studytime/member/list/test/{id}。

然后每个接口技艺就会有对应的一个 MethodHandler,它内部就包含了元数据,当咱们调用接口技艺时,其实是调用动态代理对象的 MethodHandler 来发送汉典调用肯求的。

上头咱们针对 OpenFeign 框架若何为 FeignClient 接口生成动态代理依然讲收场,底下咱们再来看下当咱们调用接口技艺时,动态代理对象是若何发送汉典调用肯求的。

九、OpenFeign 发送肯求的旨趣

先崇高程图:

皇冠博彩

如故在 ReflectiveFeign 类中,有一个 invoke 技艺,会履行以下代码:

dispatch.get(method).invoke(args); 

这个 dispatch 咱们之前依然素养过了,它指向了一个 HashMap,内部包含了 FeignClient 每个接口的 MethodHandler 类。

这行代码的意念念即是把柄 method 找到 MethodHandler,调用它的 invoke 技艺,况兼传的参数即是咱们接口中的界说的参数。

那咱们再跟进去看下这个 MethodHandler invoke 技艺内部作念了什么事情。源码如下所示:

public Object invoke(Object[] argv) throws Throwable {   RequestTemplate template = buildTemplateFromArgs.create(argv);   ... } 

咱们不错看到这个技艺内部生成了 RequestTemplate,它的值访佛如下:

GET /study/list/test/1 HTTP/1.1 

RequestTemplate 养息成 Request,它的值访佛如下:

GET http://passjava-study/study/list/test/1 HTTP/1.1 

这旅途不即是咱们要 study 劳动的技艺,这么就不错径直调用到 study 服了呀!

OpenFeign 帮咱们拼装好了发起汉典调用的一切,咱们只管调用就好了。

如何在博彩赢钱

接着 MethodHandler 会履行以下技艺,发起 HTTP 肯求。

client.execute(request, options); 

从上头的咱们要调用的劳动即是 passjava-study,可是这个劳动的具体 IP 地址咱们是不知说念的,那 OpenFeign 是若何赢得到 passjava-study 劳动的 IP 地址的呢?

记忆下最运行咱们提议的中枢问题:OpenFeign 是若何进行负载平衡的?

咱们是否不错梦料到上一讲的 Ribbon 负载平衡,它不即是用来作念 IP 地址遴荐的么?

那咱们就来看下 OpenFeign 又是若何和 Ribbon 进行整合的。

十、OpenFeign 若何与 Ribbon 整合的旨趣

为了考据 Ribbon 的负载平衡,咱们需要启动两个 passjava-study 劳动,这里我启动了两个劳动,端标语永诀为 12100 和 12200,IP 地址王人是本机 IP:192.168.10.197。

接着上头的源码接续看,client.execute() 技艺其实会调用 LoadBalancerFeignClient 的 exceute 技艺。

这个技艺内部的履行经过如下图所示:

据一些媒体报道,某体育明星曾在一次博彩活动中获得了巨额奖金,并且被传出与某博彩公司有着不同寻常的关系。

皇冠球盘源码 将劳动称号 passjava-study 从 Request 的 URL 中删掉,剩下的如下所示:
GET http:///study/list/test/1 HTTP/1.1 
把柄劳动名从缓存中找 FeignLoadBalancer,如若缓存中莫得,则创建一个 FeignLoadBalancer。 FeignLoadBalancer 会创建出一个 command,这个 command 会履行一个 sumbit 技艺。 submit 技艺内部就会用 Ribbon 的负载平衡算法遴荐一个 server。源码如下:
Server svc = lb.chooseServer(loadBalancerKey); 

通过 debug 调试,咱们不错看到两次肯求的端标语不同样,一个是 12200,一个是 12100,诠释照实进行了负载平衡。

然后将 IP 地址和之前剔撤除劳动称号的 URL 进行拼接,生成终末的劳动地址。 终末 FeignLoadBalancer 履行 execute 技艺发送肯求。

那全球有莫得疑问,Ribbon 是若何拿到劳动地址列表的?这个即是上一讲 Ribbon 架构内部的骨子。

Ribbon 的中枢组件 ServerListUpdater,用来同步注册表的,它有一个完毕类 PollingServerListUpdater ,特意用来作念定时同步的。默许1s 后履行一个 Runnable 线程,背面即是每隔 30s 履行 Runnable 线程。这个 Runnable 线程即是去赢得注册中心的注册表的。

十一、OpenFeign 处理反应的旨趣

当汉典劳动 passjava-study 处理完业务逻辑后,就会复返 reponse 给 passjava-member 劳动了,这里还会对 reponse 进行一次解码操作。

Object result = decode(response); 

这个内部作念的事情即是调用 ResponseEntityDecoder 的 decode 技艺,将 Json 字符串转机为 Bean 对象。

十二、回来

本文通过我的开源相貌 PassJava 顶用到的 OpenFeign 动作示例代码动作进口进行素养。然后以图解+解读源码的方式深刻领悟了 OpenFeign 的运行机制和架构盘算推算。

中枢念念想: OpenFeign 会扫描带有 @FeignClient 注解的接口,然后为其生成一个动态代理。 动态代理内部包含有接口技艺的 MethodHandler,MethodHandler 内部又包含经过 MVC Contract 认知注解后的元数据。 发起肯求时,MethodHandler 会生成一个 Request。 负载平衡器 Ribbon 会从劳动列表中选取一个 Server,拿到对应的 IP 地址后,拼接成终末的 URL,就不错发起汉典劳动调用了。

OpenFeign 的中枢经过图: