首頁 > 軟體

SpringCloud筆記(Hoxton)Netflix之Ribbon負載均衡範例程式碼

2022-06-01 14:01:35

Ribbon使用

  • Ribbon是管理HTTP和TCP服務使用者端的負載均衡器,Ribbon具有一系列帶有名稱的使用者端(Named Client),也就是帶有名稱的Ribbon使用者端(Ribbon Client)。
  • 每個使用者端由可設定的元件構成,負責一類服務的呼叫請求。SpringCloud通RibbonClientConfiguration 為每個Ribbon使用者端建立ApplicationContext上下文來進行元件裝配。Ribbon作為SpringCloud的負載均衡機制的實現,可以與OpenFeign和RestTemplate進行無縫對接,讓二者具有負載均衡的能力。

負載均衡

  • 當系統面臨大量的使用者存取,負載過高的時候,通常會增加伺服器數量來進行橫向擴充套件,多個伺服器的負載需要均衡,以免出現伺服器負載不均衡,部分伺服器負載較大,部分伺服器負載較小的情況 通過負載均衡,使得叢集中伺服器的負載保持在穩定高效的狀態,從而提高整個系統的處理能力。
  • 系統的負載均衡分為軟體負載均衡和硬體負載均衡,軟體負載均衡使用獨立的負載均衡程式或系統自帶的負載均衡模組完成對請求的分配派發,硬體負載均衡通過特殊的硬體裝置進行負載均衡的調配。
  • 軟負載均衡一般分為兩種型別,基於DNS負載均衡和基於IP的負載均衡。利用DNS 實現負載均衡,就是在DNS伺服器設定多個A記錄,不同的 DNS請求解析到不同IP地址。基於IP的負載均衡根據請求的IP 行負載均衡,LVS就是具有代表性的基於IP負載均衡實現。
  • Ribbon使用的是使用者端負載均衡,使用者端負載均衡和伺服器端負載均衡最大的區別在於伺服器端地址列表的儲存位置,在使用者端負載均衡中,所有的使用者端節點都有一份自己要存取的伺服器端地址列表,這些列表統統都是從服務註冊中心獲取的;而在伺服器端負載均衡中,使用者端節點只知道單一服務代理的地址,服務代理則知道所有伺服器端的地址。在SpringCloud中我們如果想要使用使用者端負載均衡,可以使用@LoadBalanced註解,這樣使用者端在發起請求的時候會根據負載均衡策略從伺服器端列表中選擇一個伺服器端,向該伺服器端發起網路請求,從而實現負載均衡。

程式碼範例

註冊中心

這裡是Eureka作為服務註冊中心,為OpenFeign提供伺服器端資訊的獲取,比如說服務的IP地址和埠,使用前面搭建好的專案(eureka-server)。

Provider

在idea中新建兩個專案執行主類,選擇前面建立好的專案(eureka-provider)。

設定不同執行主類,使用不同埠號,然後啟動三個不同埠號的provider。

介面實現

呼叫不同的伺服器端,會返回對應伺服器端的介面。

@RestController
@RequestMapping("/api")
public class PoroviderController {

    @Value("${server.port}")
    private String serverPort;

    @PostMapping("/sayHello")
    public String sayHello(String name) {
        return "我是伺服器端" + serverPort + ",你好" + name;
    }
}

Consumer

新建一個spring-boot工程,取名為consumer-ribbon,在pom檔案引入ribbon需要的依賴。

新增依賴

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

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

設定埠、註冊中心等

server:
  port: 8091
  servlet:
    context-path: /ribbon
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
  instance:
    status-page-url-path: ${server.servlet.context-path}/info
    health-check-url-path: ${server.servlet.context-path}/health
spring:
  application:
    name: consumer-ribbon
  • 負載均衡策略 SpringCloud為使用者端負載均衡建立了特定的註解@LoadBalanced,我們只需要使用該註解修飾建立RestTemplate範例的@Bean函數,SpringCloud就會讓RestTemplate使用相關的負載均衡策略,預設情況下使用Ribbon。
  • 除了@LoadBalanced之外,Ribbon還提供@RibbonClient註解。該註解可以為Ribbon使用者端宣告名稱和自定義設定。 name屬性可以設定使用者端的名稱, configuration屬性則會設定Ribbon相關的自定義配 類。
@Configuration
public class RestTemplateConfig {

    /**
     * @return org.springframework.web.client.RestTemplate
     * @description 注入一個可以進行負載均衡的RestTemple用於服務問呼叫
     * @author fengfan
     * @date 2022/5/18 14:43
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

}

yml設定負載均衡策略

# 設定的方式設定Ribbon的負載均衡策略
EUREKA-PROVIDER: # 設定服務提供方的應用名稱
  ribbon:
    NFloadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 策略類(全路徑名)

程式碼方式設定負載均衡策略

@Configuration
public class RibbonConfig {

    /**
     * @return com.netflix.loadbalancer.IRule
     * @description 設定隨機負載策略
     * @author fengfan
     * @date 2022/5/20 16:04
     */
    @Bean
    public IRule iRule(){
        return new RandomRule();
    }
}

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "consumer-ribbon", configuration = RibbonConfig.class)
public class ConsumerRibbonApplication {

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

}

使用者端呼叫實現

@RestController
@RequestMapping("/api")
public class ConsumerRibbonController {
    @Resource
    private RestTemplate restTemplate;

    @PostMapping("/getServerInfo")
    public String getServerInfo(){
        MultiValueMap<String, String> body = new LinkedMultiValueMap<>();
        body.add("name", "consumer8081");
        ResponseEntity<String> responseEntity = restTemplate.postForEntity("http://EUREKA-PROVIDER/provider/api/sayHello", body, String.class);
        return responseEntity.getBody();
    }
}

測試

多次請求的伺服器端,埠隨機變化,證明設定成功。

到此這篇關於SpringCloud筆記(Hoxton)Netflix之Ribbon負載均衡範例程式碼的文章就介紹到這了,更多相關SpringCloud Ribbon負載均衡內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com