SpringCloud Zuul和Gateway的實(shí)例代碼(搭建方式)
一、 Spring Cloud Zuul和Spring Cloud Gateway是什么
Spring Cloud Zuul和Spring Cloud Gateway都是Spring Cloud框架提供的用于構(gòu)建微服務(wù)架構(gòu)中的API網(wǎng)關(guān)的組件。
- Spring Cloud Zuul:Spring Cloud Zuul是基于Netflix Zuul構(gòu)建的微服務(wù)網(wǎng)關(guān)組件。它提供了路由、負(fù)載均衡、容錯(cuò)、安全性等功能。Zuul使用同步阻塞模型,適用于較小規(guī)模的微服務(wù)架構(gòu)。然而,需要注意的是,Spring Cloud Zuul目前已經(jīng)進(jìn)入維護(hù)模式,Spring Cloud官方推薦使用Spring Cloud Gateway作為替代方案。
- Spring Cloud Gateway:Spring Cloud Gateway是Spring Cloud官方推薦的API網(wǎng)關(guān)解決方案。它基于Spring Framework 5和Project Reactor構(gòu)建,并采用異步非阻塞模型,具有更高的性能和吞吐量。Spring Cloud Gateway提供了動(dòng)態(tài)路由、過(guò)濾器鏈、集成服務(wù)發(fā)現(xiàn)、斷路器等功能特性,同時(shí)支持Java和函數(shù)式編程的API,具有更高級(jí)的定制和擴(kuò)展能力。
這兩個(gè)組件都可以用于構(gòu)建微服務(wù)架構(gòu)中的API網(wǎng)關(guān),它們的選擇取決于具體的需求和場(chǎng)景。
如果需要更高的性能、更靈活的定制能力以及與Spring生態(tài)系統(tǒng)更好的集成,推薦使用Spring Cloud Gateway。
如果已經(jīng)在使用Netflix的生態(tài)系統(tǒng)組件,并且對(duì)性能要求不是特別高,可以考慮使用Spring Cloud Zuul。
二、Spring Cloud Zuul的簡(jiǎn)單示例
- 創(chuàng)建一個(gè)Spring Boot項(xiàng)目并添加依賴:在你的項(xiàng)目中創(chuàng)建一個(gè)新的Spring Boot應(yīng)用程序,并添加以下依賴。如果你使用的是Maven,可以在pom.xml文件中添加以下依賴:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>- 啟用Zuul網(wǎng)關(guān):在你的Spring Boot應(yīng)用程序的主類上添加@EnableZuulProxy注解,以啟用Zuul網(wǎng)關(guān)。例如:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@SpringBootApplication
@EnableZuulProxy
public class YourApplication {
public static void main(String[] args) {
SpringApplication.run(YourApplication.class, args);
}
}- 配置Zuul路由規(guī)則:在application.properties或application.yml文件中配置Zuul的路由規(guī)則。例如,以下是一個(gè)將/api/**路徑下的請(qǐng)求轉(zhuǎn)發(fā)到http://example.com/api/**的示例配置:
zuul:
routes:
example-service:
path: /api/**
url: http://example.com/api在上面的示例中,example-service是一個(gè)自定義的路由名稱,path指定了匹配的路徑模式,url指定了要轉(zhuǎn)發(fā)到的目標(biāo)URL。
- 運(yùn)行應(yīng)用程序并訪問(wèn)Zuul網(wǎng)關(guān):啟動(dòng)你的應(yīng)用程序,并使用Zuul網(wǎng)關(guān)轉(zhuǎn)發(fā)請(qǐng)求。例如,如果你的應(yīng)用程序運(yùn)行在http://localhost:8080,你可以發(fā)送一個(gè)請(qǐng)求到http://localhost:8080/api/example,該請(qǐng)求將被Zuul網(wǎng)關(guān)轉(zhuǎn)發(fā)到http://example.com/api/example。
這就是一個(gè)使用Zuul網(wǎng)關(guān)的簡(jiǎn)單示例。
通過(guò)配置不同的路由規(guī)則,你可以實(shí)現(xiàn)請(qǐng)求的轉(zhuǎn)發(fā)、負(fù)載均衡、路由過(guò)濾等功能。
你還可以添加自定義的過(guò)濾器來(lái)對(duì)請(qǐng)求和響應(yīng)進(jìn)行處理。
請(qǐng)注意,Zuul目前已被Spring Cloud宣布為不推薦使用,建議使用Spring Cloud Gateway作為替代方案。
三、Spring Cloud Gateway(推薦使用)的簡(jiǎn)單示例
- 創(chuàng)建一個(gè)Spring Boot項(xiàng)目并添加依賴:在你的項(xiàng)目中創(chuàng)建一個(gè)新的Spring Boot應(yīng)用程序,并添加以下依賴。如果你使用的是Maven,可以在pom.xml文件中添加以下依賴:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>- 配置Spring Cloud Gateway路由規(guī)則:在application.properties或application.yml文件中配置Spring Cloud Gateway的路由規(guī)則。例如,以下是一個(gè)將/api/**路徑下的請(qǐng)求轉(zhuǎn)發(fā)到http://example.com/api/**的示例配置:
spring:
cloud:
gateway:
routes:
- id: example-service
uri: http://example.com/api
predicates:
- Path=/api/**在上面的示例中,example-service是一個(gè)自定義的路由ID,uri指定了要轉(zhuǎn)發(fā)到的目標(biāo)URL,predicates指定了匹配的路徑模式。
- 運(yùn)行應(yīng)用程序并訪問(wèn)Spring Cloud Gateway:啟動(dòng)你的應(yīng)用程序,并使用Spring Cloud Gateway轉(zhuǎn)發(fā)請(qǐng)求。例如,如果你的應(yīng)用程序運(yùn)行在http://localhost:8080,你可以發(fā)送一個(gè)請(qǐng)求到http://localhost:8080/api/example,該請(qǐng)求將被Spring Cloud Gateway轉(zhuǎn)發(fā)到http://example.com/api/example。
- 添加自定義過(guò)濾器(可選):你可以添加自定義的過(guò)濾器來(lái)對(duì)請(qǐng)求和響應(yīng)進(jìn)行處理。例如,你可以創(chuàng)建一個(gè)實(shí)現(xiàn)GlobalFilter接口的自定義過(guò)濾器類,并在應(yīng)用程序中進(jìn)行注冊(cè)。過(guò)濾器可以用于鑒權(quán)、日志記錄、請(qǐng)求轉(zhuǎn)換等操作。運(yùn)行應(yīng)用程序并訪問(wèn)Zuul網(wǎng)關(guān):?jiǎn)?dòng)你的應(yīng)用程序,并使用Zuul網(wǎng)關(guān)轉(zhuǎn)發(fā)請(qǐng)求。例如,如果你的應(yīng)用程序運(yùn)行在http://localhost:8080,你可以發(fā)送一個(gè)請(qǐng)求到http://localhost:8080/api/example,該請(qǐng)求將被Zuul網(wǎng)關(guān)轉(zhuǎn)發(fā)到http://example.com/api/example。
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Component
public class CustomFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 在這里編寫(xiě)你的過(guò)濾器邏輯
// 可以通過(guò)exchange對(duì)象獲取請(qǐng)求和響應(yīng)信息,并進(jìn)行相關(guān)處理
// 示例:檢查請(qǐng)求頭中是否包含特定的認(rèn)證信息
String authHeader = exchange.getRequest().getHeaders().getFirst("Authorization");
if (authHeader == null || authHeader.isEmpty()) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
// 繼續(xù)執(zhí)行后續(xù)的過(guò)濾器和路由處理
return chain.filter(exchange);
}
@Override
public int getOrder() {
// 設(shè)置過(guò)濾器的執(zhí)行順序
return Ordered.HIGHEST_PRECEDENCE;
}
}在上面的示例中,CustomFilter是一個(gè)自定義的過(guò)濾器類,實(shí)現(xiàn)了GlobalFilter接口和Ordered接口。你可以在filter方法中編寫(xiě)自己的過(guò)濾器邏輯,并在getOrder方法中設(shè)置過(guò)濾器的執(zhí)行順序。
這就是一個(gè)使用Spring Cloud Gateway的簡(jiǎn)單示例。通過(guò)配置路由規(guī)則和添加自定義過(guò)濾器,你可以實(shí)現(xiàn)請(qǐng)求的轉(zhuǎn)發(fā)、負(fù)載均衡、路由過(guò)濾等功能。Spring Cloud Gateway還提供了許多其他功能,如斷路器、限流、重試等,你可以根據(jù)具體需求進(jìn)行配置和使用。
四、Spring Cloud Gateway負(fù)載均衡的簡(jiǎn)單示例
在Spring Cloud Gateway中,你可以使用LoadBalancerClient或DiscoveryClient來(lái)實(shí)現(xiàn)負(fù)載均衡。下面是一個(gè)使用LoadBalancerClient實(shí)現(xiàn)負(fù)載均衡的示例:
- 添加依賴:在你的Spring Boot項(xiàng)目中添加以下依賴。如果你使用的是Maven,可以在pom.xml文件中添加以下依賴:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
</dependencies>- 配置路由規(guī)則:在application.properties或application.yml文件中配置Spring Cloud Gateway的路由規(guī)則,指定負(fù)載均衡的目標(biāo)服務(wù)。例如:
spring:
cloud:
gateway:
routes:
- id: example-service
uri: lb://example-service
predicates:
- Path=/api/**在上面的示例中,example-service是一個(gè)服務(wù)的名稱,lb://example-service表示通過(guò)負(fù)載均衡調(diào)用example-service服務(wù)。
- 創(chuàng)建一個(gè)自定義的LoadBalancerClient配置類:創(chuàng)建一個(gè)自定義的LoadBalancerClient配置類,用于配置負(fù)載均衡的策略。例如:
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.cloud.gateway.config.GatewayLoadBalancerProperties;
import org.springframework.cloud.gateway.filter.LoadBalancerClientFilter;
import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class LoadBalancerConfig {
@Bean
public LoadBalancerClientFilter loadBalancerClientFilter(LoadBalancerClient loadBalancerClient,
GatewayLoadBalancerProperties loadBalancerProperties) {
return new LoadBalancerClientFilter(loadBalancerClient, loadBalancerProperties);
}
@Bean
public LoadBalancerClient loadBalancerClient() {
return new MyLoadBalancerClient();
}
private static class MyLoadBalancerClient implements LoadBalancerClient {
@Override
public <T> T execute(String serviceId, LoadBalancerRequest<T> request) {
// 在這里實(shí)現(xiàn)你的負(fù)載均衡邏輯
// 可以使用負(fù)載均衡算法選擇目標(biāo)服務(wù)的實(shí)例
// 這里的示例代碼直接返回了固定的目標(biāo)服務(wù)實(shí)例
ServiceInstance serviceInstance = new DefaultServiceInstance(serviceId, "example-host", 8080, false);
return request.apply(serviceInstance);
}
@Override
public <T> T execute(String serviceId, ServiceInstance serviceInstance, LoadBalancerRequest<T> request) {
return request.apply(serviceInstance);
}
@Override
public URI reconstructURI(ServiceInstance instance, URI original) {
return instance.getUri();
}
@Override
public ServiceInstance choose(String serviceId) {
// 在這里實(shí)現(xiàn)你的負(fù)載均衡邏輯
// 可以使用負(fù)載均衡算法選擇目標(biāo)服務(wù)的實(shí)例
// 這里的示例代碼直接返回了固定的目標(biāo)服務(wù)實(shí)例
return new DefaultServiceInstance(serviceId, "example-host", 8080, false);
}
}
}在上面的示例中,MyLoadBalancerClient是一個(gè)自定義的LoadBalancerClient實(shí)現(xiàn),你可以在其中實(shí)現(xiàn)自己的負(fù)載均衡邏輯。示例代碼中直接返回了固定的目標(biāo)服務(wù)實(shí)例,你可以根據(jù)實(shí)際需求選擇合適的負(fù)載均衡算法。
- 運(yùn)行應(yīng)用程序并訪問(wèn)Spring Cloud Gateway:啟動(dòng)你的應(yīng)用程序,并使用Spring Cloud Gateway轉(zhuǎn)發(fā)請(qǐng)求。根據(jù)負(fù)載均衡配置,請(qǐng)求將被轉(zhuǎn)發(fā)到目標(biāo)服務(wù)的不同實(shí)例上。
這就是一個(gè)使用LoadBalancerClient實(shí)現(xiàn)負(fù)載均衡的示例。
你可以根據(jù)實(shí)際需求在自定義的LoadBalancerClient實(shí)現(xiàn)中選擇合適的負(fù)載均衡算法,并根據(jù)服務(wù)實(shí)例的健康狀態(tài)等信息進(jìn)行動(dòng)態(tài)調(diào)整。
另外,你也可以使用DiscoveryClient來(lái)實(shí)現(xiàn)基于服務(wù)發(fā)現(xiàn)的負(fù)載均衡,它可以與服務(wù)注冊(cè)中心(如Eureka、Consul)集成,自動(dòng)獲取可用的服務(wù)實(shí)例。
五、總結(jié)
本文簡(jiǎn)述了Spring Cloud Zuul和Spring Cloud Gateway的簡(jiǎn)單示例,其中還有很多功能還是得靠大家自己動(dòng)手去實(shí)踐。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 解決SpringCloud gateway網(wǎng)關(guān)配置MVC攔截器報(bào)錯(cuò)問(wèn)題
- SpringCloud Gateway 權(quán)限認(rèn)證的實(shí)現(xiàn)
- SpringCloud Gateway中斷言路由和過(guò)濾器的使用詳解
- SpringCloudGateway路由失效問(wèn)題
- SpringCloud GateWay動(dòng)態(tài)路由用法
- SpringCloud Gateway路由核心原理解析
- SpringCloud-Gateway網(wǎng)關(guān)的使用實(shí)例教程
- 使用SpringCloud Gateway解決跨域問(wèn)題
- SpringCloud網(wǎng)關(guān)Gateway功能實(shí)現(xiàn)
相關(guān)文章
Java實(shí)現(xiàn)HTML轉(zhuǎn)PDF的兩款工具(itext-pdfhtml和x-easypdf)介紹與使用
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)HTML轉(zhuǎn)PDF的兩款工具(itext-pdfhtml和x-easypdf)的介紹與使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2025-11-11
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(9)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-07-07
Mybatis 中Mapper使用package方式配置報(bào)錯(cuò)的解決方案
這篇文章主要介紹了Mybatis 中Mapper使用package方式配置報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
區(qū)分Java中的ArrayList和LinkedList
這篇文章主要介紹了如何區(qū)分Java中ArrayList和LinkedList,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06
Java基于Spire Cloud Excel把Excel轉(zhuǎn)換成PDF
這篇文章主要介紹了Java基于Spire Cloud Excel把Excel轉(zhuǎn)換成PDF,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05

