国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【云原生】Spring Cloud Alibaba 之 Feign 遠(yuǎn)程調(diào)用 實(shí)戰(zhàn)

這篇具有很好參考價值的文章主要介紹了【云原生】Spring Cloud Alibaba 之 Feign 遠(yuǎn)程調(diào)用 實(shí)戰(zhàn)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

一、什么是遠(yuǎn)程調(diào)用?

在分布式領(lǐng)域中,一個系統(tǒng)由很多服務(wù)組成,不同的服務(wù)由各自的進(jìn)程單獨(dú)負(fù)責(zé)。因此,遠(yuǎn)程調(diào)用在分布式通信中尤為重要。

遠(yuǎn)程調(diào)用可分如下兩類:

  • 本地過程調(diào)用(Local Procedure Call,LPC),是指同一臺機(jī)器上運(yùn)行的不同進(jìn)程之間的互相通信,即在多進(jìn)程操作系統(tǒng)中,運(yùn)行的不同進(jìn)程之間可以通過 LPC 進(jìn)行函數(shù)調(diào)用。
  • 遠(yuǎn)程過程調(diào)用(Remote Procedure Call,RPC),是指不同機(jī)器上運(yùn)行的進(jìn)程之間的相互通信,某一機(jī)器上運(yùn)行的進(jìn)程在不知道底層通信細(xì)節(jié)的情況下,就像訪問本地服務(wù)一樣,去調(diào)用遠(yuǎn)程機(jī)器上的服務(wù)。

?遠(yuǎn)程調(diào)用的原理

B/S ( Browser/Server,瀏覽器 / 服務(wù)器) 架構(gòu)。在這種架構(gòu)中,被調(diào)用方(服務(wù)器)有一個開放的接口,然后調(diào)用方(用戶)通過 Browser 使用這個接口,來間接調(diào)用被調(diào)用方相應(yīng)的服務(wù),從而實(shí)現(xiàn)遠(yuǎn)程調(diào)用。

基本上通過RPC來實(shí)現(xiàn)遠(yuǎn)程調(diào)用,我們所熟悉的Dubbo,其核心就是RPC遠(yuǎn)程過程調(diào)用

Netty 的底層 就使用到了 RPC 遠(yuǎn)程過程調(diào)用

關(guān)于 Netty 如何實(shí)現(xiàn)RPC遠(yuǎn)程過程調(diào)用的可看我之前的博文 Netty實(shí)戰(zhàn) – 使用Netty實(shí)現(xiàn)分布式框架Dubbo RPC

分布式系統(tǒng)下,遠(yuǎn)程調(diào)用如此重要!

二、RestTemplate 與 Feign 的區(qū)別

RestTemplate 是什么?

RestTemplate是執(zhí)行HTTP請求的同步阻塞式的客戶端,它在HTTP客戶端庫(例如JDK HttpURLConnection,Apache HttpComponents,okHttp等)基礎(chǔ)封裝了更加簡單易用的模板方法API。也就是說RestTemplate是一個封裝,底層的實(shí)現(xiàn)還是java應(yīng)用開發(fā)中常用的一些HTTP客戶端。但是相對于直接使用底層的HTTP客戶端庫,它的操作更加方便、快捷,能很大程度上提升我們的開發(fā)效率。

RestTemplate 是 遠(yuǎn)程調(diào)用的工具!

在進(jìn)行遠(yuǎn)程調(diào)用時,使用 RestTemplate 時是這樣的

【云原生】Spring Cloud Alibaba 之 Feign 遠(yuǎn)程調(diào)用 實(shí)戰(zhàn)

以上代碼的缺點(diǎn):

  • 可讀性差,編程風(fēng)格不統(tǒng)一
  • 參數(shù)URL復(fù)雜,后期難于維護(hù)

Feign 是什么?

Feign是一個聲明式WebService客戶端。使用Feign能讓編寫Web Service客戶端更加簡單, 它的**使用方法是定義一個接口,然后在上面添加注解**,同時也支持JAX-RS標(biāo)準(zhǔn)的注解。Feign也支持可拔插式的編碼器和解碼器。**SpringCloud對Feign進(jìn)行了封裝,使其支持了Spring MVC標(biāo)準(zhǔn)注解和HttpMessageConverters。**Feign可以與Eureka和Ribbon組合使用以支持負(fù)載均衡。

Feign 官網(wǎng)地址

使用Feign 可以幫助我們優(yōu)雅的發(fā)送HTTP請求, 可以解決上述的問題!

三、Feign 遠(yuǎn)程調(diào)用 實(shí)戰(zhàn)開發(fā)

?Feign 替代 RestTemplate 實(shí)現(xiàn)遠(yuǎn)程調(diào)用

該項(xiàng)目基于 【云原生】SpringCloud Alibaba 之 Nacos注冊中心實(shí)戰(zhàn) 編寫,源碼后續(xù)我會上傳。

導(dǎo)入依賴

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

編寫FeignClient 客戶端類

@FeignClient("userService")
public interface UserClient {

    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

FeignClient 類解釋

  • 服務(wù)名稱:userService
  • 請求方式:Get
  • 請求路徑:相對路徑 /user/{id} RESTFULL風(fēng)格
  • 請求參數(shù):Long id
  • 返回結(jié)果:User對象

啟動類開啟支持遠(yuǎn)程調(diào)用功能

// 開啟遠(yuǎn)程調(diào)用服務(wù)
@EnableFeignClients
@SpringBootApplication
@MapperScan("com.chen.order.mapper")
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

測試

將order-service 服務(wù)中的 OrderService 類中的 queryOrderById 方法,替代為 FeignClient 寫法

public Order queryOrderById(Long orderId) {
        //1. 查詢訂單
        Order order = orderMapper.findById(orderId);
        //2. 查詢用戶
        User user = userClient.findById(order.getUserId());
        order.setUser(user);
        return order;
}

啟動自行測試即可。

?自定義 Feign 配置

Feign可以支持很多的自定義配置,如下表所示:

類型 作用 說明
feign.Logger.Level 修改日志級別 包含四種不同的級別:NONE、BASIC、HEADERS、FULL
feign.codec.Decoder 響應(yīng)結(jié)果的解析器 http遠(yuǎn)程調(diào)用的結(jié)果做解析,例如解析json字符串為java對象
feign.codec.Encoder 請求參數(shù)編碼 將請求參數(shù)編碼,便于通過http請求發(fā)送
feign. Contract 支持的注解格式 默認(rèn)是SpringMVC的注解
feign. Retryer 失敗重試機(jī)制 請求失敗的重試機(jī)制,默認(rèn)是沒有,不過會使用Ribbon的重試

一般情況下,默認(rèn)值就能滿足我們使用,如果要自定義時,只需要創(chuàng)建自定義的**@Bean覆蓋默認(rèn)Bean即可。**

配置文件的方式配置

基于配置文件修改feign的日志級別可以針對單個服務(wù):

feign:  
  client:
    config: 
      userservice: # 針對某個微服務(wù)的配置
        loggerLevel: FULL #  日志級別 

針對所有服務(wù)

feign:  
  client:
    config: 
      default: # 這里用default就是全局配置,如果是寫服務(wù)名稱,則是針對某個微服務(wù)的配置
        loggerLevel: FULL #  日志級別 

日志級別分為四種

  • NONE:不記錄任何日志信息,默認(rèn)
  • BASIC:僅記錄請求的方法,URL以及響應(yīng)狀態(tài)和執(zhí)行時間
  • HEADERS:在BASIC的基礎(chǔ)上,加上請求與響應(yīng)頭信息
  • FULL:記錄所有請求和響應(yīng)的明細(xì),包括頭信息、請求體、響應(yīng)信息,元數(shù)據(jù)

通過代碼的方式配置

基于Java代碼來修改日志級別,先聲明一個類,然后聲明一個Logger.Level的對象

import feign.Logger;
import org.springframework.context.annotation.Bean;

public class DefaultFeignConfiguration {

    @Bean
    public Logger.Level logLevel() {
        return Logger.Level.BASIC;
    }
}

如果想要 全局生效,將其放入 @EnableFeignClients 注解中:

@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class) 

局部生效,則放入 FeignClients 注解中,指定服務(wù)對其生效:

@FeignClient(value = "userservice", configuration = DefaultFeignConfiguration .class) 

四、Feign 使用 優(yōu)化

Feign底層發(fā)起http請求,依賴于其它的框架。其底層客戶端實(shí)現(xiàn)包括:

  • URLConnection:默認(rèn)實(shí)現(xiàn),不支持連接池
  • Apache HttpClient :支持連接池
  • OKHttp:支持連接池

因此提高Feign的性能主要手段就是使用連接池代替默認(rèn)的URLConnection。

Feign的優(yōu)化 小結(jié)

  1. 日志級別盡量用basic

  2. 使用HttpClient或OKHttp代替URLConnection

  3. 引入feign-httpClient依賴

  4. 配置文件開啟httpClient功能,設(shè)置連接池參數(shù)

五、Feign 最佳實(shí)踐方式

所謂最近實(shí)踐,就是使用過程中總結(jié)的經(jīng)驗(yàn),最好的一種使用方式。

Feign的客戶端與服務(wù)提供者的controller代碼非常相似:

Feign的客戶端

【云原生】Spring Cloud Alibaba 之 Feign 遠(yuǎn)程調(diào)用 實(shí)戰(zhàn)

UserController

【云原生】Spring Cloud Alibaba 之 Feign 遠(yuǎn)程調(diào)用 實(shí)戰(zhàn)

可以簡化這樣的重復(fù)代碼嗎,答案肯定可以,下面我們就來看看繼承方式來優(yōu)化代碼!

??繼承方式

一樣的代碼可以通過繼承來共享:

1)定義一個API接口,利用定義方法,并基于SpringMVC注解做聲明。

2)Feign客戶端和Controller都繼承該接口

【云原生】Spring Cloud Alibaba 之 Feign 遠(yuǎn)程調(diào)用 實(shí)戰(zhàn)

優(yōu)點(diǎn):

  • 簡單,通俗易懂
  • 實(shí)現(xiàn)了代碼共享

缺點(diǎn):

  • 服務(wù)提供方、服務(wù)消費(fèi)方緊耦合
  • 參數(shù)列表中的注解映射并不會繼承,因此controller中必須再次聲明方法、參數(shù)列表、注解

??抽取分離方式

將Feign的Client抽取為獨(dú)立模塊,并且把接口有關(guān)的POJO、默認(rèn)的Feign配置都放到這個模塊中,提供給所有消費(fèi)者使用。

例如,將UserClient、User、Feign的默認(rèn)配置都抽取到一個feign-api包中,所有微服務(wù)引用該依賴包,即可直接使用。

【云原生】Spring Cloud Alibaba 之 Feign 遠(yuǎn)程調(diào)用 實(shí)戰(zhàn)

代碼實(shí)現(xiàn)

新建一個Moudle

【云原生】Spring Cloud Alibaba 之 Feign 遠(yuǎn)程調(diào)用 實(shí)戰(zhàn)

項(xiàng)目結(jié)構(gòu)

【云原生】Spring Cloud Alibaba 之 Feign 遠(yuǎn)程調(diào)用 實(shí)戰(zhàn)

pom引入依賴

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

其次,將Clients、User、DefaultFeignConfiguration 都復(fù)制進(jìn) feign-api 項(xiàng)目中

【云原生】Spring Cloud Alibaba 之 Feign 遠(yuǎn)程調(diào)用 實(shí)戰(zhàn)

項(xiàng)目搭建完成、可使用,引入依賴即可

引入依賴使用 feign-api 項(xiàng)目中的配置

order-service 項(xiàng)目中引入 feign-api項(xiàng)目

<dependency>
    <groupId>com.wang.demo</groupId>
    <artifactId>feign-api</artifactId>
    <version>1.0</version>
</dependency>

修改order-service中的所有與上述三個組件有關(guān)的導(dǎo)包部分,改成導(dǎo)入feign-api中的包

重啟測試

重啟測試后,發(fā)現(xiàn)報錯了:

【云原生】Spring Cloud Alibaba 之 Feign 遠(yuǎn)程調(diào)用 實(shí)戰(zhàn)

報錯的具體原因是 無法注入該對象,原因是Spring在掃描注入對象的時候,未掃描到該包下的類,所以顯示注入失敗!

UserClient 在 com.chen.feign.clients 包下,而 order-service 的 @EnableFeignClients在 com.chen.order 下,所以無法掃描

解決問題

方式一

指定 Feign 應(yīng)該掃描的包

@EnableFeignClients(basePackages = "com.chen.feign.clients")

方式二

指定需要加載的Client接口

@EnableFeignClients(clients = {UserClient.class})

再次啟動,即可成功!

?小結(jié)

以上就是【Bug 終結(jié)者】對 【云原生】Spring Cloud Alibaba 之 Feign 遠(yuǎn)程調(diào)用 實(shí)戰(zhàn) 的簡單介紹,Spring Cloud Alibaba 是目前比較火的微服務(wù)中間件,很強(qiáng)大,必須吃透!,同時,Feign是目前遠(yuǎn)程調(diào)用最合適的選擇,使用Feign可極大的提高我們的工作效率

如果這篇【文章】有幫助到你,希望可以給【Bug 終結(jié)者】點(diǎn)個贊??,創(chuàng)作不易,如果有對【后端技術(shù)】、【前端領(lǐng)域】感興趣的小可愛,也歡迎關(guān)注?????? 【Bug 終結(jié)者】??????,我將會給你帶來巨大的【收獲與驚喜】??????!文章來源地址http://www.zghlxwxcb.cn/news/detail-406334.html

到了這里,關(guān)于【云原生】Spring Cloud Alibaba 之 Feign 遠(yuǎn)程調(diào)用 實(shí)戰(zhàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Spring Cloud Day2 Nacos配置管理、Feign遠(yuǎn)程調(diào)用與Gateway服務(wù)網(wǎng)關(guān)

    Spring Cloud Day2 Nacos配置管理、Feign遠(yuǎn)程調(diào)用與Gateway服務(wù)網(wǎng)關(guān)

    Nacos除了可以做注冊中心,同樣可以做配置管理來使用。 當(dāng)微服務(wù)部署的實(shí)例越來越多,達(dá)到數(shù)十、數(shù)百時,逐個修改微服務(wù)配置就會讓人抓狂,而且很容易出錯。我們需要一種統(tǒng)一配置管理方案,可以集中管理所有實(shí)例的配置。 Nacos一方面可以將配置集中管理,另一方可以

    2024年02月10日
    瀏覽(21)
  • 云原生微服務(wù)治理經(jīng)典套件之Spring Cloud Alibaba核心技術(shù)與實(shí)戰(zhàn)案例

    云原生微服務(wù)治理經(jīng)典套件之Spring Cloud Alibaba核心技術(shù)與實(shí)戰(zhàn)案例

    送書第一期 《用戶畫像:平臺構(gòu)建與業(yè)務(wù)實(shí)踐》 送書活動之抽獎工具的打造 《獲取博客評論用戶抽取幸運(yùn)中獎?wù)摺?送書第二期 《Spring Cloud Alibaba核心技術(shù)與實(shí)戰(zhàn)案例》 文章末尾有送書須知 ^ o ^,歡迎各位老板們! 云原生的微服務(wù)治理可以從以下幾個方面進(jìn)行: 服務(wù)注冊與

    2024年02月08日
    瀏覽(764)
  • 【spring Cloud】微服務(wù)通信的三種方式RestTemplate、Feign遠(yuǎn)程調(diào)用與Dubbo的使用

    目錄 一、通過RestTemplate調(diào)用微服務(wù) 二、通過Feign遠(yuǎn)程調(diào)用 三、Dubbo? 分布式中的遠(yuǎn)程調(diào)用大概分為兩種 RESTful接口? REST,即Representational State Transfer的縮寫,如果一個架構(gòu)符合REST原則,就稱它為RESTful架構(gòu)。 每一個URI代表一種資源; 客戶端和服務(wù)器之間,傳遞這種資源的某種

    2024年04月11日
    瀏覽(18)
  • Spring Cloud Gateway如何優(yōu)雅地進(jìn)行feign調(diào)用

    Spring Cloud Gateway如何優(yōu)雅地進(jìn)行feign調(diào)用

    之前寫過一篇文章,介紹微服務(wù)場景下的權(quán)限處理,方案如下: 在實(shí)踐中,上面的網(wǎng)關(guān)選型為Spring Cloud Gateway,所以這里就存在一個問題,即網(wǎng)關(guān)如何調(diào)用用戶服務(wù)進(jìn)行鑒權(quán)的問題。 在微服務(wù)場景下,服務(wù)間的調(diào)用可以通過feign的方式,但這里的問題是,網(wǎng)關(guān)是reactor模式,即

    2024年02月08日
    瀏覽(23)
  • 云原生微服務(wù)實(shí)戰(zhàn) Spring Cloud Alibaba 之 Nacos

    云原生微服務(wù)實(shí)戰(zhàn) Spring Cloud Alibaba 之 Nacos

    第一章 Java線程池技術(shù)應(yīng)用 第二章 CountDownLatch和Semaphone的應(yīng)用 第三章 Spring Cloud 簡介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 第七章 Spring Cloud 之 GateWay 第八章 Spring Cloud Netflix 之 Hystrix 第九章 代碼管理gitlab 使用 第十章 Spr

    2024年02月08日
    瀏覽(91)
  • 【Spring Cloud系列】Feign詳解與實(shí)戰(zhàn)

    【Spring Cloud系列】Feign詳解與實(shí)戰(zhàn)

    在前一章介紹了Ribbon的用法,在使用Ribbon是通過RestTemplate調(diào)用其他服務(wù)的API時,所有參數(shù)必須在請求的URL中進(jìn)行拼接。如果參數(shù)過多,拼接請求字符串會導(dǎo)致效率下降。Spring Cloud提供另外一種調(diào)用API的解決方案,既使用 Spring Cloud Feign 。 Feign是一種負(fù)載均衡的HTTP客戶端,它封

    2024年02月07日
    瀏覽(47)
  • Spring Cloud 實(shí)戰(zhàn) | 解密Feign底層原理,包含實(shí)戰(zhàn)源碼

    Spring Cloud 實(shí)戰(zhàn) | 解密Feign底層原理,包含實(shí)戰(zhàn)源碼

    專欄集錦,大佬們可以收藏以備不時之需 Spring Cloud實(shí)戰(zhàn)專欄:https://blog.csdn.net/superdangbo/category_9270827.html Python 實(shí)戰(zhàn)專欄:https://blog.csdn.net/superdangbo/category_9271194.html Logback 詳解專欄:https://blog.csdn.net/superdangbo/category_9271502.html tensorflow專欄:https://blog.csdn.net/superdangbo/category_869

    2024年02月06日
    瀏覽(25)
  • Spring Cloud Feign調(diào)用異常:feign.RetryableException: connect timed out executing POST http://xxx

    本機(jī)JUnit單元測試時,調(diào)用部署在開發(fā)環(huán)境(Centos7)的服務(wù)時,報feign.RetryableException: connect timed out 直接訪問服務(wù)地址時,提示網(wǎng)絡(luò)無法訪問 http://192.168.1.15:7002/comDictionary/getDictionaryById?dictionaryId=GIVE_LOGIN 發(fā)現(xiàn)端口沒有打開。需要打開linux防火墻的端口 firewall-cmd --permanent --zon

    2024年03月22日
    瀏覽(22)
  • SpringCloud Alibaba(一)微服務(wù)簡介+Nacos的安裝部署與使用+Nacos集成springboot實(shí)現(xiàn)服務(wù)注冊+Feign實(shí)現(xiàn)服務(wù)之間的遠(yuǎn)程調(diào)用+負(fù)載均衡+領(lǐng)域劃分

    SpringCloud Alibaba(一)微服務(wù)簡介+Nacos的安裝部署與使用+Nacos集成springboot實(shí)現(xiàn)服務(wù)注冊+Feign實(shí)現(xiàn)服務(wù)之間的遠(yuǎn)程調(diào)用+負(fù)載均衡+領(lǐng)域劃分

    目錄 一.認(rèn)識微服務(wù) 1.0.學(xué)習(xí)目標(biāo) 1.1.單體架構(gòu) 單體架構(gòu)的優(yōu)缺點(diǎn)如下: 1.2.分布式架構(gòu) 分布式架構(gòu)的優(yōu)缺點(diǎn): 1.3.微服務(wù) 微服務(wù)的架構(gòu)特征: 1.4.SpringCloud 1.5Nacos注冊中心 1.6.總結(jié) 二、Nacos基本使用安裝部署+服務(wù)注冊 (一)linux安裝包方式單節(jié)點(diǎn)安裝部署 1. jdk安裝配置 2. na

    2024年02月09日
    瀏覽(29)
  • 解密Spring Cloud Alibaba核心技術(shù),實(shí)戰(zhàn)案例書現(xiàn)世

    解密Spring Cloud Alibaba核心技術(shù),實(shí)戰(zhàn)案例書現(xiàn)世

    ??作者主頁:小虛竹 ??作者簡介:大家好,我是小虛竹。Java領(lǐng)域優(yōu)質(zhì)創(chuàng)作者??,CSDN博客專家??,華為云享專家??,掘金年度人氣作者??,阿里云專家博主??,51CTO專家博主?? ??技術(shù)活,該賞 ??點(diǎn)贊 ?? 收藏 ?再看,養(yǎng)成習(xí)慣 PC端左側(cè)加我微信,進(jìn)社群,有送書

    2024年02月12日
    瀏覽(92)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包