日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java使用Gateway自定義負載均衡過濾器

瀏覽:23日期:2022-08-29 16:14:58

背景

最近項目中需要上傳視頻文件,由于視頻文件可能會比較大,但是我們應用服務器tomcat設置單次只支持的100M,因此決定開發一個分片上傳接口。把大文件分成若干個小文件上傳。所有文件上傳完成后通過唯一標示進行合并文件。我們的開發人員很快完成了開發,并在單元測試中表現無誤。上傳代碼到測試環境,喔嚯!!!出錯了。經過一段時間的辛苦排查終于發現問題,測試環境多實例,分片上傳的接口會被路由到不同的實例,導致上傳后的分片文件在不同的機器,那么也就無法被合并。知道了原因就好解決,經過一系列的過程最終決定修改網關把uuid相同的請求路由到相同的實例上,這樣就不會出錯了!

準備

由于是公司代碼不方便透露,現使用本地測試代碼。準備:Eureka注冊中心,Gateway網關,測試微服務

啟動后服務如下兩個測試的微服務,一個網關服務

Java使用Gateway自定義負載均衡過濾器

gateway版本

<spring-cloud.version>Greenwich.SR2</spring-cloud.version><spring-boot.version>2.1.6.RELEASE</spring-boot.version>

此處就說下我網關的配置。

#網關名spring.cloud.gateway.routes[0].id=route-my-service-id#網關uri,lb代表負載均衡,后面是服務名,必須要和微服務名一致,不能錯,錯了肯定不能路由spring.cloud.gateway.routes[0].uri=lb://my-service-id#斷言,配置的路徑spring.cloud.gateway.routes[0].predicates[0]=Path=/my-service-id/v3/**#截取uri前面兩個位置的spring.cloud.gateway.routes[0].filters[0]=StripPrefix=2

分析

想要修改路由就要知道gateway是如何把我們的請求路由到各個微服務的實例上的。

gateway其實無非就是不同的過濾器,然后對請求進行處理,和zuul類似。gateway自帶了很多過濾器。過濾器分為兩種:

1、GlobalFilter 。顧名思義,全局過濾器,所有請求都會走的過濾器。常見的自帶過濾器LoadBalancerClientFilter(負載均衡過濾器,后面我們就是修改這個地方)。

2、GatewayFilter。網關過濾器,該過濾器可以指定過濾的條件,只有達到了條件的才進入該過濾器。

如果想知道自帶有哪些配置,我們可以查看gateway的自動注入類GatewayAutoConfiguration。

/** * @author Spencer Gibb */@Configuration@ConditionalOnProperty(name = 'spring.cloud.gateway.enabled', matchIfMissing = true)@EnableConfigurationProperties@AutoConfigureBefore({ HttpHandlerAutoConfiguration.class,WebFluxAutoConfiguration.class })@AutoConfigureAfter({ GatewayLoadBalancerClientAutoConfiguration.class,GatewayClassPathWarningAutoConfiguration.class })@ConditionalOnClass(DispatcherHandler.class)public class GatewayAutoConfiguration {@Beanpublic StringToZonedDateTimeConverter stringToZonedDateTimeConverter() {return new StringToZonedDateTimeConverter();}@Beanpublic RouteLocatorBuilder routeLocatorBuilder(ConfigurableApplicationContext context) {return new RouteLocatorBuilder(context);}@Bean@ConditionalOnMissingBeanpublic PropertiesRouteDefinitionLocator propertiesRouteDefinitionLocator(GatewayProperties properties) {return new PropertiesRouteDefinitionLocator(properties);}省略.......

然后查看負載均衡配置。GatewayLoadBalancerClientAutoConfiguration

/** * @author Spencer Gibb */@Configuration@ConditionalOnClass({ LoadBalancerClient.class, RibbonAutoConfiguration.class,DispatcherHandler.class })@AutoConfigureAfter(RibbonAutoConfiguration.class)@EnableConfigurationProperties(LoadBalancerProperties.class)public class GatewayLoadBalancerClientAutoConfiguration {// GlobalFilter beans//負載均衡@Bean@ConditionalOnBean(LoadBalancerClient.class)@ConditionalOnMissingBean(LoadBalancerClientFilter.class)public LoadBalancerClientFilter loadBalancerClientFilter(LoadBalancerClient client,LoadBalancerProperties properties) {return new LoadBalancerClientFilter(client, properties);}}

進入LoadBalancerClientFilter,其實就是一個GlobalFilter。調試代碼試一試呢?發現果然要走。(此處圖片中應該是my-service-id)。

Java使用Gateway自定義負載均衡過濾器

最終被路由到這個地方,負載均衡使用的是ribbon,關于ribbon暫時不討論。

Java使用Gateway自定義負載均衡過濾器

重點在這兒,通過現在的uri選擇到具體的uri。而這個方法恰恰是一個protected方法,我們可以重寫該方法加上我們自己的業務邏輯。

protected ServiceInstance choose(ServerWebExchange exchange) {return loadBalancer.choose(((URI) exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR)).getHost());}

實現

重寫LoadBalancerClientFilter中的choose方法,實現自定義邏輯

/** * @Description 自定義負載均衡 * @Author Singh * @Date 2020-07-02 10:36 * @Version **/public class CustomLoadBalancerClientFilter extends LoadBalancerClientFilter implements BeanPostProcessor { private final DiscoveryClient discoveryClient; private final List<IChooseRule> chooseRules; public CustomLoadBalancerClientFilter(LoadBalancerClient loadBalancer, LoadBalancerProperties properties, DiscoveryClient discoveryClient) { super(loadBalancer, properties); this.discoveryClient = discoveryClient; this.chooseRules = new ArrayList<>(); chooseRules.add(new EngineeringChooseRule()); } protected ServiceInstance choose(ServerWebExchange exchange) { if(!CollectionUtils.isEmpty(chooseRules)){ Iterator<IChooseRule> iChooseRuleIterator = chooseRules.iterator(); while (iChooseRuleIterator.hasNext()){IChooseRule chooseRule = iChooseRuleIterator.next();ServiceInstance choose = chooseRule.choose(exchange,discoveryClient);if(choose != null){ return choose;} } } return loadBalancer.choose(((URI) exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR)).getHost()); }}

定義通用選擇實例規則

/** * @Description 自定義選擇實例規則 * @Author Singh * @Date 2020-07-02 11:03 * @Version **/public interface IChooseRule { /** * 返回null那么使用gateway默認的負載均衡策略 * @param exchange * @param discoveryClient * @return */ ServiceInstance choose(ServerWebExchange exchange, DiscoveryClient discoveryClient);}

實現自定義路由策略

/** * @Description 微服務負載均衡策略 * @Author Singh * @Date 2020-07-02 11:10 * @Version **/public class EngineeringChooseRule implements IChooseRule { @Override public ServiceInstance choose(ServerWebExchange exchange, DiscoveryClient discoveryClient) { URI originalUrl = (URI) exchange.getAttributes().get(GATEWAY_REQUEST_URL_ATTR); String instancesId = originalUrl.getHost(); if(instancesId.equals('my-service-id')){ if(originalUrl.getPath().contains('/files/upload')){try{ List<ServiceInstance> instances = discoveryClient.getInstances(instancesId); MultiValueMap<String, String> queryParams = exchange.getRequest().getQueryParams(); String uuid = queryParams.get('uuid').get(0); int hash = uuid.hashCode() >>> 16 ; int index = hash % instances.size(); return instances.get(index);}catch (Exception e){ //do nothing} } } return null; }}

最后注入自定義負載均衡過濾器。

/** * @Description * @Author Singh * @Date 2020-07-01 17:57 * @Version **/@Configurationpublic class GetawayConfig {// @Bean// public RouteLocator routeLocator(RouteLocatorBuilder builder) {// //lb://hjhn-engineering/files/upload// return builder.routes()//.route(r ->r.path('/**').filters(// f -> f.stripPrefix(2).filters(new EngineeringGatewayFilter())//).uri('lb://hjhn-engineering')//) .build();// } @Bean public LoadBalancerClientFilter loadBalancerClientFilter(LoadBalancerClient client, LoadBalancerProperties properties, DiscoveryClient discoveryClient) { return new CustomLoadBalancerClientFilter(client, properties,discoveryClient); }}

如此,相同uuid的請求就可以通過hash取模路由到相同的機器上了,當然這樣還是存在問題,比如多添加一個實例,或者掛了一個實例,掛之前有一個請求到A,掛之后可能到B,因為此時取模就不同了,還是會到不同請求。但是這種情況很少發生,所以暫時不考慮。

或許有hash槽的方式可以解決一點問題,后續研究!!!!!

到此這篇關于Java使用Gateway自定義負載均衡過濾器的文章就介紹到這了,更多相關Java 自定義負載均衡過濾器內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产一区二区三区四区五区| 日本韩国欧美超级黄在线观看| 精品美女视频 | 欧美亚洲人成在线| 午夜久久黄色| 欧美xxxx中国| 国产福利资源一区| 久久不见久久见国语| 亚洲婷婷丁香| 亚洲精品一二| 首页欧美精品中文字幕| 国内精品福利| 野花国产精品入口| 尤物tv在线精品| 国产高清精品二区| 美女国产一区二区三区| 日日夜夜免费精品| 亚洲欧美视频一区二区三区| 性欧美videohd高精| 国产91在线精品| 日韩一区电影| 日韩中文在线电影| 五月精品视频| 亚洲综合电影一区二区三区| 亚洲精品va| 亚洲精品婷婷| 亚洲精品精选| 免费亚洲婷婷| 国产一区二区三区日韩精品| 久久99性xxx老妇胖精品| 久久久久伊人| 欧美xxxx中国| 日本在线啊啊| 国产亚洲一级| 免费观看在线综合| 日本欧美一区| 久久不见久久见国语| 久久亚州av| 影视先锋久久| 天堂成人国产精品一区| 国产剧情在线观看一区| 久久99精品久久久久久园产越南| 久久精品天堂| 尤物网精品视频| 亚洲综合中文| 精品视频91| 久久国产日本精品| 美女国产精品| 精品视频自拍| 国产精品成人a在线观看| 国产传媒在线观看| 欧美日韩精品免费观看视欧美高清免费大片 | 日韩欧美网址| 成人av动漫在线观看| 日韩三级久久| 国产激情欧美| 国产亚洲人成a在线v网站| 国产一区精品福利| 999久久久亚洲| 男人天堂欧美日韩| 日韩精品免费视频人成| 亚洲精品在线二区| 蜜桃av.网站在线观看| 亚洲激情社区| 美女av一区| 亚洲欧美日韩高清在线| 国产精品主播在线观看| 亚洲不卡系列| 视频一区免费在线观看| 久久久久久色 | 国产精品久久国产愉拍| 欧美日韩在线二区| 亚洲我射av| 精品一区91| 四虎在线精品| 国产精品久久久久久久久妇女| 亚洲一区二区三区久久久| 久久成人福利| 免费视频一区三区| 免费一区二区三区在线视频| 欧美一区三区| 国产成人a视频高清在线观看| 亚洲精品一二三区区别| 欧美日韩va| 爽好多水快深点欧美视频| 国产情侣久久| 亚洲免费在线| 国产成人精品免费视| 免费人成在线不卡| 久久一级电影| 欧美激情在线精品一区二区三区| 蜜臀av一区二区三区| 色婷婷综合网| 亚洲色图综合| 午夜欧美理论片| 另类欧美日韩国产在线| 日韩在线视频一区二区三区| 日韩中文视频| 蜜桃一区二区三区在线观看| 久久在线视频免费观看| 国产福利一区二区三区在线播放| 国产精品婷婷| 国产传媒在线| 亚洲乱亚洲高清| 国产精品7m凸凹视频分类| 国产精品入口久久| 欧美精品三级在线| 蜜臀av亚洲一区中文字幕| 欧美日韩日本国产亚洲在线| 久久不卡国产精品一区二区| 久久激情网站| 色偷偷偷在线视频播放| 国产午夜精品一区在线观看| 在线观看视频免费一区二区三区| 日本美女一区| 精品视频免费| 婷婷亚洲成人| 伊人精品视频| 在线视频观看日韩| 国产成人免费av一区二区午夜| 国产精品亚洲成在人线| 在线精品一区| 欧美精品一区二区三区精品| 久久中文字幕av| 成人在线视频免费看| 国产一区丝袜| 欧美精品二区| 国产欧美三级| 日本不卡视频一二三区| 影音国产精品| 国产午夜久久| 欧美好骚综合网| 日韩啪啪电影网| 日本激情一区| 91精品国产自产在线丝袜啪| 亚洲资源在线| 久色成人在线| 日韩精品视频网| 亚洲网址在线观看| 日韩国产在线观看| 四虎在线精品| 亚洲毛片在线免费| 91精品国产自产在线丝袜啪| 亚洲精品四区| 国产精品免费精品自在线观看| 亚洲精品中文字幕99999| 亚洲91在线| 视频一区日韩| 日本在线观看不卡视频| 亚洲尤物av| 一本综合精品| 日韩有吗在线观看| 亚洲欧洲专区| 亚洲精品系列| 日本aⅴ精品一区二区三区| 日本色综合中文字幕| 久久黄色影视| 国产福利资源一区| 麻豆91小视频| 成人在线视频区| 精品一区欧美| 日韩一区二区三区免费播放| 亚洲激情婷婷| 美国欧美日韩国产在线播放| 欧美精品九九| 日韩成人午夜精品| 国产精品一卡| 在线日韩欧美| 亚洲中午字幕| 欧美国产另类| 日韩一区二区在线免费| 久久av在线| 无码日韩精品一区二区免费| 欧美专区在线| 免费在线观看一区| 亚洲黄色中文字幕| 在线观看免费一区二区| 亚洲欧美日韩国产| 久久精品资源| 丁香六月综合| 蜜臀久久久99精品久久久久久| 日本不卡视频在线| 日韩影片在线观看| 国产乱码午夜在线视频| 亚洲性图久久| 国产亚洲精品美女久久| 日韩欧美另类一区二区| 日韩精选在线| 国产在线日韩精品| 日韩欧美在线精品| 国内自拍视频一区二区三区| 午夜av不卡| 欧美中文一区| 超碰成人av| 欧美一区自拍| zzzwww在线看片免费| 日韩一区二区三区在线看| 久久a爱视频| 中文视频一区| 精品久久久中文字幕|