spring cloud gateway源碼講解(二)

spring cloud gateway的核心類DispatcherHandler 這個(gè)類就和springmvc的dispatcherHandler的地位是一樣的婆殿,所有的請求都會經(jīng)過他。他的主要方法是handler

@Override

public Mono handle(ServerWebExchange exchange) {

if (logger.isDebugEnabled()) {

ServerHttpRequest request = exchange.getRequest();

logger.debug("Processing " + request.getMethodValue() +" request for [" + request.getURI() +"]");

}

if (this.handlerMappings ==null) {

return Mono.error(HANDLER_NOT_FOUND_EXCEPTION);

}

return Flux.fromIterable(this.handlerMappings)

.concatMap(mapping -> mapping.getHandler(exchange))

.next()

.switchIfEmpty(Mono.error(HANDLER_NOT_FOUND_EXCEPTION))

.flatMap(handler -> invokeHandler(exchange, handler))

.flatMap(result -> handleResult(exchange, result));

}

?關(guān)鍵代碼(二)invokeHandler(exchange, handler)

1.invokeHadler里面調(diào)用了SimpleHandlerAdapter.handle(exchange, handler)

? ??????????????????????????????????????????
private Mono invokeHandler(ServerWebExchange exchange, Object handler) {

if (this.handlerAdapters !=null) {

for (HandlerAdapter handlerAdapter :this.handlerAdapters) {

if (handlerAdapter.supports(handler)) {

return handlerAdapter.handle(exchange, handler);

}

}

}

return Mono.error(new IllegalStateException("No HandlerAdapter: " + handler));

}

2.SimpleHandlerAdapter.handle(exchange, handler)里面又調(diào)用了gateway包下面的FilteringWebHandler.handle(ServerWebExchange exchange)方法哑了,在這里面獲取了之前放到上下文中的GATEWAY_ROUTE_ATTR,然后獲取filters,給所有的過濾器進(jìn)行排序,然后執(zhí)行這些過濾器

public Mono handle(ServerWebExchange exchange) {

Route route = exchange.getRequiredAttribute(GATEWAY_ROUTE_ATTR);

List gatewayFilters = route.getFilters();

List combined =new ArrayList<>(this.globalFilters);

combined.addAll(gatewayFilters);

//TODO: needed or cached?

? AnnotationAwareOrderComparator.sort(combined);

logger.debug("Sorted gatewayFilterFactories: "+ combined);

return new DefaultGatewayFilterChain(combined).filter(exchange);

}

3.前面初始化的時(shí)候掂墓,有初始化一個(gè)LoadBalancerClientFilter,在這里執(zhí)行這個(gè)filters鏈的時(shí)候有執(zhí)行這個(gè)filter

@Configuration

@ConditionalOnClass({LoadBalancerClient.class, RibbonAutoConfiguration.class, DispatcherHandler.class})

@AutoConfigureAfter(RibbonAutoConfiguration.class)

public class GatewayLoadBalancerClientAutoConfiguration {

// GlobalFilter beans

? @Bean

? @ConditionalOnBean(LoadBalancerClient.class)

public LoadBalancerClientFilter loadBalancerClientFilter(LoadBalancerClient client) {

return new LoadBalancerClientFilter(client);

}

}

這個(gè)就是創(chuàng)建了一個(gè)LoadBalancerClientFilter的對象看成,這個(gè)對象中的最主要的方法就是filter()君编,而filter()中最關(guān)鍵代碼就是調(diào)用了RibbonLoadBalancerClient.choose(String serviceId)

final ServiceInstance instance =loadBalancer.choose(url.getHost());


下面就是ribbon的源碼了

public ServiceInstance choose(String serviceId) {

Server server = getServer(serviceId);

if (server ==null) {

return null;

}

return new RibbonServer(serviceId, server, isSecure(server, serviceId),

serverIntrospector(serviceId).getMetadata(server));

}

這些就是spring cloud gateway 關(guān)鍵流程的源碼解析

知識點(diǎn):

這個(gè)在config中有用到單例模式,這個(gè)是單例模式的一種應(yīng)用川慌,一個(gè)config被spring容器管理后吃嘿,默認(rèn)是單例的,所以在自動加載的時(shí)候可以先對該config進(jìn)行配置的set,然后在被spring管理的其他的類中進(jìn)行g(shù)et獲取到

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末梦重,一起剝皮案震驚了整個(gè)濱河市兑燥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌琴拧,老刑警劉巖降瞳,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蚓胸,居然都是意外死亡力崇,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進(jìn)店門赢织,熙熙樓的掌柜王于貴愁眉苦臉地迎上來亮靴,“玉大人,你說我怎么就攤上這事于置〖氲酰” “怎么了贞岭?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長搓侄。 經(jīng)常有香客問我瞄桨,道長,這世上最難降的妖魔是什么讶踪? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任芯侥,我火速辦了婚禮,結(jié)果婚禮上乳讥,老公的妹妹穿的比我還像新娘柱查。我一直安慰自己,他們只是感情好云石,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布唉工。 她就那樣靜靜地躺著,像睡著了一般汹忠。 火紅的嫁衣襯著肌膚如雪淋硝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天宽菜,我揣著相機(jī)與錄音谣膳,去河邊找鬼。 笑死铅乡,一個(gè)胖子當(dāng)著我的面吹牛参歹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播隆判,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼犬庇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了侨嘀?” 一聲冷哼從身側(cè)響起臭挽,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咬腕,沒想到半個(gè)月后欢峰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涨共,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年纽帖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片举反。...
    茶點(diǎn)故事閱讀 40,742評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡懊直,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出火鼻,到底是詐尸還是另有隱情室囊,我是刑警寧澤雕崩,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站融撞,受9級特大地震影響盼铁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜尝偎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一饶火、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧致扯,春花似錦肤寝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瀑构。三九已至裆针,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寺晌,已是汗流浹背世吨。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呻征,地道東北人耘婚。 一個(gè)月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像陆赋,于是被迫代替她去往敵國和親沐祷。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評論 2 361

推薦閱讀更多精彩內(nèi)容