微服務之一:Eureka、Ribbon負載均衡

一:Eureka

  • Eureka是Netflix開發的服務發現框架,SpringCloud將它集成在自己的子項目spring-cloud-netflix中,實現SpringCloud的服務發現功能。Eureka包含兩個組件:Eureka Server和Eureka Client。
  • Eureka Client是一個java客戶端,用於簡化與Eureka Server的交互,客戶端同時也就別一個內置的、使用輪詢(round-robin)負載算法的負載均衡器。在應用啓動後,將會向Eureka Server發送心跳,默認週期爲30秒,如果Eureka Server在多個心跳週期內沒有
    接收到某個節點的心跳,Eureka Server將會從服務註冊表中把這個服務節點移除(默認90秒)。
  • Eureka Server之間通過複製的方式完成數據的同步,Eureka還提供了客戶端緩存機制,即使所有的Eureka Server都掛掉,客戶端依然可以利用緩存中的信息消費其他服務的API。綜上,Eureka通過心跳檢查、客戶端緩存等機制,確保了系統的高可用性、靈活性和可伸縮性。

1.1 依賴項

<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring‐cloud‐dependencies</artifactId>
			<version>Finchley.M9</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
		</dependencies>
</dependencyManagement>

<dependencies>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring‐cloud‐starter‐netflix‐eurekaserver</artifactId>
	</dependency>
</dependencies>

1.2 配置文件

server:
port: 6868 #服務端口
eureka:
client:
registerWithEureka: false #是否將自己註冊到Eureka服務中,本身就是所有無需
註冊
fetchRegistry: false #是否從Eureka中獲取註冊信息
serviceUrl: #Eureka客戶端與Eureka服務端進行交互的地址
defaultZone: http://127.0.0.1:${server.port}/eureka/

1.3 啓動類

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

啓動運行啓動類,然後在瀏覽器地址欄輸入 http://localhost:6868/ 運行效果

1.4 服務註冊

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring‐cloud‐starter‐netflix‐eurekaclient</
artifactId>
</dependency>
eureka:
client:
service‐url:
defaultZone: http://localhost:6868/eureka
@EnableEurekaClient
修改每個服務類的啓動類,添加註解@EnableEurekaClient

二:簡介

Ribbon負載均衡項目。
主要包括三個子模塊:
  1. ribbon-core:核心,主要負責均衡器接口定義、客戶端接口定義、內置的負載均衡實現等API
  2. ribbon-eureka:爲Eureka客戶端提供的負載均衡實現類
  3. ribbon-httpclient:對Apache的HttpClient進行封裝,提供含有負載均衡功能的REST客戶端

1.1負載均衡器組件

負載均衡器需要提供以下的功能:
  1. 維護服務器的IP、DNS名稱等信息
  2. 根據特定的邏輯在服務列表中循環

爲了實現以上的基本功能,Ribbon的負載均衡器有以下三個大子模塊
3. Rule:一個邏輯組件,這些邏輯將會決定從服務器列表中返回哪個服務器實實例
4. Ping: 該組件主要使用定時器來確保服務器網絡可以連接
5. ServerList:服務器列表,可以通過靜態的配置確定負載的服務器,也可以動態制定服務器列表。

1.2 Ribbon負載均衡機制

Ribbon提供了幾個負載均衡的組件,爲了讓請求轉給合適的服務器處理

1.2.1 負載均衡器

Ribbon的負載均衡器藉口定義了服務器的操作,主要的目的用於進行服務器選擇

eg:BaseLoadBalancer

1.2.2 自定義負載規則

如果想自定義負載均衡規定,需要編寫一個IRule接口的實現類

 public class MyRule implements IRule{

}

1.2.3 Ribbon自帶的負載規則

  1. RoundRobinRule:系統默認的規則,通過簡單的輪詢服務列表來選擇服務器,其他規則在很多情況下仍使用RoundRobinRule
  2. AvailabilityFilteringRule: 該規則會忽略以下的服務器
  • 無法連接的服務器
  • 併發數過高的服務器

1.2.4ping機制

在負載均衡器中,提供了 Ping 機制,每隔一段時間,會去 Ping 服務器,判斷服務器是否存活,該工作由 com.netflix.loadbalancer.IPing 接口的實現類負責,如果單獨使用 Ribbon 默認情況下不會激活 Ping 機制,默認的實現類爲 DummyPing(不驗證)

package org.lixue.ribbon.client;

   

import com.netflix.loadbalancer.IPing;

import com.netflix.loadbalancer.Server;

   

public class MyPing implements IPing{

public boolean isAlive(Serverserver){

System.out.println("isAlive"+server.getHostPort());

return true;

}

}

修改 src/main/resources 目錄下的 ribbon-client.properties 配置如下:

#配置服務器列表

MyRibbonClient.ribbon.listOfServers=localhost:8080,localhost:8002

#配置負載均衡規則IRule的實現類

MyRibbonClient.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.WeightedResponseTimeRule

#配置負載均衡實現類

MyRibbonClient.ribbon.NFLoadBalancerClassName=com.netflix.loadbalancer.ZoneAwareLoadBalancer

#配置IPing的實現類

MyRibbonClient.ribbon.NFLoadBalancerPingClassName=org.lixue.ribbon.client.MyPing

#配置Ping操作的間隔

MyRibbonClient.ribbon.NFLoadBalancerPingInterval=2

加入@LoadBalanced註解口,一個RestTemplate實例就具有了負載均衡能力

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章