Zuul 2 –样本过滤器
Zuul 2終于開源了 。 我第一次聽到Zuul 2年Spring由米奇·科恩一個2016的講就是可以在這里找到 ,這是好事,終于可以用它玩。
為了快速實現Zuul 2之類的網關的目的–網關提供了微服務生態系統的切入點。 由于所有客戶的請求都是通過網關路由的,因此它可以控制路由,請求和響應流經網關的各個方面–
- 基于不同標準的路由-uri模式,標頭等
- 監控服務運行狀況
- 對原始服務器的負載平衡和限制請求
- 安全
- 金絲雀測試
我在這篇文章中的目標很簡單–編寫一個Zuul2過濾器,該過濾器可以刪除路徑前綴并將請求發送到下游服務并返回。
Zuul2過濾器是定制Zuul的機制。 假設客戶發送請求到/ passthrough / someapi調用,那么我希望Zuul 2層使用/ someapi uri將請求轉發到下游服務。 Zuul2過濾器通常打包為常規文件,并動態加載(并可能刷新)并應用。 不過,我的示例會有所不同,我的過濾器是用Java編碼的,因此我不得不繞過Zuul內置的加載機制。
簡單地遵循代碼即可,該代碼可在我的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”,這些過濾器處理入站到原始服務器的請求。 可以想象,有一個“ HttpOutboundSyncFilter”可以攔截來自原始服務器的出站呼叫。 這些“同步”過濾器有一個“ HttpInboundFilter”和“ HttpOutboundFilter”對應物,它們返回RxJava Observable類型。
我的過濾器實現中有一個魔術字符串“ overrideUri”。 如果您對我如何發現它是替代uri感到好奇,那就是通過掃描Zuul2代碼庫。 Netflix內部可能使用了很多過濾器,但尚未發布以供一般使用。
有了此過濾器后,我通過使用此組件顯式注冊我的自定義過濾器來繞過Zuul2的動態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);}} }我不得不做一些較小的調整,以引導我的自定義過濾器來完成整個設置,這些可以在github repo中進行 。
一旦啟動了帶有該自定義過濾器的Zuul2示例,其行為就是在刪除了前綴“ / passthrough”之后,對/ passthrough / messages的任何請求都會路由到下游系統。 啟動Zuul 2應用程序的說明是repo的README的一部分。
這是編寫自定義Zuul2過濾器的快速入門,我希望這給了足夠的感覺來評估Zuul 2。
翻譯自: https://www.javacodegeeks.com/2018/06/zuul-2-sample-filter.html
總結
以上是生活随笔為你收集整理的Zuul 2 –样本过滤器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: guava读取配置文件_使用Guava
- 下一篇: 小米电脑共享需要输入用户名和密码(小米手