javascript
使用Zuul和Spring Boot创建API网关
介紹
使用微服務(wù)時,通常具有對系統(tǒng)的統(tǒng)一訪問點(也稱為API Gateway )。 消費者僅與API網(wǎng)關(guān)交談,而不與服務(wù)直接交談。 這掩蓋了您的系統(tǒng)由多個較小的服務(wù)組成的事實。 API網(wǎng)關(guān)還可幫助解決常見的挑戰(zhàn),例如身份驗證,管理跨域資源共享( CORS )或請求限制。
Zuul是由Netflix開發(fā)和開源的基于JVM的API網(wǎng)關(guān)。 在本文中,我們將創(chuàng)建一個小的Spring應(yīng)用程序,其中包括一個zuul代理,用于將請求路由到其他服務(wù)。
啟用zuul代理
要在項目中使用zuul,我們必須添加spring-cloud-starter-netflix-zuul依賴項。 如果我們要使用spring zuul執(zhí)行器端點(稍后會詳細(xì)介紹),我們還需要添加spring-boot-starter-actuator依賴項。
< dependency > < groupId >org.springframework.cloud</ groupId > < artifactId >spring-cloud-starter-netflix-zuul</ artifactId > </ dependency > <!-- optional --> < dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-actuator</ artifactId > </ dependency >接下來,我們必須在我們的Spring Boot應(yīng)用程序類(或任何其他spring @Configuration類)中使用@EnableZuulProxy啟用zuul代理。
@SpringBootApplication @EnableZuulProxy public class ZuulDemoApplication { ... }現(xiàn)在,我們可以開始配置路線了。
配置路線
路由描述了zuul應(yīng)該如何路由傳入的請求。 要配置zuul路由,我們只需要向Spring Boot application.yml (或application.properties )文件添加幾行:
application.yml:
zuul: routes: users: path: /users/** url: https: //users.myapi.com projects: path: /projects/** url: https: //projects.myapi.com在這里,我們定義了兩個端點的路由: / users和/ projects : / users的請求將路由到https://users.myapi.com,而/ projects的請求將路由到https://projects.myapi.com 。
假設(shè)我們在本地啟動此示例應(yīng)用程序,并將GET請求發(fā)送到http:// localhost:8080 / users / john 。 該請求與zuul路由/ users / **匹配,因此zuul會將請求轉(zhuǎn)發(fā)至https://users.myapi.com/john 。
當(dāng)使用服務(wù)注冊中心(例如Eureka )時,我們可以替代地配置服務(wù)ID而不是URL:
zuul: routes: users: path: /users/** serviceId: user_service另一個有用的選項是sensitiveHeaders ,它使我們可以在將請求路由到另一個服務(wù)之前刪除標(biāo)頭。 這可以用來避免敏感頭泄漏到外部服務(wù)器(例如,安全令牌或會話ID)。
zuul: routes: users: path: /users/** url: https: //users.myapi.com sensitiveHeaders: Cookie,Set-Cookie,Authorization請注意,顯示的示例標(biāo)頭( Cookie,Set-Cookie,Authorization )是sensitiveHeaders屬性的默認(rèn)值。 因此,即使未指定sensitiveHeaders ,也不會傳遞這些標(biāo)頭。
使用過濾器修改請求/響應(yīng)
我們可以使用過濾器自定義zuul路由。 為了創(chuàng)建一個zuul過濾器,我們創(chuàng)建一個新的spring bean(標(biāo)記為@Component),它從ZuulFilter擴(kuò)展:
@Component public class MyFilter extends ZuulFilter { @Override public String filterType() { return FilterConstants.PRE_TYPE; } @Override public int filterOrder() { return FilterConstants.PRE_DECORATION_FILTER_ORDER - 1 ; } @Override public boolean shouldFilter() { return true ; } @Override public Object run() { RequestContext context = RequestContext.getCurrentContext(); context.addZuulRequestHeader( "my-auth-token" , "s3cret" ); return null ; } }ZuulFilter需要定義四個方法:
- 在filterType()中,我們定義過濾器應(yīng)在(PRE_TYPE)實際路由之前運行。 如果我們想在將服務(wù)的響應(yīng)發(fā)送回客戶端之前對其進(jìn)行修改,則可以在此處返回POST_TYPE。
- 使用filterOrder()我們可以影響過濾器執(zhí)行的順序
- shouldFilter()指示是否應(yīng)執(zhí)行此過濾器(=調(diào)用run()方法)
- 在run()中,我們定義實際的過濾器邏輯。 在這里,我們將簡單的標(biāo)頭my-auth-token添加到路由到另一個服務(wù)的請求。
過濾器使我們能夠在將請求發(fā)送到指定服務(wù)之前對其進(jìn)行修改,或者在將服務(wù)發(fā)送回客戶端之前修改該服務(wù)的響應(yīng)。
執(zhí)行器端點
Spring cloud zuul暴露了一個額外的Spring Boot執(zhí)行器端點。 要使用此功能,我們需要在類路徑中有spring-boot-starter-actuator 。
默認(rèn)情況下,執(zhí)行器端點是禁用的。 在application.yml中,我們使用management.endpoints.web.exposure.include屬性啟用特定的執(zhí)行器端點:
management: endpoints: web: exposure: include: '*'在這里,我們僅啟用所有執(zhí)行器端點。 可以在Spring Boot執(zhí)行器文檔中找到更多詳細(xì)的配置選項。
啟用zuul執(zhí)行器端點后,我們可以將GET請求發(fā)送到http:// localhost:8080 / actuator / routes以獲取所有已配置路由的列表。
一個示例響應(yīng)可能如下所示:
{ "/users/**" : " https://users.myapi.com " , "/projects/**" : "project_service" }摘要
使用Spring Cloud,您可以輕松地在您的應(yīng)用程序中集成zuul代理。 這使您可以在.yml或.properties文件中配置路由。 可以使用過濾器自定義路由行為。
可以在官方的Spring Cloud zuul文檔中找到有關(guān)spring對zuul的支持的更多詳細(xì)信息。 與往常一樣,您可以在GitHub上找到本文中顯示的示例。
翻譯自: https://www.javacodegeeks.com/2020/01/creating-an-api-gateway-with-zuul-and-spring-boot.html
總結(jié)
以上是生活随笔為你收集整理的使用Zuul和Spring Boot创建API网关的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编制与备案制(备案制进编)
- 下一篇: DDOS是什么(ddos是什么原因)