当前位置: 首页 > 网络应用技术

假装基本原理分析 - 自动加载和动态剂

时间:2023-03-07 16:14:01 网络应用技术

  本文仅介绍了假装的自动加载和动态代理机制,这不会过分深入。

  这是Feign官方Github的介绍:“假首是受改造,JAXRS-2.0和Websocket的启发的Java HTTP客户端。假装的主要目标是降低使用HTTP API的每个人的复杂性。”

  实际上,假装的底层取决于Java的动态代理机制封装本机Java插座或Apache HTTPClient以基于HTTP协议实现远程进程调用。以这个为基础。

  使用假装的学生知道注释是打开FIEGN功能的关键。我们通常在此注释中添加feignclient的脚,以便弹簧容器可以扫描所有feignclients并托管托管。我们可以使用注释以稍后自动导入。

  这种注释样式也是许多第三方包装集成的Springboot使用的例程:通常,在打开注释后,Springboot可以自动加载由第三派对软件包指定的类。我们可以直接使用第三派对软件包提供的功能。

  它不会直接给出自动加载的主要静脉,而不是详细引入自动加载零件,以查看弹簧容器上的bean已加载。

  首先输入源代码,然后检查注释将被引入注册商注册表。此注册表是自动加载的关键。

  从源代码可以看出注释被引入自定义FeignclientsRegistrar类。

  这种类型的注册表通常在弹簧中继承了ImportBeanDefinitionItinitienItinItinistrar界面,并在registerBeanDefinininionion实现方法中向弹簧容器注册一些BEAN,以实现自动注入第三方功能的目的。

  RegisterFeignclies方法的代码有点一点,但是主要思想是分析编码解决方案。根据分析信息,获取Feignclients,然后将其包装到BeanDefinition中以注册到弹簧容器中。专门分为以下步骤:

  RegisterFeignClient()是注册单个功能的一种方式。乍一看,此方法非常长,但实际上,主线非常清楚。

  它是要在beanDefinition中提取元素扫描的元信息,然后构造一个免费定义的工厂BEAN,即FeignClientFactoryBean。当我们每次在容器中获得feignclient时,我们将获得(FactoryBean's GetObject()方法的GetObject()方法()。这涉及春季容器中普通Bean和FactoryBean之间的差异,您可以自己理解)。

  该方法的其他部分用于上述逻辑服务,包括FactoryBean的结构,并将BeanDefinition注入了容器的中间过程中。我们不必太多,只需抓住要点即可。

  话虽如此,实际上,自动加载过程已经完成,并且容器中包含自定义FeignClientFactoryBean。这里是总结整个自动加载过程的流程图。

  但是我们不知道自动加载feignclientfactorybean暂时做了什么。

  FeignClientFactoryBean的源代码如下:

  getObject()将确定URL属性是否定义了用户定义的用户定义的URL属性是否用带有负载平衡属性的对象返回的URL属性是否返回了URL属性。特定过程如下:

  从上面的源代码可以看出,无论是否需要负载平衡,动态代理对象将通过targeter.target()方法创建。()调用堆栈并不重要。您可以自己查看:

  接下来,我们来到了这种重要方法:

  从Newinstance那里,我们看到了熟悉的代理人和InvocationHandler,这也表明了假装的底层仍然依赖JDK的动态代理:

  后来是创建代理对象并返回。

  让我们看看核心代理逻辑的完成。InvocationHandler的实现类是FeignInvocationHandler,这是反射式fefige的静态内部类别。

  FeignInvocationHandler仍然非常简单。调度是我们上面提到的MethodToToHandler(方法→MethodHandler)映射。执行调用方法时:

  在这里,我们只关心远程呼叫的实现机制,因此我们将输入Synchronousmethodhandler,以观察Invoke()方法的执行逻辑:

  调用方法将特定的远程调用托付给executeanddecode()进行执行。从方法名称中,此方法不仅执行HTTP远程调用,还可以执行响应上的代码操作。对于开发人员而言,这也是一个非常方便的点,忽略开发人员无视HTTP消息分析的过程。

  Invoke还提供了故障机制,主要逻辑由重试对象实现。有兴趣的朋友可以理解自己。

  executeanddecode()方法首先构造请求对象,然后使用客户端对象启动HTTP请求。

  说到哪个,feignclientfactorybean#getObject方法的执行逻辑也很清楚,也就是说,通过JDK的动态代理,Apache HTTPClient具有多层次包来实现远程呼叫的能力。整理整个过程:

  本文主要介绍了假装的自动加载和动态代理机制,并整理了这两种机制的主要环境,并且忽略了其他次要信息。罚款可以被许多开发人员使用,而不仅仅是上面介绍的两个功能。它还提供了诸如负载平衡和融合之类的机制。本文中引入的主要静脉被一一整理。

  原始:https://juejin.cn/post/7100127246371225636