欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

OpenFeign基本介紹和原理了解-創(chuàng)新互聯(lián)

了解 OpenFeign

OpenFeign 組件的前身是 Netflix Feign 項目。后來 Feign 項目被貢獻給了開源組織,才有了今天使用的 Spring Cloud OpenFeign 組件。
OpenFeign 提供了一種聲明式的遠程調用接口,它可以大幅簡化遠程調用的編程體驗。用一個代碼片段看一下,由 OpenFeign 發(fā)起的遠程服務調用的代碼風格是什么樣的。

創(chuàng)新互聯(lián)建站是一家網(wǎng)站設計公司,集創(chuàng)意、互聯(lián)網(wǎng)應用、軟件技術為一體的創(chuàng)意網(wǎng)站建設服務商,主營產品:成都響應式網(wǎng)站建設公司、品牌網(wǎng)站制作、全網(wǎng)整合營銷推廣。我們專注企業(yè)品牌在網(wǎng)站中的整體樹立,網(wǎng)絡互動的體驗,以及在手機等移動端的優(yōu)質呈現(xiàn)。做網(wǎng)站、成都網(wǎng)站建設、移動互聯(lián)產品、網(wǎng)絡運營、VI設計、云產品.運維為核心業(yè)務。為用戶提供一站式解決方案,我們深知市場的競爭激烈,認真對待每位客戶,為客戶提供賞析悅目的作品,網(wǎng)站的價值服務。
String response = helloWorldService.hello("Spring Cloud");

可以發(fā)現(xiàn),使用 OpenFeign 組件來實現(xiàn)遠程調用非常簡單,就像使用本地方法一樣,只要一行代碼就能實現(xiàn) WebClient 組件好幾行代碼干的事情。而且這段代碼不包含任何業(yè)務無關的信息,完美實現(xiàn)了調用邏輯和業(yè)務邏輯之間的職責分離。

OpenFeign 組件背后的工作流程

OpenFeign 使用了一種動態(tài)代理技術來封裝遠程服務調用的過程,在上面的例子中看到的 helloWorldService 其實是一個特殊的接口,它是由 OpenFeign 組件中的 FeignClient 注解所聲明的接口。

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

@FeignClient(value = "hello-world-service")
public interface HelloWorldService {  @PostMapping("/sayHello")   
  String hello(String guestName);
}

遠程服務調用的信息被寫在了 FeignClient 接口中。在上面的代碼里,可以看到,服務的名稱、接口類型、訪問路徑已經通過注解做了聲明。OpenFeign 通過解析這些注解標簽生成一個動態(tài)代理類,這個代理類會將接口調用轉化為一個遠程服務調用的 Request,并發(fā)送給目標服務。

OpenFeign 的動態(tài)代理

在項目初始化階段,OpenFeign 會生成一個代理類,對所有通過FeignClient 接口發(fā)起的遠程調用進行動態(tài)代理。如圖:
在這里插入圖片描述
上圖中的步驟中,在項目啟動階段加載完成的是 1 ~ 3步 ,只有第 4 步(調用遠程服務)是發(fā)生在項目的運行階段。
關鍵步驟描述:

  1. 在項目啟動階段,OpenFeign 框架會發(fā)起一個主動的掃包流程,從指定的目錄下掃描并加載所有被 @FeignClient 注解修飾的接口。
  2. OpenFeign 會針對每一個 FeignClient 接口生成一個動態(tài)代理對象,即圖中的 FeignProxyService,這個代理對象在繼承關系上屬于 FeignClient 注解所修飾的接口的實例。
  3. 這個動態(tài)代理對象會被添加到 Spring 上下文中,并注入到對應的服務里,也就是圖中的 LocalService 服務。
  4. LocalService 會發(fā)起底層方法調用。實際上這個方法調用會被 OpenFeign 生成的代理對象接管,由代理對象發(fā)起一個遠程服務調用,并將調用的結果返回給 LocalService。
OpenFeign 是如何通過動態(tài)代理技術創(chuàng)建代理對象的?

OpenFeign 組件加載過程的重要階段,如圖:
在這里插入圖片描述
OpenFeign 動態(tài)代理類的創(chuàng)建過程:

  1. 項目加載:在項目的啟動階段,EnableFeignClients 注解扮演了啟動開關的角色,它使用 Spring 框架的 Import 注解導入了 FeignClientsRegistrar 類,開始了 OpenFeign 組件的加載過程。
@SpringBootApplication
@EnableFeignClients
public class HelloWorldApplication {public static void main(String[] args) {SpringApplication.run(HelloWorldApplication .class, args);
    }

}
  1. 掃包:FeignClientsRegistrar 負責 FeignClient 接口的加載,它會在指定的包路徑下掃描所有的 FeignClients 類,并構造 FeignClientFactoryBean 對象來解析 FeignClient 接口。
  2. 解析 FeignClient 注解:FeignClientFactoryBean 有兩個重要的功能,一個是解析 FeignClient 接口中的請求路徑和降級函數(shù)的配置信息;另一個是觸發(fā)動態(tài)代理的構造過程。
  3. 構建動態(tài)代理對象:ReflectiveFeign 包含了 OpenFeign 動態(tài)代理的核心邏輯,它主要負責創(chuàng)建出 FeignClient 接口的動態(tài)代理對象。ReflectiveFeign 在這個過程中有兩個重要任務:一個是解析 FeignClient 接口上各個方法級別的注解。將其中的遠程接口 URL、接口類型(GET、POST 等)、各個請求參數(shù)等封裝成元數(shù)據(jù),并為每一個方法生成一個對應的 MethodHandler 類作為方法級別的代理;另一個重要任務是將這些 MethodHandler 方法代理做進一步封裝,通過 Java 標準的動態(tài)代理協(xié)議,構建一個實現(xiàn)了 InvocationHandler 接口的動態(tài)代理對象,并將這個動態(tài)代理對象綁定到 FeignClient 接口上。這樣一來,所有發(fā)生在 FeignClient 接口上的調用,最終都會由它背后的動態(tài)代理對象來承接。
    MethodHandler 的構建過程涉及到了復雜的元數(shù)據(jù)解析,OpenFeign 組件將 FeignClient 接口上的各種注解封裝成元數(shù)據(jù),并利用這些元數(shù)據(jù)把一個方法調用“翻譯”成一個遠程調用的 Request 請求。
    元數(shù)據(jù)的解析是依賴于 OpenFeign 組件中的 Contract 協(xié)議解析功能。Contract 是 OpenFeign 組件中定義的頂層抽象接口,它有一系列的具體實現(xiàn),其中 SpringMvcContract 這個類名字中就能看出來,它是專門用來解析 Spring MVC 標簽的。
    SpringMvcContract 的繼承結構是 :SpringMvcContract->BaseContract->Contract。
    這里拿一段 SpringMvcContract 的代碼塊,理解它是如何將注解解析為元數(shù)據(jù)的。這段代碼的主要功能是解析 FeignClient 方法級別上定義的 Spring MVC 注解。
// 解析FeignClient接口方法級別上的RequestMapping注解
protected void processAnnotationOnMethod(MethodMetadata data, Annotation methodAnnotation, Method method) {   // 如果方法上沒有使用RequestMapping注解,則不進行解析
   // 其實GetMapping、PostMapping等注解都屬于RequestMapping注解
   if (!RequestMapping.class.isInstance(methodAnnotation)
         && !methodAnnotation.annotationType().isAnnotationPresent(RequestMapping.class)) {  return;
   }

   // 獲取RequestMapping注解實例
   RequestMapping methodMapping = findMergedAnnotation(method, RequestMapping.class);
   // 解析Http Method定義,即注解中的GET、POST、PUT、DELETE方法類型
   RequestMethod[] methods = methodMapping.method();
   // 如果沒有定義methods屬性則默認當前方法是個GET方法
   if (methods.length == 0) {  methods = new RequestMethod[] {RequestMethod.GET };
   }
   checkOne(method, methods, "method");
   data.template().method(Request.HttpMethod.valueOf(methods[0].name()));

   // 解析Path屬性,即方法上寫明的請求路徑
   checkAtMostOne(method, methodMapping.value(), "value");
   if (methodMapping.value().length >0) {  String pathValue = emptyToNull(methodMapping.value()[0]);
      if (pathValue != null) { pathValue = resolve(pathValue);
         // 如果path沒有以斜杠開頭,則補上/
         if (!pathValue.startsWith("/") && !data.template().path().endsWith("/")) {pathValue = "/" + pathValue;
         }
         data.template().uri(pathValue, true);
         if (data.template().decodeSlash() != decodeSlash) {data.template().decodeSlash(decodeSlash);
         }
      }
   }

   // 解析RequestMapping中定義的produces屬性
   parseProduces(data, method, methodMapping);

   // 解析RequestMapping中定義的consumer屬性
   parseConsumes(data, method, methodMapping);

   // 解析RequestMapping中定義的headers屬性
   parseHeaders(data, method, methodMapping);
   data.indexToExpander(new LinkedHashMap<>());
}

通過上面的方法可以看到,OpenFeign 對 RequestMappings 注解的各個屬性都做了解析。
如果項目中使用的是 GetMapping、PostMapping 之類的注解,沒有使用 RequestMapping,那么 OpenFeign 也可以解析。以 GetMapping 為例,它對 RequestMapping 注解做了一層封裝。如下代碼片段,這個注解頭上也掛了一個 RequestMapping 注解。因此 OpenFeign 可以正確識別 GetMapping 并完成加載。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = RequestMethod.GET)
public @interface GetMapping {// ...省略部分代碼
}
OpenFeign調用過程

OpenFeign 其實底層調用的是 Feign 的方法,生成了代理類,使用的是 JDK 的動態(tài)代理,然后 bean 注入。
調用過程,就是代理類作為客戶端向被調用方發(fā)送請求,接收相應的過程。其中,feign 自行封裝了 JDK java.net 相關的網(wǎng)絡請求方法,請求過程中還有 Loadbalancer 進行負載均衡;收到響應后,還會對響應類進行解析,取出正確的響應信息。

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

本文名稱:OpenFeign基本介紹和原理了解-創(chuàng)新互聯(lián)
網(wǎng)頁URL:http://aaarwkj.com/article40/gdpho.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內鏈、全網(wǎng)營銷推廣、云服務器品牌網(wǎng)站建設、網(wǎng)站導航、外貿網(wǎng)站建設

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設
青青草青娱乐免费在线视频 | 国产麻豆成人传媒免费观看| 亚洲熟妇av一区二区三区l| 黄片免费在线播放欧美| 琪琪精品免费一区二区三区| 亚洲色图视频免费观看| 在线中文字幕av电影| 18禁在线免费观看网站| 亚洲欧美午夜福利视频| 亚洲欧美综合另类久久 | 日本h电影一区二区三区| 懂色av中文字幕一区| 中文字幕一区二区三区三级| 91久久一区二区秋霞免费| 久久男女激情免费视频| 日进去了啊内射视频| 日本一道二区三区我不卡| 日韩亚洲国产欧美在线观看| 日本午夜节目在线观看| 夜夜春久久天堂亚洲精品| 四虎精品视频在线免费| 亚洲精品一区二区免费看| 囗交囗爆吞精在线视频| 黄色大全欧美在线观看| 亚洲一区二区三区精品福利| 国产精品一区二区久久蜜桃麻豆| 亚洲巨人精品福利导航| 美女张开腿让男人插进去 | 欧美欧成人一区二区三区a∨| 内射性感黑丝少妇av| 小明久久国内精品自线| 黄色国产一区二区三区| 日本在线不卡二区三区| 91精品人妻二区三区| 国产在线视频不卡一区| 黑人精品一区二区三区| 国产精品国产亚洲精品看不| 青青草青娱乐免费在线视频| 麻豆国产原创av色哟哟| av天堂男人站在线观看| 人妻少妇一区二区三区四区|