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

Spring負(fù)載均衡LoadBalancer使用詳解

 更新時間:2023年11月18日 08:55:43   作者:morris131  
這篇文章主要介紹了Spring負(fù)載均衡LoadBalancer使用詳解,Spring Cloud LoadBalancer是Spring Cloud官方自己提供的客戶端負(fù)載均衡器, 用來替代Ribbon,Spring官方提供了兩種客戶端都可以使用loadbalancer,需要的朋友可以參考下

LoadBalancer

Spring Cloud LoadBalancer是Spring Cloud官方自己提供的客戶端負(fù)載均衡器, 用來替代Ribbon。

Spring官方提供了兩種客戶端都可以使用loadbalancer:

  • RestTemplate:Spring提供的用于訪問Rest服務(wù)的客戶端,RestTemplate提供了多種便捷訪問遠(yuǎn)程Http服務(wù)的方法,能夠大大提高客戶端的編寫效率。默認(rèn)情況下,RestTemplate默認(rèn)依賴jdk的HTTP連接工具。
  • WebClient:從Spring WebFlux 5.0版本開始提供的一個非阻塞的基于響應(yīng)式編程的進(jìn)行Http請求的客戶端工具。它的響應(yīng)式編程的基于Reactor的。WebClient中提供了標(biāo)準(zhǔn)Http請求方式對應(yīng)的get、post、put、delete等方法,可以用來發(fā)起相應(yīng)的請求。

RestTemplate整合LoadBalancer

引入LoadBalancer的依賴

<!-- LoadBalancer -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

<!-- 提供了RestTemplate支持 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- nacos服務(wù)注冊與發(fā)現(xiàn)  移除ribbon支持-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </exclusion>
    </exclusions>
</dependency>

注意:nacos-discovery中引入了ribbon,需要移除ribbon的包,如果不移除,也可以在yml中配置不使用ribbon。

默認(rèn)情況下,如果同時擁有RibbonLoadBalancerClient和BlockingLoadBalancerClient,為了保持向后兼容性,將使用RibbonLoadBalancerClient。

要覆蓋它,可以設(shè)置spring.cloud.loadbalancer.ribbon.enabled屬性為false。

spring:
  application:
    name: user-service

  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    # 不使用ribbon,使用loadbalancer
    loadbalancer:
      ribbon:
        enabled: false

使用@LoadBalanced注解修飾RestTemplate,開啟客戶端負(fù)載均衡功能

package com.morris.user.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestConfig {

    /**
     * 默認(rèn)的RestTemplate,不帶負(fù)載均衡
     * @return
     */
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    /**
     * 有負(fù)責(zé)均衡能力的RestTemplate
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate2() {
        return new RestTemplate();
    }
}

RestTemplate的使用:

package com.morris.user.controller;

import com.morris.user.entity.Order;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;

@RestController
@RequestMapping("user")
public class RestTemplateController {

    @Resource
    private RestTemplate restTemplate;

    @Resource
    private RestTemplate restTemplate2;

    @GetMapping("findOrderByUserId")
    public List<Order> findOrderByUserId(Long userId) {
        Order[] orders = restTemplate.getForObject("http://127.0.0.1:8020/order/findOrderByUserId?userId=", Order[].class, userId);
        return Arrays.asList(orders);
    }

    @GetMapping("findOrderByUserId2")
    public List<Order> findOrderByUserId2(Long userId) {
        Order[] orders = restTemplate2.getForObject("http://order-service/order/findOrderByUserId?userId=", Order[].class, userId);
        return Arrays.asList(orders);
    }
}

WebClient整合LoadBalancer

引入依賴webflux,WebClient位于webflux內(nèi):

<!-- LoadBalancer -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

<!-- webflux -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

<!-- nacos服務(wù)注冊與發(fā)現(xiàn) -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </exclusion>
    </exclusions>
</dependency>

同樣需要在配置文件中禁用ribbon:

spring:
  application:
    name: user-service

  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    # 不使用ribbon,使用loadbalancer
    loadbalancer:
      ribbon:
        enabled: false

使用@LoadBalanced注解修飾WebClient.Builder,開啟客戶端負(fù)載均衡功能

package com.morris.user.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;

@Configuration
public class WebClientConfig {

    @Bean
    WebClient.Builder webClientBuilder() {
        return WebClient.builder();
    }

    @Bean
    @LoadBalanced
    WebClient.Builder webClientBuilder2() {
        return WebClient.builder();
    }

}

WebClient負(fù)載均衡的使用:

package com.morris.user.controller;

import com.morris.user.entity.Order;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;

@RestController
@RequestMapping("user2")
public class WebClientController {

    @Resource
    private WebClient.Builder webClientBuilder;

    @Resource
    private WebClient.Builder webClientBuilder2;


    @GetMapping("findOrderByUserId1")
    public Mono<List<Order>> findOrderByUserId1(Long userId) {
        return webClientBuilder.build().get().uri("http://127.0.0.1:8020/order/findOrderByUserId?userId=" + userId)
                .retrieve().bodyToMono(Order[].class).map(t -> Arrays.asList(t));
    }

    @GetMapping("findOrderByUserId2")
    public Mono<List<Order>> findOrderByUserId2(Long userId) {
        return webClientBuilder2.build().get().uri("http://order-service/order/findOrderByUserId?userId=" + userId)
                .retrieve().bodyToMono(Order[].class).map(t -> Arrays.asList(t));
    }

}

原理:底層會使用ReactiveLoadBalancer

WebClient設(shè)置Filter實(shí)現(xiàn)負(fù)載均衡

與RestTemplate類似,@LoadBalanced注解的功能是通過SmartInitializingSingleton實(shí)現(xiàn)的。

SmartInitializingSingleton是在所有的bean都實(shí)例化完成之后才會調(diào)用的,所以在bean的實(shí)例化期間使用@LoadBalanced修飾的WebClient是不具備負(fù)載均衡作用的,比如在項目的啟動過程中要使用調(diào)用某個微服務(wù),此時WebClient是不具備負(fù)載均衡作用的。

可以通過手動為WebClient設(shè)置Filter實(shí)現(xiàn)負(fù)載均衡能力。

@Bean
WebClient.Builder webClientBuilder3(ReactorLoadBalancerExchangeFilterFunction lbFunction) {
    return WebClient.builder().filter(lbFunction);
}

到此這篇關(guān)于Spring負(fù)載均衡LoadBalancer使用詳解的文章就介紹到這了,更多相關(guān)Spring負(fù)載均衡LoadBalancer內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MyBatis使用接口映射的方法步驟

    MyBatis使用接口映射的方法步驟

    映射器是MyBatis中最核心的組件之一,本文主要介紹了MyBatis使用接口映射的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • SpringBoot?@Scheduled?Cron表達(dá)式使用方式

    SpringBoot?@Scheduled?Cron表達(dá)式使用方式

    這篇文章主要介紹了SpringBoot?@Scheduled?Cron表達(dá)式使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • springboot中@Value的工作原理說明

    springboot中@Value的工作原理說明

    這篇文章主要介紹了springboot中@Value的工作原理,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 一篇文章帶你入門Java之編程規(guī)范

    一篇文章帶你入門Java之編程規(guī)范

    這篇文章主要介紹了如何養(yǎng)成良好java代碼編碼規(guī)范,規(guī)范需要平時編碼過程中注意,是一個慢慢養(yǎng)成的好習(xí)慣,下面小編就帶大家來一起詳細(xì)了解一下吧
    2021-08-08
  • Java創(chuàng)建圖形用戶界面(GUI)入門詳細(xì)指南(Swing庫JFrame類)

    Java創(chuàng)建圖形用戶界面(GUI)入門詳細(xì)指南(Swing庫JFrame類)

    這篇文章主要介紹了使用Java?Swing庫的JFrame類創(chuàng)建基本的圖形用戶界面,包括窗口的創(chuàng)建、組件的添加和事件處理,通過代碼講解了如何設(shè)置窗口大小、添加按鈕及處理按鈕點(diǎn)擊事件,適合初學(xué)者學(xué)習(xí)和開發(fā)GUI應(yīng)用程序,需要的朋友可以參考下
    2024-11-11
  • springBoot+webMagic實(shí)現(xiàn)網(wǎng)站爬蟲的實(shí)例代碼

    springBoot+webMagic實(shí)現(xiàn)網(wǎng)站爬蟲的實(shí)例代碼

    這篇文章主要介紹了springBoot+webMagic實(shí)現(xiàn)網(wǎng)站爬蟲的實(shí)例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • SpringBoot多環(huán)境開發(fā)該如何配置

    SpringBoot多環(huán)境開發(fā)該如何配置

    這篇文章主要介紹了 SpringBoot多環(huán)境的開發(fā)配置詳情,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-09-09
  • org.slf4j.Logger中info()方法的使用詳解

    org.slf4j.Logger中info()方法的使用詳解

    這篇文章主要介紹了org.slf4j.Logger中info()方法的使用詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • IDEA連接mysql報錯的問題及解決方法

    IDEA連接mysql報錯的問題及解決方法

    這篇文章主要介紹了IDEA連接mysql報錯的問題及解決方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • java通過Callable和Future來接收線程池的執(zhí)行結(jié)果

    java通過Callable和Future來接收線程池的執(zhí)行結(jié)果

    這篇文章主要介紹了java通過Callable和Future來接收線程池的執(zhí)行結(jié)果,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08

最新評論

新安县| 清镇市| 临江市| 彭州市| 临海市| 嵊州市| 江都市| 南康市| 会昌县| 四子王旗| 钟山县| 彰化市| 广丰县| 慈溪市| 丰城市| 额敏县| 霸州市| 英德市| 农安县| 青龙| 南康市| 云南省| 绥化市| 牟定县| 石城县| 彝良县| 栖霞市| 盐亭县| 泾川县| 清丰县| 旅游| 文成县| 涡阳县| 浠水县| 太康县| 正定县| 原平市| 都兰县| 肥东县| 抚松县| 乐都县|