zuul过滤器_Zuul 2 –样本过滤器
zuul過濾器
Zuul 2終于開源了 。 我第一次聽到Zuul 2年Spring由米奇·科恩一個2016的講就是可以在這里找到 ,這是好事,終于可以用它玩。
為了快速實現(xiàn)Zuul 2之類的網(wǎng)關(guān)的目的–網(wǎng)關(guān)提供了微服務(wù)生態(tài)系統(tǒng)的切入點。 由于所有客戶請求都是通過網(wǎng)關(guān)路由的,因此它可以控制路由,請求和響應流經(jīng)網(wǎng)關(guān)的各個方面–
- 基于不同標準的路由-uri模式,標頭等
- 監(jiān)控服務(wù)運行狀況
- 對原始服務(wù)器的負載平衡和限制請求
- 安全
- 金絲雀測試
我在這篇文章中的目標很簡單–編寫一個Zuul2過濾器,該過濾器可以刪除路徑前綴并將請求發(fā)送到下游服務(wù)并返回。
Zuul2篩選器是定制Zuul的機制。 假設(shè)客戶發(fā)送請求到/ passthrough / someapi調(diào)用,那么我希望Zuul 2層使用/ someapi uri將請求轉(zhuǎn)發(fā)到下游服務(wù)。 Zuul2過濾器通常打包為groovy文件,并動態(tài)加載(并可能刷新)并應用。 不過,我在這里的示例會有所不同,我的過濾器是用Java編碼的,我不得不繞過Zuul內(nèi)置的加載機制。
簡單地遵循代碼即可,該代碼可在我的github存儲庫中找到 – https://github.com/bijukunjummen/boot2-load-demo/tree/master/applications/zuul2-sample,將其打包在一起提供相似功能的一組樣本。 該代碼基于此處提供的Zuul 2示例。
這是我的過濾器的外觀:
import com.netflix.zuul.context.SessionContext; import com.netflix.zuul.filters.http.HttpInboundSyncFilter; import com.netflix.zuul.message.http.HttpRequestMessage;import java.util.Arrays; import java.util.List; import java.util.stream.Collectors;public class StripPrefixFilter extends HttpInboundSyncFilter {private final List<String> prefixPatterns;public StripPrefixFilter(List<String> prefixPatterns) {this.prefixPatterns = prefixPatterns;}@Overridepublic HttpRequestMessage apply(HttpRequestMessage input) {SessionContext context = input.getContext();String path = input.getPath();String[] parts = path.split("/");if (parts.length > 0) {String targetPath = Arrays.stream(parts).skip(1).collect(Collectors.joining("/"));context.set("overrideURI", targetPath);}return input;}@Overridepublic int filterOrder() {return 501;}@Overridepublic boolean shouldFilter(HttpRequestMessage msg) {for (String target: prefixPatterns) {if (msg.getPath().matches(target)) {return true;}}return false;} }它擴展了“ HttpInboundSyncFilter”,這些過濾器處理入站到原始服務(wù)器的請求。 可以想象,有一個“ HttpOutboundSyncFilter”可以攔截來自原始服務(wù)器的出站呼叫。 這些“同步”過濾器有一個“ HttpInboundFilter”和“ HttpOutboundFilter”對應物,它們返回RxJava Observable類型。
我的過濾器實現(xiàn)中有一個魔術(shù)字符串“ overrideUri”。 如果您對我如何發(fā)現(xiàn)它是替代uri感到好奇,那就是通過掃描Zuul2代碼庫。 Netflix內(nèi)部可能使用了很多過濾器,但尚未發(fā)布以供一般使用。
有了此過濾器后,我通過使用此組件顯式注冊我的自定義過濾器來繞過Zuul2的動態(tài)groovy腳本加載功能:
import com.netflix.zuul.filters.FilterRegistry; import com.netflix.zuul.filters.ZuulFilter;import javax.annotation.PostConstruct; import javax.inject.Inject; import java.util.ArrayList; import java.util.List; import java.util.Set;public class FiltersRegisteringService {private final List<ZuulFilter> filters;private final FilterRegistry filterRegistry;@Injectpublic FiltersRegisteringService(FilterRegistry filterRegistry, Set<ZuulFilter> filters) {this.filters = new ArrayList<>(filters);this.filterRegistry = filterRegistry;}public List<ZuulFilter> getFilters() {return filters;}@PostConstructpublic void initialize() {for (ZuulFilter filter: filters) {this.filterRegistry.put(filter.filterName(), filter);}} }我必須做一些較小的調(diào)整,以引導我的自定義過濾器來完成整個設(shè)置,這些可以在github repo中進行 。
一旦啟動了帶有該自定義過濾器的Zuul2示例,其行為就是在刪除前綴“ / passthrough”之后,對/ passthrough / messages的所有請求都會路由到下游系統(tǒng)。 啟動Zuul 2應用程序的說明是repo的README的一部分。
這是編寫自定義Zuul2過濾器的快速入門,我希望這能給人足夠的評價Zuul 2的感覺。
翻譯自: https://www.javacodegeeks.com/2018/06/zuul-2-sample-filter.html
zuul過濾器
總結(jié)
以上是生活随笔為你收集整理的zuul过滤器_Zuul 2 –样本过滤器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三星 LPCAMM 规格内存细节曝光:与
- 下一篇: 深耕海外!传音TECNO成非洲杯独家手机