Zuul和Eureka進行負載均衡的示例

1.概述

在本文中,我們將研究Zuul和Eureka的負載平衡方式。

我們將通過Zuul Proxy將請求路由到Spring Cloud Eureka發現的REST服務

2.初始設置

我們需要設置Spring Cloud Netflix-Eureka一文中所示的Eureka server/client

3.配置Zuul

Zuul除其他外,還從Eureka服務位置獲取並進行服務器端負載平衡。

3.1。 Maven配置

首先,我們將Zuul ServerEureka dependency項添加到我們的pom.xml:

<dependency>

 <groupId>org.springframework.cloud</groupId>

 <artifactId>spring-cloud-starter-netflix-zuul</artifactId>

 </dependency>

 <dependency>

 <groupId>org.springframework.cloud</groupId>

 <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>

 </dependency>

3.2 Eureka的溝通

其次,我們將在Zuul的application.properties文件中添加必要的屬性:

server.port=8762

 spring.application.name=zuul-server

 eureka.instance.preferIpAddress=true

 eureka.client.registerWithEureka=true

 eureka.client.fetchRegistry=true

 eureka.client.serviceUrl.defaultZone=${EUREKA_URI:http://localhost:8761/eureka}

在這裡,我們告訴Zuul將自己註冊為Eureka服務,並在8762端口上運行。

接下來,我們將使用@EnableZuulProxy@EnableDiscoveryClient. @EnableZuulProxy實現main class @EnableZuulProxy@EnableDiscoveryClient. @EnableZuulProxy表示為Zuul服務器, @EnableDiscoveryClient表示為Eureka客戶端:

@SpringBootApplication

 @EnableZuulProxy

 @EnableDiscoveryClient

 public class ZuulConfig {

 public static void main(String[] args) {

 SpringApplication.run(ZuulConfig.class, args);

 }

 }

我們將瀏覽器指向http://localhost:8762/routes 。這應該顯示由Eureka:發現的all the routes available for Zuul Eureka:

{"/spring-cloud-eureka-client/**":"spring-cloud-eureka-client"}

現在,我們將使用獲得的Zuul代理路由與Eureka客戶端進行通信。將我們的瀏覽器指向http://localhost:8762/spring-cloud-eureka-client/greeting應該會生成如下響應:

Hello from 'SPRING-CLOUD-EUREKA-CLIENT with Port Number 8081'!

4.通過Zuul進行負載平衡

Zuul收到請求後,將選擇可用的物理位置之一併將請求轉發到實際服務實例。開箱即用地提供了緩存服務實例位置並將請求轉發到實際位置的整個過程,而無需其他配置。

在這裡,我們可以看到Zuul如何封裝同一服務的三個不同實例:

Zuul和Eureka進行負載均衡的示例

在內部,Zuul使用Netflix Ribbon從服務發現(Eureka Server)中查找服務的所有實例。

讓我們觀察當啟動多個實例時的這種行為。

4.1。註冊多個實例

我們將從運行兩個實例(8081和8082端口)開始。

一旦所有實例啟動,我們就可以在日誌中觀察到實例的物理位置已在DynamicServerListLoadBalancer中註冊,並且路由已映射到Zuul Controller ,該Zuul Controller負責將請求轉發到實際實例:

Mapped URL path [/spring-cloud-eureka-client/**] onto handler of type [class org.springframework.cloud.netflix.zuul.web.ZuulController]

 Client:spring-cloud-eureka-client instantiated a LoadBalancer:

 DynamicServerListLoadBalancer:{NFLoadBalancer:name=spring-cloud-eureka-client,

 current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:null

 Using serverListUpdater PollingServerListUpdater

 DynamicServerListLoadBalancer for client spring-cloud-eureka-client initialized:

 DynamicServerListLoadBalancer:{NFLoadBalancer:name=spring-cloud-eureka-client,

 current list of Servers=[0.0.0.0:8081, 0.0.0.0:8082],

 Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone;
 Instance count:2;


 Active connections count: 0;
 Circuit breaker tripped count: 0;


 Active connections per server: 0.0;]},

 Server stats:

 [[Server:0.0.0.0:8080;
 Zone:defaultZone;......],

 [Server:0.0.0.0:8081;
 Zone:defaultZone; ......],

注意:日誌經過格式化以提高可讀性。

4.2。負載均衡示例

讓我們將瀏覽器導航到http:// localhost:8762 / spring-cloud-eureka-client /問候幾次。

每次,我們應該看到略有不同的結果:

Hello from 'SPRING-CLOUD-EUREKA-CLIENT with Port Number 8081'!
Hello from 'SPRING-CLOUD-EUREKA-CLIENT with Port Number 8082'!
Hello from 'SPRING-CLOUD-EUREKA-CLIENT with Port Number 8081'!

Zuul收到的每個請求都將以循環方式轉發到其他實例。

如果我們啟動另一個實例並在Eureka中註冊,Zuul將自動註冊它並開始向其轉發請求:

Hello from 'SPRING-CLOUD-EUREKA-CLIENT with Port Number 8083'!

我們還可以將Zuul的負載均衡策略更改為任何其他Netflix Ribbon策略-有關此問題的更多信息,請參見我們的Ribbon文章。

5.結論

如我們所見,Zuul為Rest Service的所有實例提供一個URL,並進行負載均衡以將請求以循環方式轉發到其中一個實例。

與往常一樣,可以在GitHub上找到本文的完整代碼。