最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Spring 6.1 RestClient構(gòu)建高可用聲明式HTTP客戶端方案詳解

 更新時間:2026年01月16日 10:14:49   作者:越重天  
文章介紹了如何基于Spring 6.1的RestClient構(gòu)建高可靠聲明式HTTP客戶端,解決了傳統(tǒng)RestTemplate的諸多問題,包括同步調(diào)用、負(fù)載均衡和安全令牌透傳等,通過一系列代碼示例和解析,感興趣的朋友跟隨小編一起看看吧

告別Feign:基于Spring 6.1 RestClient構(gòu)建高可靠聲明式HTTP客戶端

引言

在微服務(wù)架構(gòu)持續(xù)演進(jìn)的今天,高效的遠(yuǎn)程服務(wù)通信始終是系統(tǒng)設(shè)計的核心挑戰(zhàn)之一。傳統(tǒng)的Spring生態(tài)中,RestTemplate長期作為同步HTTP客戶端的首選,但其阻塞式模型、繁瑣的配置方式以及與現(xiàn)代云原生架構(gòu)的兼容性問題逐漸顯露。隨著Spring Framework 6.1的發(fā)布,全新的RestClient以更簡潔的API設(shè)計、更強(qiáng)大的擴(kuò)展能力登上舞臺,標(biāo)志著Spring在同步HTTP客戶端領(lǐng)域的一次革新。

本文聚焦于如何基于Spring Framework 6.1+ 的新特性,構(gòu)建一套生產(chǎn)級的聲明式HTTP通信方案。我們將深入探討以下核心命題:在非響應(yīng)式架構(gòu)下,如何通過RestClient.Builder實現(xiàn)媲美Feign的聲明式接口?如何無縫集成Spring Cloud LoadBalancer實現(xiàn)智能負(fù)載均衡?如何在同步調(diào)用鏈路中實現(xiàn)安全令牌的自動透傳?這些問題的答案不僅關(guān)乎代碼的優(yōu)雅性,更直接影響著微服務(wù)系統(tǒng)的性能、可維護(hù)性和擴(kuò)展性。

通過剖析RestClient的設(shè)計哲學(xué),讀者將掌握三大關(guān)鍵技術(shù):

  • 其一,聲明式接口驅(qū)動開發(fā),借助@HttpExchange注解實現(xiàn)類Feign的簡潔定義,告別冗余的模板代碼;
  • 其二,深度集成Spring Cloud生態(tài),通過定制ClientHttpRequestInterceptor打通服務(wù)發(fā)現(xiàn)與負(fù)載均衡鏈路,徹底解決“503 Service Unavailable”和403等典型問題;
  • 其三,工業(yè)級連接池配置,基于Apache HttpClient5的精細(xì)化連接管理策略,確保高并發(fā)場景下的穩(wěn)定吞吐。

文章還將揭示Spring 6.1+中鮮為人知的高級特性:例如如何通過RestClientAdapter實現(xiàn)與聲明式接口的無縫對接,將幫助開發(fā)者在傳統(tǒng)WebMVC架構(gòu)中,以零侵入改造的成本,獲得接近響應(yīng)式編程的性能表現(xiàn)。

對于正在面臨以下痛點的團(tuán)隊,本文提供了一站式解決方案:

  • 遺留系統(tǒng)需要從RestTemplate向現(xiàn)代客戶端遷移。
  • 同步服務(wù)調(diào)用存在性能瓶頸或連接泄漏問題
  • 需要統(tǒng)一管理多服務(wù)的負(fù)載均衡與安全認(rèn)證。
  • 期望在不引入響應(yīng)式編程的前提下優(yōu)化資源利用率。

一、環(huán)境準(zhǔn)備(pom.xml)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>6.1.0+</version> <!-- 必須6.1+ -->
</dependency>

二、聲明式HTTP接口定義

/**  
 * <pre>
 *  調(diào)用遠(yuǎn)程同步角色權(quán)限服務(wù)
 *    注:http://horus/horus這個配置,非常關(guān)鍵:
 *       1. 第一個horus表示遠(yuǎn)程服務(wù)應(yīng)用的名字(注冊到nacos注冊中心的應(yīng)用名,運行期間會被負(fù)載均衡攔截并替換成實際的ip和端口)
 *       2. 第二個horus配置表示遠(yuǎn)程服務(wù)的base上下文路徑,即contextPath,如果遠(yuǎn)程應(yīng)用不帶上下文路徑,這里配置成http://horus即可
 * </pre>
 * @author sinhy
 * @since 2022-07-13 17:00
 * @version V1.0  
 */
@HttpExchange(url = "http://horus/horus")
public interface AuthoritySyncSDKService
{
    /**
     * 同步角色權(quán)限
     * @author sinhy
     * @since 2022-07-13 16:06  void
     */
    @PostExchange("/syncRoleAuthority")
    void syncRoleAuthority();
}

三、同步RestClient配置

@Configuration
public class HttpExchangeFluxConfiguration
{
    /**
     *  @LoadBalanced負(fù)載均衡注入,此注解用于標(biāo)記RestTemplate、RestClient或WebClient.Builder這幾類對象。將生成器bean配置為使用LoadBalancerClient。
     * @author lilinhai
     * @since 2025-04-15 16:23 
     * @return WebClient.Builder
     */
    @LoadBalanced
    @Bean
    public RestClient.Builder loadBalancedWebClientBuilder()
    {
        return RestClient.builder().requestFactory(new HttpComponentsClientHttpRequestFactory(httpClient()));
    }
    @Bean
    public TokenPropagationExchangeFilterFunction tokenFilter()
    {
        return new TokenPropagationExchangeFilterFunction();
    }
    @Bean
    public HttpServiceProxyFactory httpServiceProxyFactory(RestClient.Builder restClientBuilder, TokenPropagationExchangeFilterFunction tokenFilter)
    {
        restClientBuilder.requestInterceptor(tokenFilter);
        RestClient restClient = restClientBuilder.build();
        return HttpServiceProxyFactory.builderFor(RestClientAdapter.create(restClient)).build();
    }
    private PoolingHttpClientConnectionManager poolingConnManager()
    {
        PoolingHttpClientConnectionManager pool = new PoolingHttpClientConnectionManager();
        // 最大連接數(shù)
        pool.setMaxTotal(200);
        // 每個路由的最大連接數(shù)
        pool.setDefaultMaxPerRoute(50);
        return pool;
    }
    private HttpClient httpClient()
    {
        return HttpClients.custom()
            .setConnectionManager(poolingConnManager())
            .setConnectionReuseStrategy(new DefaultClientConnectionReuseStrategy())
            .evictExpiredConnections()
            .evictIdleConnections(TimeValue.ofSeconds(30))
            .build();
    }
}

四、Token透傳實現(xiàn)(同步攔截器)

/**  
 * 令牌透傳過濾器
 * @author lilinhai
 * @since 2025-04-15 14:35
 * @version V1.0  
 */
public class TokenPropagationExchangeFilterFunction implements ClientHttpRequestInterceptor
{
    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException
    {
        // 設(shè)置授權(quán)信息
        RequestAttributes ra = RequestContextHolder.getRequestAttributes();
        if (ra != null)
        {
            ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) ra;
            String clientInfoJsonStr = servletRequestAttributes.getRequest().getHeader(WebHttpConstant.CLIENT_INFO_HEADER_NAME);
            if (clientInfoJsonStr != null)
            {
                request.getHeaders().add(WebHttpConstant.CLIENT_INFO_HEADER_NAME, clientInfoJsonStr);
            }
            String acceptLanguage = servletRequestAttributes.getRequest().getHeader(HttpHeaders.ACCEPT_LANGUAGE);
            if (acceptLanguage != null)
            {
                request.getHeaders().add(HttpHeaders.ACCEPT_LANGUAGE, acceptLanguage);
            }
        }
        return execution.execute(request, body);
    }
}

五、控制器層使用示例

@RestController
@RequestMapping("/authority")
public class AuthoritySyncController {
    private final AuthoritySyncSDKService authoritySyncSDKService;
    public AuthoritySyncController(AuthoritySyncSDKService authoritySyncSDKService)
    {
        this.authoritySyncSDKService = authoritySyncSDKService;
    }
    @GetMapping("/sync")
    public void sync() {
        authoritySyncSDKService.syncRoleAuthority();
    }
}

六、核心機(jī)制解析

  • 負(fù)載均衡流程
    • 通過自定義ClientHttpRequestInterceptor實現(xiàn)服務(wù)發(fā)現(xiàn)
    • 使用LoadBalancerClient.choose()獲取服務(wù)實例
    • 重寫請求URI為實際IP:Port
  • 聲明式接口原理
    • HttpServiceProxyFactory基于JDK動態(tài)代理生成實現(xiàn)類
    • 底層使用RestClient執(zhí)行實際HTTP請求
  • 與RestTemplate方案的差異
    • 更現(xiàn)代的流式API配置方式
    • 原生支持URI重寫攔截器鏈
    • 更好的異常處理機(jī)制

七、方案優(yōu)勢

  1. 官方推薦:完全基于Spring 6.1+官方組件棧
  2. 性能優(yōu)化:底層使用HttpComponents連接池
  3. 配置靈活:支持細(xì)粒度的超時和連接管理
  4. 未來兼容:為遷移到響應(yīng)式架構(gòu)保留接口兼容性

注意事項

  1. 確保服務(wù)調(diào)用URL格式為http://service-name/path
  2. Spring Security配置需要正確設(shè)置SecurityContextHolder策略
  3. 生產(chǎn)環(huán)境建議啟用spring-cloud-starter-circuitbreaker-resilience4j實現(xiàn)熔斷

到此這篇關(guān)于基于Spring 6.1 RestClient構(gòu)建高可用聲明式HTTP客戶端方案詳解的文章就介紹到這了,更多相關(guān)Spring RestClient聲明式http客戶端內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一不小心就讓Java開發(fā)踩坑的fail-fast是個什么鬼?(推薦)

    一不小心就讓Java開發(fā)踩坑的fail-fast是個什么鬼?(推薦)

    這篇文章主要介紹了Java fail-fast,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java操作Redis2種方法代碼詳解

    Java操作Redis2種方法代碼詳解

    這篇文章主要介紹了Java操作Redis2種方法代碼詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • SpringBoot加載外部依賴過程解析

    SpringBoot加載外部依賴過程解析

    這篇文章主要介紹了SpringBoot加載外部依賴過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • java.lang.ArrayIndexOutOfBoundsException數(shù)組越界異常問題解決

    java.lang.ArrayIndexOutOfBoundsException數(shù)組越界異常問題解決

    這篇文章主要給大家介紹了關(guān)于java.lang.ArrayIndexOutOfBoundsException數(shù)組越界異常問題解決的相關(guān)資料,數(shù)組越界訪問是一個非常嚴(yán)重的問題,文中通過圖文將解決的辦法介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • java web支持jsonp的實現(xiàn)代碼

    java web支持jsonp的實現(xiàn)代碼

    這篇文章主要介紹了java web支持jsonp的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • 一篇文章帶你了解Java方法的使用

    一篇文章帶你了解Java方法的使用

    這篇文章主要給大家介紹了關(guān)于Java中方法使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • Java設(shè)計模式之策略模式_動力節(jié)點Java學(xué)院整理

    Java設(shè)計模式之策略模式_動力節(jié)點Java學(xué)院整理

    策略模式是對算法的封裝,把一系列的算法分別封裝到對應(yīng)的類中,并且這些類實現(xiàn)相同的接口,相互之間可以替換。接下來通過本文給大家分享Java設(shè)計模式之策略模式,感興趣的朋友一起看看吧
    2017-08-08
  • Java無界阻塞隊列DelayQueue詳細(xì)解析

    Java無界阻塞隊列DelayQueue詳細(xì)解析

    這篇文章主要介紹了Java無界阻塞隊列DelayQueue詳細(xì)解析,DelayQueue是一個支持時延獲取元素的無界阻塞隊列,隊列使用PriorityQueue來實現(xiàn),隊列中的元素必須實現(xiàn)Delayed接口,在創(chuàng)建元素時可以指定多久才能從隊列中獲取當(dāng)前元素,需要的朋友可以參考下
    2023-12-12
  • Java8 HashMap遍歷方式性能探討

    Java8 HashMap遍歷方式性能探討

    JDK8之前,可以使用keySet或者entrySet來遍歷HashMap,JDK8中引入了map.foreach來進(jìn)行遍歷
    2021-09-09
  • Java面向程序的三大特性之封裝、繼承、多態(tài)詳解(最新整理)

    Java面向程序的三大特性之封裝、繼承、多態(tài)詳解(最新整理)

    面向?qū)ο蟪绦蛉筇匦裕悍庋b、繼承、多態(tài),而類和對象階段,主要研究的就是封裝特性,何為封裝呢?簡單來說就是套殼屏蔽細(xì)節(jié),本文給大家介紹Java面向程序的三大特性之封裝、繼承、多態(tài),感興趣的朋友一起看看吧
    2025-06-06

最新評論

嘉鱼县| 扶绥县| 太仆寺旗| 洮南市| 石渠县| 布尔津县| 高清| 海阳市| 衡南县| 荥阳市| 朝阳市| 大石桥市| 武汉市| 高淳县| 门头沟区| 土默特右旗| 汝州市| 资中县| 许昌县| 大埔县| 太仆寺旗| 静乐县| 无极县| 喀什市| 阳东县| 靖边县| 江阴市| 行唐县| 罗城| 阜新| 九江市| 当阳市| 竹北市| 甘泉县| 库尔勒市| 修武县| 蕲春县| 永定县| 福安市| 宜章县| 通城县|