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

SpringCloud之 LoadBalancer和Feign負載均衡

這篇具有很好參考價值的文章主要介紹了SpringCloud之 LoadBalancer和Feign負載均衡。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


提示:以下是本篇文章正文內(nèi)容,SpringCloud 系列學習將會持續(xù)更新

blockingloadbalancerclient,SpringCloud,spring cloud,負載均衡,LoadBalancer,OpenFeign

LoadBalancer 負載均衡

前面我們講解了如何對服務進行拆分、如何通過 Eureka 服務器進行服務注冊與發(fā)現(xiàn),那么現(xiàn)在我們來看看,它的負載均衡到底是如何實現(xiàn)的,實際上之前演示的負載均衡是依靠 LoadBalancer 實現(xiàn)的。

在2020年前的 SpringCloud 版本是采用 Ribbon 作為負載均衡實現(xiàn),但是2020年的版本之后SpringCloud 把 Ribbon 移除了,進而用自己編寫的 LoadBalancer 替代。

那么,負載均衡是如何進行的呢?

一、@LoadBalanced 負載均衡

我們之前注冊 RestTemplate 時,就用 @LoadBalanced 注解進行了修飾:

@Configuration
public class BeanConfiguration {
    @Bean
    @LoadBalanced // 負載均衡
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}
// User user = this.template.getForObject("http://userservice/user/"+uid, User.class);

??①觀察負載均衡現(xiàn)象

a. 我們有2個 UserApplication 的實例,可以在控制層的某個服務調(diào)用代碼中添加日志打?。?code>當前實例的IP:PORT

@RestController
@Slf4j
public class UserController {
    @Resource
    private UserService userService;
    @Resource
    Environment environment; // org.springframework.core.env.Environment

    @GetMapping("/user/{uid}")
    public User findUserById(@PathVariable("uid") int uid) throws UnknownHostException {
        String hostIp = InetAddress.getLocalHost().getHostAddress();
        String port = environment.getProperty("server.port");
        log.info(hostIp + ":" + port + " 的findUserById()被訪問了!");
        return userService.getUserById(uid);
    }
}

b. 然后重新啟動。我們多次訪問http://localhost:8082/borrow/3,其中 BorrowService 就會進行遠程調(diào)用 UserService,這時我們通過查看 UserApplication-1 和 UserApplication-2 的控制臺日志,就可以發(fā)現(xiàn)它們是被輪循調(diào)用的。
blockingloadbalancerclient,SpringCloud,spring cloud,負載均衡,LoadBalancer,OpenFeign
blockingloadbalancerclient,SpringCloud,spring cloud,負載均衡,LoadBalancer,OpenFeign
blockingloadbalancerclient,SpringCloud,spring cloud,負載均衡,LoadBalancer,OpenFeign
blockingloadbalancerclient,SpringCloud,spring cloud,負載均衡,LoadBalancer,OpenFeign
這樣,服務自動發(fā)現(xiàn)以及簡單的負載均衡就實現(xiàn)完成了,并且,如果某個微服務掛掉了,只要存在其他同樣的微服務實例在運行,那么就不會導致整個微服務不可用,極大地保證了安全性。


??②@LoadBalanced 源碼剖析

實際上,在添加 @LoadBalanced 注解之后,會啟用LoadBalancerInterceptor攔截器對我們發(fā)起的服務調(diào)用請求進行攔截(只針對我們發(fā)起的請求)。

它實現(xiàn)ClientHttpRequestInterceptor接口:

@FunctionalInterface
public interface ClientHttpRequestInterceptor {
    ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException;
}

LoadBalancerInterceptor類對 intercept()方法 的實現(xiàn):

public ClientHttpResponse intercept(final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException {
    URI originalUri = request.getURI();
    String serviceName = originalUri.getHost();
    Assert.state(serviceName != null, "Request URI does not contain a valid hostname: " + originalUri);
    return (ClientHttpResponse)this.loadBalancer.execute(serviceName, this.requestFactory.createRequest(request, body, execution));
}

我們可以打個斷點看看實際是怎么在執(zhí)行的,可以看到:
blockingloadbalancerclient,SpringCloud,spring cloud,負載均衡,LoadBalancer,OpenFeign
服務端會在發(fā)起請求時執(zhí)行這些攔截器。它們會去找 Eureka 獲取真正需要訪問的主機名稱

我們來看看BlockingLoadBalancerClient類對 loadBalancer.execute()方法 的具體實現(xiàn):

//從上面給進來了服務的名稱和具體的請求實體
public <T> T execute(String serviceId, LoadBalancerRequest<T> request) throws IOException {
    String hint = this.getHint(serviceId);
    LoadBalancerRequestAdapter<T, DefaultRequestContext> lbRequest = new LoadBalancerRequestAdapter(request, new DefaultRequestContext(request, hint));
    Set<LoadBalancerLifecycle> supportedLifecycleProcessors = this.getSupportedLifecycleProcessors(serviceId);
    supportedLifecycleProcessors.forEach((lifecycle) -> {
        lifecycle.onStart(lbRequest);
    });
  	//可以看到在這里會調(diào)用choose方法自動獲取對應的服務實例信息
    ServiceInstance serviceInstance = this.choose(serviceId, lbRequest);
    if (serviceInstance == null) {
        supportedLifecycleProcessors.forEach((lifecycle) -> {
            lifecycle.onComplete(new CompletionContext(Status.DISCARD, lbRequest, new EmptyResponse()));
        });
      	//沒有發(fā)現(xiàn)任何此服務的實例就拋異常(之前的測試中可能已經(jīng)遇到了)
        throw new IllegalStateException("No instances available for " + serviceId);
    } else {
      	//成功獲取到對應服務的實例,這時就可以發(fā)起HTTP請求獲取信息了
        return this.execute(serviceId, serviceInstance, lbRequest);
    }
}

所以,實際上在進行負載均衡的時候,會向 Eureka 發(fā)起請求,選擇一個可用的對應服務,然后會返回此服務的主機地址等信息:
blockingloadbalancerclient,SpringCloud,spring cloud,負載均衡,LoadBalancer,OpenFeign

回到目錄…

二、自定義負載均衡

LoadBalancer 默認提供了兩種負載均衡策略:

  • RandomLoadBalancer - 隨機分配策略
  • RoundRobinLoadBalancer - (默認)輪詢分配策略

現(xiàn)在我們希望修改默認的負載均衡策略,可以進行指定,比如我們現(xiàn)在希望用戶服務采用隨機分配策略。

①我們需要先創(chuàng)建隨機分配策略的配置類(不用加@Configuration):

public class LoadBalancerConfig {
  	//將官方提供的 RandomLoadBalancer 注冊為Bean
    @Bean
    public ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory){
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
    }
}

②接著我們需要為對應的服務指定負載均衡策略,直接使用注解即可:

@Configuration
// 指定只要是 userservice 服務,都會使用我們指定的策略 LoadBalancerConfig
@LoadBalancerClient(value = "userservice", configuration = LoadBalancerConfig.class)
public class BeanConfiguration {
    @Bean
    @LoadBalanced // 負載均衡
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

接著我們在BlockingLoadBalancerClient中添加斷點,觀察是否采用我們指定的策略進行請求:
blockingloadbalancerclient,SpringCloud,spring cloud,負載均衡,LoadBalancer,OpenFeign
blockingloadbalancerclient,SpringCloud,spring cloud,負載均衡,LoadBalancer,OpenFeign
發(fā)現(xiàn)訪問 userservice 服務的策略已經(jīng)更改為我們指定的策略了。

回到目錄…

三、OpenFeign 實現(xiàn)負載均衡

官方文檔:https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/

  • Feign 是?個聲明式的 HTTP 客戶端組件,它旨在是編寫 Http 客戶端變得更加容易。
  • OpenFeign 同時集成了 Spring Cloud LoadBalancerSpring Cloud CircuitBreaker,提供負載均衡熔斷降級的功能。
  • Feign 默認的負載均衡策略是輪詢調(diào)用

??①添加依賴

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

??②啟動類添加 @EnableFeignClients

@SpringBootApplication
@EnableFeignClients
public class BorrowApplication {
    public static void main(String[] args) {
        SpringApplication.run(BorrowApplication.class, args);
    }
}

那么現(xiàn)在我們需要調(diào)用其他微服務提供的接口,該怎么做呢?

??③創(chuàng)建客戶端接口 UserClient

我們的客戶端接口需要用 @FeignClient 注解來指定向哪個微服務發(fā)送 HTTP 請求。

@FeignClient("userservice")   //聲明為 userservice 服務的 HTTP 請求客戶端
public interface UserClient {
}

我們之前的遠程調(diào)用:

RestTemplate template = new RestTemplate();
User user = template.getForObject("http://userservice/user/"+uid, User.class);

現(xiàn)在直接在客戶端接口中寫入控制層的方法:

@FeignClient("userservice")
public interface UserClient {
  	//路徑保證和其他微服務提供的一致即可
    @RequestMapping("/user/{uid}")
    User getUserById(@PathVariable("uid") int uid);  //參數(shù)和返回值也保持一致
}

??④service業(yè)務中調(diào)用客戶端接口

我們直接注入使用(有 Mybatis 那味了):

@Service
public class BorrowServiceImpl implements BorrowService {
    @Resource
    private BorrowMapper borrowMapper;
    @Resource
    private UserClient userClient;
    @Resource
    private BookClient bookClient;

    @Override
    public UserBorrowView getBorrowViewByUid(int uid) {
        // 現(xiàn)在拿到借閱關(guān)聯(lián)信息了,怎么調(diào)用其他服務獲取信息呢?
        List<Borrow> borrowList = borrowMapper.getBorrowsByUid(uid);
        // 直接調(diào)用客戶端接口的方法
        User user = userClient.findUserById(uid);
        List<Book> bookList = borrowList
                .stream()
                .map(b -> bookClient.findBookById(b.getBid()))
                .collect(Collectors.toList());
        return new UserBorrowView(user, bookList);
    }
}

繼續(xù)訪問進行測試:
blockingloadbalancerclient,SpringCloud,spring cloud,負載均衡,LoadBalancer,OpenFeign
OK,正常。

當然,F(xiàn)eign 也有很多的其他配置選項,這里就不多做介紹了,詳細請查閱官方文檔。

回到目錄…


總結(jié):
提示:這里對文章進行總結(jié):
本文是對SpringCloud的學習, 了解了LoadBalancer 負載均衡策略的內(nèi)部流程,學習了如何自定義負載均衡策略,并且學習了使用OpenFeign實現(xiàn)負載均衡。之后的學習內(nèi)容將持續(xù)更新?。?!
文章來源地址http://www.zghlxwxcb.cn/news/detail-699614.html

到了這里,關(guān)于SpringCloud之 LoadBalancer和Feign負載均衡的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • SpringCloud - 新版淘汰 Ribbon,在 OpenFeign 中整合 LoadBalancer 負載均衡

    SpringCloud - 新版淘汰 Ribbon,在 OpenFeign 中整合 LoadBalancer 負載均衡

    目錄 一、LoadBalancer 負載均衡 1.1、前言 1.2、LoadBalancer 負載均衡底層實現(xiàn)原理 二、整合 OpenFeign + LoadBalancer 2.1、所需依賴 2.2、具體實現(xiàn) ?2.3、自定義負載均衡策略 在 2020 年以前的 SpringCloud 采用 Ribbon 作為負載均衡,但是 2020 年之后,SpringCloud 吧 Ribbon 移除了,而是使用自己編

    2024年02月03日
    瀏覽(22)
  • SpringCloud學習—Feign負載均衡

    Feign是聲明式Web Service客戶端,它讓微服務之間的調(diào)用變得更簡單,類似controller調(diào)用service。SpringCloud集成了Ribbon和Eureka,可以使用Feigin提供負載均衡的http客戶端 只需要創(chuàng)建一個接口,然后添加注解即可。使用接口方式調(diào)用服務 Feign,主要是社區(qū)版,大家都習慣面向接口編程。

    2024年02月15日
    瀏覽(21)
  • SpringCloud Alibaba集成 Gateway(自定義負載均衡器)、Nacos(配置中心、注冊中心)、Loadbalancer

    SpringCloud Alibaba集成 Gateway(自定義負載均衡器)、Nacos(配置中心、注冊中心)、Loadbalancer

    路由(route):路由是網(wǎng)關(guān)最基礎(chǔ)的部分,路由信息由一個ID,一個目的URL、一組斷言工廠和一 組Filter組成。如果斷言為真,則說明請求URL和配置的路由匹配。 斷言(Predicate):Java8中的斷言函數(shù),Spring Cloud Gateway中的斷言函數(shù)輸入類型是 Spring5.0框架中的ServerWebExchange。Sprin

    2024年04月12日
    瀏覽(91)
  • 【SpringCloud Alibaba】Nacos服務管理與Feign負載均衡

    【SpringCloud Alibaba】Nacos服務管理與Feign負載均衡

    目錄 一、微服務搭建 1.1 服務提供者與服務消費者 1.2 依賴關(guān)系 ? 二、服務注冊與負載均衡使用 2.1 Nacos 實現(xiàn)服務的注冊與發(fā)現(xiàn) 2.2 Loadbalancer負載均衡、Feign聲明式服務調(diào)用 2.3 示例綜合實現(xiàn) 2.3.1 服務注冊與發(fā)現(xiàn)測試 2.3.2 負載均衡測試? 服務提供者 服務的被調(diào)用方(即:為其他微

    2024年02月03日
    瀏覽(23)
  • 【SpringCloud Alibaba】(四)使用 Feign 實現(xiàn)服務調(diào)用的負載均衡

    【SpringCloud Alibaba】(四)使用 Feign 實現(xiàn)服務調(diào)用的負載均衡

    在上一文中,我們實現(xiàn)了服務的自動注冊與發(fā)現(xiàn)功能。但是還存在一個很明顯的問題:如果用戶微服務和商品微服務在服務器上部署多份的話,之前的程序無法實現(xiàn)服務調(diào)用的負載均衡功能。 本文就帶著大家一起實現(xiàn)服務調(diào)用的負載均衡功能 負載均衡:將原本由一臺服務器

    2024年02月15日
    瀏覽(28)
  • 微服務springcloud 06.feign框架,配合ribbon 負載均衡和重試,配合hystrix 降級,監(jiān)控和熔斷測試

    微服務springcloud 06.feign框架,配合ribbon 負載均衡和重試,配合hystrix 降級,監(jiān)控和熔斷測試

    feign是ribbon +hystrix 的整合 01.新建 sp09-feign 項目 第一步: 第二步:選擇依賴: pom.xml 需要添加 sp01-commons 依賴: 第三步:修改sp09-feign項目的application.yml 第四步:sp09-feign的主程序添加 @EnableDiscoveryClient 和 @EnableFeignClients 02.feign 聲明式客戶端 第一步:聲明三個代理接口 這里的

    2024年02月10日
    瀏覽(22)
  • springcloud五大組件:Eureka:注冊中心、Zuul:服務網(wǎng)關(guān)、Ribbon:負載均衡、Feign:服務調(diào)用、Hystix:熔斷器

    Eureka是Netflix開發(fā)的服務發(fā)現(xiàn)框架,本身是一個基于REST的服務,主要用于定位運行在AWS域中的中間層服務,以達到負載均衡和中間層服務故障轉(zhuǎn)移的目的。 SpringCloud將它集成在其子項目spring-cloud-netflix中,以實現(xiàn)SpringCloud的服務發(fā)現(xiàn)功能。 Eureka包含兩個組件:Eureka Server和Eure

    2024年04月10日
    瀏覽(22)
  • 負載均衡 LoadBalancer

    負載均衡 負載均衡一般分為 服務端負載均衡 和 客戶端負載均衡 服務端負載均衡: 指在服務器端進行負載均衡的策略。在這種策略下,負載均衡器位于服務器端(如 Nginx),當客戶端發(fā)起服務調(diào)用時,根據(jù)服務器的負載情況,將請求分發(fā)到不同的服務器上,以實現(xiàn)請求的均

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

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

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

    2024年02月09日
    瀏覽(29)
  • 微服務之LoadBalancer負載均衡服務調(diào)用

    微服務之LoadBalancer負載均衡服務調(diào)用

    LB,既負載均衡(Load Balancer),是高并發(fā)、高可用系統(tǒng)必不可少的關(guān)鍵組件,其目標是盡力將網(wǎng)絡流量平均分發(fā)到多個服務器上,以提高系統(tǒng)整體的響應速度和可用性。 負載均衡的主要作用 高并發(fā) :負載均衡通過算法調(diào)整負載,盡力均勻的分配應用集群中的各結(jié)點的工作量。

    2024年04月15日
    瀏覽(20)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包