成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

Java使用Gateway自定義負(fù)載均衡過濾器

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

背景

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

準(zhǔn)備

由于是公司代碼不方便透露,現(xiàn)使用本地測(cè)試代碼。準(zhǔn)備:Eureka注冊(cè)中心,Gateway網(wǎng)關(guān),測(cè)試微服務(wù)

啟動(dòng)后服務(wù)如下兩個(gè)測(cè)試的微服務(wù),一個(gè)網(wǎng)關(guān)服務(wù)

Java使用Gateway自定義負(fù)載均衡過濾器

gateway版本

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

此處就說下我網(wǎng)關(guān)的配置。

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

分析

想要修改路由就要知道gateway是如何把我們的請(qǐng)求路由到各個(gè)微服務(wù)的實(shí)例上的。

gateway其實(shí)無非就是不同的過濾器,然后對(duì)請(qǐng)求進(jìn)行處理,和zuul類似。gateway自帶了很多過濾器。過濾器分為兩種:

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

2、GatewayFilter。網(wǎng)關(guān)過濾器,該過濾器可以指定過濾的條件,只有達(dá)到了條件的才進(jìn)入該過濾器。

如果想知道自帶有哪些配置,我們可以查看gateway的自動(dòng)注入類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);}省略.......

然后查看負(fù)載均衡配置。GatewayLoadBalancerClientAutoConfiguration

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

進(jìn)入LoadBalancerClientFilter,其實(shí)就是一個(gè)GlobalFilter。調(diào)試代碼試一試呢?發(fā)現(xiàn)果然要走。(此處圖片中應(yīng)該是my-service-id)。

Java使用Gateway自定義負(fù)載均衡過濾器

最終被路由到這個(gè)地方,負(fù)載均衡使用的是ribbon,關(guān)于ribbon暫時(shí)不討論。

Java使用Gateway自定義負(fù)載均衡過濾器

重點(diǎn)在這兒,通過現(xiàn)在的uri選擇到具體的uri。而這個(gè)方法恰恰是一個(gè)protected方法,我們可以重寫該方法加上我們自己的業(yè)務(wù)邏輯。

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

實(shí)現(xiàn)

重寫LoadBalancerClientFilter中的choose方法,實(shí)現(xiàn)自定義邏輯

/** * @Description 自定義負(fù)載均衡 * @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()); }}

定義通用選擇實(shí)例規(guī)則

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

實(shí)現(xiàn)自定義路由策略

/** * @Description 微服務(wù)負(fù)載均衡策略 * @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; }}

最后注入自定義負(fù)載均衡過濾器。

/** * @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的請(qǐng)求就可以通過hash取模路由到相同的機(jī)器上了,當(dāng)然這樣還是存在問題,比如多添加一個(gè)實(shí)例,或者掛了一個(gè)實(shí)例,掛之前有一個(gè)請(qǐng)求到A,掛之后可能到B,因?yàn)榇藭r(shí)取模就不同了,還是會(huì)到不同請(qǐng)求。但是這種情況很少發(fā)生,所以暫時(shí)不考慮。

或許有hash槽的方式可以解決一點(diǎn)問題,后續(xù)研究!!!!!

到此這篇關(guān)于Java使用Gateway自定義負(fù)載均衡過濾器的文章就介紹到這了,更多相關(guān)Java 自定義負(fù)載均衡過濾器內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
欧美唯美清纯偷拍| 日韩欧美自拍偷拍| 日韩欧美一二区| 日韩成人精品在线| 欧美一级久久| 自拍av一区二区三区| 91蝌蚪国产九色| 亚洲精品一区在线观看| 国产91丝袜在线18| 欧美日韩国产免费一区二区 | 波多野结衣中文一区| 91精品国产高清一区二区三区蜜臀 | jiyouzz国产精品久久| 777a∨成人精品桃花网| 久久爱www久久做| 欧美午夜精品一区| 青娱乐精品在线视频| 裸体素人女欧美日韩| 亚洲高清在线视频| 国产精品外国| 亚洲成人久久影院| 裸体丰满少妇做受久久99精品| 亚洲国产欧美日韩另类综合 | 欧美精品入口| 日本一区二区免费在线| 午夜精品久久| 国产婷婷色一区二区三区在线| eeuss鲁片一区二区三区在线观看| 日韩一区二区免费电影| 国产jizzjizz一区二区| 精品国产1区2区3区| 91玉足脚交白嫩脚丫在线播放| 久久久久久久久伊人| 欧美日韩在线大尺度| 国产精品国产a| 亚洲三级网站| 亚洲一区二区三区小说| 久久精品一区二区三区中文字幕| 午夜视频在线观看一区二区三区| 色婷婷久久久亚洲一区二区三区| 久久99在线观看| 日韩欧美黄色影院| 成人午夜精品在线| 久久久亚洲高清| 国产精品99一区二区| 综合久久综合久久| 一本色道久久综合亚洲精品高清| 亚洲午夜三级在线| 色噜噜狠狠一区二区三区果冻| 日韩高清一级片| 911精品国产一区二区在线| 国产一区二区电影| 久久久精品2019中文字幕之3| 欧美日韩精品伦理作品在线免费观看| 亚洲视频1区2区| 亚洲免费在线| 蜜桃视频在线观看一区二区| 欧美日韩国产综合视频在线观看| 国产福利一区在线| 久久精品在线免费观看| 亚洲国产午夜| 五月天久久比比资源色| 欧美日本视频在线| 不卡的av网站| 中文字幕一区不卡| 久久免费黄色| 国产91清纯白嫩初高中在线观看| 国产欧美精品一区二区色综合 | 欧美日韩一区二区三区不卡| 国产91丝袜在线观看| 欧美激情一区二区三区全黄| 国产欧美日韩亚洲| 日本中文一区二区三区| 欧美一级视频精品观看| 亚洲视频狠狠| 日本网站在线观看一区二区三区| 欧美一卡二卡三卡| 精品91在线| 免费av成人在线| 久久一夜天堂av一区二区三区| 欧美日韩一区二区三区免费| 一区二区高清在线| 欧美精品 日韩| 午夜日韩福利| 日日夜夜免费精品| 2020日本不卡一区二区视频| 国产日韩精品久久| 丰满少妇久久久久久久| 国产精品白丝在线| 欧美性欧美巨大黑白大战| 成人a免费在线看| 亚洲精品国产无套在线观| 欧美日本高清视频在线观看| 欧美激情一级片一区二区| 视频一区中文字幕| 精品乱人伦一区二区三区| 99re66热这里只有精品4| 精品亚洲成a人| 国产精品国产三级国产aⅴ原创| 欧美色手机在线观看| 国产精品a久久久久| 国内久久精品视频| 悠悠色在线精品| 欧美一级久久久久久久大片| 宅男噜噜噜66一区二区| 国产福利视频一区二区三区| 一区二区三区在线免费观看| 日韩精品一区二| 色欲综合视频天天天| 欧美精品v日韩精品v国产精品| 日本一道高清亚洲日美韩| 欧美精品一区二区三区高清aⅴ| 香港久久久电影| 97se亚洲国产综合自在线 | 欧美精品一区二区在线播放| 蜜桃av综合| 91在线观看成人| 久久精品国产久精国产| 综合亚洲深深色噜噜狠狠网站| 制服丝袜日韩国产| 欧美亚洲网站| 国产一区自拍视频| 国产精一区二区三区| 一区二区三区不卡视频在线观看| 精品对白一区国产伦| 91九色02白丝porn| 亚洲日产国产精品| 99久久久久久| 经典三级一区二区| 亚洲国产欧美在线| 国产精品天天摸av网| 欧美一区日韩一区| 久久午夜精品| 影音先锋一区| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 午夜精品在线视频一区| 国产精品不卡在线观看| 久久综合国产精品| 欧美欧美午夜aⅴ在线观看| 国产日韩一区二区三区| 欧美日韩一区在线视频| 丁香桃色午夜亚洲一区二区三区| 蜜桃视频第一区免费观看| 亚洲精品欧美在线| 中文字幕第一页久久| 日韩网站在线看片你懂的| 在线观看国产日韩| 久久激情视频| 国产日产精品一区二区三区四区的观看方式 | 人人爽香蕉精品| 亚洲乱码国产乱码精品精小说| 久久久不卡影院| 日韩女同互慰一区二区| 欧美日韩国产成人在线91| 久久经典综合| 日韩一级免费| 在线观看视频免费一区二区三区| 97国产精品videossex| 国产iv一区二区三区| 国产老肥熟一区二区三区| 免费的国产精品| 日韩激情一区二区| 日本福利一区二区| 久久国产主播精品| 欧美一级二区| 麻豆成人在线| 欧美一级一区| 久久久久久久久久久一区| 国产一区二区三区久久久久久久久 | 久久99精品国产麻豆不卡| 天天综合天天综合色| 亚洲观看高清完整版在线观看| 一区二区三区日韩精品视频| 亚洲免费观看视频| 亚洲乱码国产乱码精品精98午夜| 国产精品久久久久aaaa| 中文字幕成人av| 国产精品麻豆一区二区| 国产精品国产精品国产专区不片| 国产精品电影院| 欧美激情在线看| 国产在线一区二区| 国产精品一区二区黑丝| 国产精品一区二区视频| 国产高清精品在线| 成年人国产精品| 99在线视频精品| 91丨国产丨九色丨pron| 欧美在线黄色| 欧美尤物一区| 1024精品一区二区三区| 一区二区91| 久久久夜精品| 欧美美女直播网站| 日韩精品一区二区三区中文精品| 日韩精品一区二区三区视频| 久久久久久免费| 亚洲欧洲精品一区二区三区不卡| 亚洲欧美影音先锋| 亚洲免费在线视频一区 二区|