成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一次性講明白Spring Cloud核心組件

開發(fā) 架構(gòu) 開發(fā)工具
目前,最火的微服務(wù)框架,就是 Spring Cloud 了。雖然 Netflix 公司對(duì)某些組件的維護(hù)經(jīng)常爽約,但有些核心組件還是非常經(jīng)典的。

這幾天可真是熱啊,泡個(gè)海澡是再好不過了。玩的正起勁,突然腳底絆上一股暗流,然后我就一直在水里旋轉(zhuǎn)旋轉(zhuǎn)旋轉(zhuǎn)。終于眼前一黑,愛的魔力轉(zhuǎn)圈圈,我穿越了...... 

[[272827]]

圖片來自 Pexels

鄰國(guó)相望,雞犬之聲相聞,民至老死不相往來。這個(gè)世界被小諸侯給切的七零八落,一鍋亂麻。

[[272828]]

而現(xiàn)實(shí)是,我的國(guó)家因?yàn)槌D甏蛘蹋O碌呐撕芏啵枰蛲ㄟh(yuǎn)嫁他方的通道;而 A 國(guó)盛產(chǎn)長(zhǎng)得和豬一樣大的耗子,賣的很好。它們可以做成皮大氅,用來取暖。所以交流是在所難免的。

現(xiàn)實(shí)是這樣的:

  • A 國(guó)不知道 B 國(guó)身處何方,經(jīng)常有牧民捧著藏寶圖一樣的破布,葬身在崎嶇的山路上。
  • B 國(guó)聽不懂 C 國(guó)含糊不清的吐詞,感覺他們?cè)谇缶龋扰芙豢矗瑓s發(fā)現(xiàn)其實(shí)是在罵娘。
  • C 國(guó)生產(chǎn)的南瓜就知道賣給 D 國(guó),剩下的都爛在了地里,E 國(guó)都開始吃樹皮了。
  • F 國(guó)倒是遠(yuǎn)近聞名,但四面八方蜂擁而至的難民,讓他們非常苦惱。其中,G 國(guó)的難民,最是惡劣。

曾有其他大陸板塊的使者,5 年不得要領(lǐng)。見神粥大地現(xiàn)狀,作詩(shī)一首:《真 TM 亂》。

作為一個(gè)穿越者,一個(gè)憐憫眾生的剩人。我要留給這個(gè)世界一張藍(lán)圖,好讓后人記住我的名字。同時(shí),我也想起了,我為什么有這種這種強(qiáng)大的自信。

“回憶”的片段將我?guī)Щ氐?21 世紀(jì)。

我要聊點(diǎn)技術(shù)了:?jiǎn)误w應(yīng)用

我們剛開始的服務(wù),其實(shí)并沒有那么復(fù)雜。我只有一臺(tái)配置非常低的機(jī)器,我的應(yīng)用,我的代碼,我的聰明才智,全部在這一個(gè)小小的工程里面。

由于我是搞 IT 的,所以我的項(xiàng)目名字就叫 jisuanji。有人說我用中文拼音做項(xiàng)目名,太那個(gè)。

我不聽,我就是這么命名。我還把公共模塊叫 gg,密碼字段叫 mm,誰(shuí)管得著呢。

對(duì),看下面的圖,就是這么簡(jiǎn)單。項(xiàng)目能活到用 Nginx 來做負(fù)載均衡這一步,就算是小成功了。

一次性講明白Spring Cloud核心組件

這個(gè)時(shí)候,所有的代碼就是一個(gè)整體,用戶訪問什么,我直接給就是。

我拆成了兩個(gè)服務(wù)

可能是我和我一樣二的人有點(diǎn)多,我的項(xiàng)目訪問量越來越大,這也許就叫臭味相投吧。

我自己的開發(fā)速度,已經(jīng)追不上頭腦里的 Idea,是時(shí)候招個(gè)人對(duì)服務(wù)進(jìn)行拆分了。

不能拆的太過火,所以剛開始,我把 jisuanji 拆成了兩個(gè)服務(wù)。其中的服務(wù) B,僅僅部署了一個(gè)節(jié)點(diǎn),因?yàn)樗膲毫€不是太大。

即使這樣,我不得不買上 3 臺(tái)服務(wù)器來部署服務(wù)節(jié)點(diǎn),真是肉痛。我這么摳門的人,數(shù)據(jù)庫(kù)當(dāng)然也是共用的。雖然有時(shí)候機(jī)器壓力有點(diǎn)大,但暫時(shí)還死不了人。

一次性講明白Spring Cloud核心組件

這個(gè)時(shí)候我就面臨了一個(gè)選擇問題:服務(wù) A 要怎么訪問服務(wù) B 呢?

由于我搞過一段時(shí)間的 Web Service,首先就想到了它。但這玩意太重了,我還不如通過 HTTP 訪問來的舒爽。

通過 HTTP Client,或者 Ok Http,我的服務(wù) A,現(xiàn)在可以直接模擬 HTTP 請(qǐng)求訪問服務(wù) B 了。

當(dāng)團(tuán)隊(duì)里有第二個(gè)人,就開始吐槽我的項(xiàng)目了。以下是他羅列的,我的項(xiàng)目的罪狀:

  • 復(fù)雜度太高,代碼嚴(yán)重耦合。
  • 技術(shù)債務(wù)多,拍腦袋需求一籮筐。
  • 代碼不規(guī)范,一坨屎。
  • 技術(shù)創(chuàng)新難,一個(gè)類幾千行…

至于么?從一個(gè)服務(wù)拆成兩個(gè),就這么吐槽我。不過為了以后能拆出成百上千個(gè)服務(wù),這口氣我暫時(shí)忍了,畢竟我這人還是比較虛心的。

亂成一鍋粥了

等過去半年一看,好家伙,服務(wù)給我拆了了幾十個(gè)。當(dāng)我的同伴把系統(tǒng)結(jié)構(gòu)圖拿給我看,我直接懵逼了。

我挑了 9 個(gè)能看的服務(wù),畫了張圖:

一次性講明白Spring Cloud核心組件

首先進(jìn)行了業(yè)務(wù)拆分。比如支付業(yè)務(wù),訂單業(yè)務(wù),用戶中心,商品中心等,都組建了獨(dú)立的團(tuán)隊(duì)。每個(gè)業(yè)務(wù)又進(jìn)行了細(xì)分,拆分成不同的服務(wù)。

在這之間,進(jìn)行了下面的改動(dòng):

  • 有小伙伴寫了個(gè)通用的 HTTP Client 調(diào)用組件,自己的負(fù)載均衡策略。
  • 有另外一個(gè)小伙伴,習(xí)慣 Protobuf,所以選了 gRPC。
  • 事實(shí)證明 SOA 還是有市場(chǎng)的,這不,就有幾個(gè)服務(wù)的交互引入了 Web Service。
  • 有人想要用 RMI,被我及時(shí)發(fā)現(xiàn)、否決,腹死胎中了。
  • 每次建個(gè)新服務(wù),都需要更新一下 Excel,然后將這個(gè) Excel 周知出去。

現(xiàn)在的整個(gè)系統(tǒng),簡(jiǎn)直是個(gè)四不像。什么通信方式都有,什么交互格式都不缺。

拿最要命的 D 服務(wù)來說,光通訊模塊,就引入了 20 幾個(gè) Jar 包。如果應(yīng)用擴(kuò)展到上千個(gè)…My God…

更要命的是,這么多服務(wù),每次上線一個(gè)模塊都膽戰(zhàn)心驚,因?yàn)樗恢赖降讜?huì)有什么連鎖反應(yīng)。

是時(shí)候叫出超級(jí)飛俠了。哦不,叫出微服務(wù)了。

微服務(wù)來襲

目前,最火的微服務(wù)框架,就是 Spring Cloud 了。雖然 Netflix 公司對(duì)某些組件的維護(hù)經(jīng)常爽約,但有些核心組件還是非常經(jīng)典的。

注冊(cè)中心:Eureka

服務(wù) A,怎么找到服務(wù) B,有很多種方式。比如你生活在一個(gè)小鎮(zhèn)上,你問 xjjdog 是誰(shuí),老王可能認(rèn)識(shí)他,但小李可能并不知曉;但小李認(rèn)識(shí)老王,所以通過他最終也能找到 xjjdog,只不過麻煩一些。

你可以隨便拉小鎮(zhèn)上的一個(gè)人,來問 xjjdog 是誰(shuí)。你還會(huì)變戲法一樣拿出一個(gè)小本本,把你認(rèn)識(shí)的人,都告訴他們。當(dāng)你腦殘式的問了一個(gè)遍,到最后所有人都知道 xjjdog 了。

上面說的就是 Gossip 協(xié)議。最終,你們都能夠知道彼此,因?yàn)槎际谴笞彀汀?/p>

比如小鄭生了個(gè)孩子,過不了多少時(shí)間,全鎮(zhèn)子的人都把這個(gè)孩子記錄在本子上了。用這種方式,服務(wù)都能夠知道彼此,完成通信。

可惜這并不美好,從小鎮(zhèn)的東頭跑到西頭,需要很長(zhǎng)時(shí)間。在這個(gè)時(shí)間里,小鄭剛生的孩子可能因?yàn)橄忍旒膊∝舱哿恕N覀冃枰环N信息集中度和實(shí)效性更高的方式。

這就需要一個(gè)中心,那里的信息就是權(quán)威。 在 Spring Cloud 體系中,最常用的注冊(cè)中心就是 Eureka。

任何服務(wù)啟動(dòng)以后,都會(huì)把自己注冊(cè)到 Eureka 的注冊(cè)表中;當(dāng)服務(wù)死亡的時(shí)候,也會(huì)通知 Eureka。

一次性講明白Spring Cloud核心組件

這樣,當(dāng)服務(wù) A 想要找服務(wù) B 的時(shí)候,只需要問一下 Eureka Server 就可以了,它什么都知道。

為了達(dá)到這個(gè)目的,還是要有一部分工作量的。且看下圖。這個(gè)注冊(cè)動(dòng)作,是由一個(gè)叫做 Eureka Client 的組件來完成的。

服務(wù)啟動(dòng)和關(guān)閉的時(shí)候,會(huì)通過這個(gè)組件推銷自己;而當(dāng)服務(wù) A 想要調(diào)用服務(wù) B 的時(shí)候,直接問 Eureka Server 就可以了。服務(wù) A 拿到結(jié)果后,會(huì)把結(jié)果緩存在本地的注冊(cè)表里。

你可以認(rèn)為是一個(gè)拷貝。所以 Eureka Server 死掉后,并不影響服務(wù) A 找到服務(wù) B。

一次性講明白Spring Cloud核心組件

負(fù)載均衡組件:Ribbon

現(xiàn)在問題來了。服務(wù) A 拿到服務(wù) B 的實(shí)例列表以后,發(fā)現(xiàn)有兩臺(tái)。

  1. 10.0.0.12 
  2. 10.0.0.16 

接下來麻煩了,該調(diào)哪臺(tái)機(jī)器呢?這就是 Spring Cloud 中組件 Ribbon 的作用。

其實(shí) Round Robin 是一個(gè)通用的計(jì)算機(jī)術(shù)語(yǔ)。它是最常用的負(fù)載均衡策略,請(qǐng)求會(huì)均勻的分配給后面的每臺(tái)服務(wù)器。

Ribbon 工作時(shí),會(huì)做下面四件事:

  • 優(yōu)先選擇在一個(gè) Zone 且負(fù)載較少的 Eureka Server,進(jìn)行連接。
  • 定期從 Eureka 更新、過濾服務(wù)和實(shí)例列表。
  • 根據(jù)負(fù)載均衡策略,從注冊(cè)表中選擇一個(gè)真正的實(shí)例地址。
  • 通過 Rest Client 對(duì)服務(wù)發(fā)起調(diào)用。

一次性講明白Spring Cloud核心組件

可以看到,Ribbon 背后,還是采用的 HTTP 協(xié)議進(jìn)行交互。看以下代碼,就可以直接實(shí)現(xiàn)對(duì)遠(yuǎn)端服務(wù)的調(diào)用:

  1. @Bean 
  2. @LoadBalanced 
  3. RestTemplate restTemplate(){ 
  4.     return new RestTemplate(); 
  5. ... 
  6.  
  7.  @Autowired 
  8. RestTemplate restTemplate; 
  9. public String test() { 
  10.     return restTemplate.getForObject("http://test-service/test", String.class); 

Ribbon 的 Filter 會(huì)查找 Test-Service,并替換成相應(yīng)的實(shí)例地址。

一次性講明白Spring Cloud核心組件

Ribbon 不僅僅提供了輪詢的策略,還有其他的,比如:

  • 隨機(jī) Random
  • 根據(jù)響應(yīng)時(shí)間加權(quán)
  • 自定義

拿輪詢來說,最終的選擇邏輯就在 RoundRobinRule 類中:

  1. private int incrementAndGetModulo(int modulo) { 
  2.         for (;;) { 
  3.             int current = nextServerCyclicCounter.get(); 
  4.             int next = (current + 1) % modulo; 
  5.             if (nextServerCyclicCounter.compareAndSet(currentnext)) 
  6.                 return next
  7.         } 

為簡(jiǎn)化代碼而生:Feign

可以看到,Ribbon 需要自己構(gòu)建 HTTP 請(qǐng)求,模擬 HTTP 請(qǐng)求然后使用 RestTemplate 發(fā)送給其他服務(wù),步驟相當(dāng)繁瑣。而且返回類型不安全,也表達(dá)不出什么語(yǔ)義。

其實(shí),通過 Ribbon 方式,已經(jīng)能夠完成微服務(wù)之間的調(diào)用了。但 Spring Cloud 的開發(fā)語(yǔ)言是 Java,肯定要進(jìn)行更加高級(jí)的封裝,才能體現(xiàn)它的逼格。

Feign 得益于 Java 的動(dòng)態(tài)代理機(jī)制,最終封裝出一套簡(jiǎn)潔的接口調(diào)用方式,將需要調(diào)用的其他服務(wù)的方法定義成抽象方法即可,不需要自己構(gòu)建 HTTP 請(qǐng)求。

一次性講明白Spring Cloud核心組件

首先,F(xiàn)eign 會(huì)根據(jù) @FerignClient 注解,通過動(dòng)態(tài)代理,創(chuàng)建一個(gè)動(dòng)態(tài)代理類。

接下來,你只要通過調(diào)用接口的方式,就可以構(gòu)造上面提到的 Ribbon 調(diào)用參數(shù),這個(gè)過程會(huì)自動(dòng)填充。最后,通過構(gòu)造的 Ribbon 請(qǐng)求,發(fā)起真正的調(diào)用,并通過反射組裝返回值。

所以,F(xiàn)eign 只是一層皮,最終還是要通過 Ribbon 進(jìn)行調(diào)用。在我看來,把 Ribbon 和 Feign 合成一個(gè)組件,也是合理的。

它們有一個(gè)比較通用的名詞,就叫做 RPC(遠(yuǎn)程調(diào)用)。

異常的保護(hù)傘:斷路器 Hystrix

下面以一個(gè)支付請(qǐng)求為例,說一下不是風(fēng)平浪靜的情況下,服務(wù)會(huì)有什么反應(yīng)。

每一個(gè)真正的支付請(qǐng)求,都會(huì)調(diào)用其他四個(gè)服務(wù)。首先,使用鑒權(quán)服務(wù),獲取用戶的支付權(quán)限;然后,風(fēng)控服務(wù)會(huì)做一些規(guī)則驗(yàn)證。

為了更好的推銷產(chǎn)品,會(huì)調(diào)用營(yíng)銷業(yè)務(wù),獲取一些推薦信息;最后,調(diào)用聚合支付服務(wù),進(jìn)行真正的支付。

其中,營(yíng)銷業(yè)務(wù)其實(shí)是可有可無的。讓用戶首先把錢花出去,是我們的首要任務(wù)。

考慮下面一種場(chǎng)景,營(yíng)銷業(yè)務(wù)由于系統(tǒng)故障或者負(fù)載問題,發(fā)生了大面積的不可用或者超時(shí)。然后,所有的請(qǐng)求都卡在了獲取營(yíng)銷信息的代碼上。

如圖所示,鑒權(quán)和風(fēng)控都已經(jīng)通過了。因?yàn)橐粋€(gè)旁路功能:營(yíng)銷業(yè)務(wù),導(dǎo)致真正的支付無法進(jìn)行。這個(gè)時(shí)候,如果有人調(diào)用支付請(qǐng)求,會(huì)發(fā)現(xiàn)支付請(qǐng)求也出錯(cuò)了。

因?yàn)樗鼈冏罱K都卡在了營(yíng)銷這一段小代碼上:

一次性講明白Spring Cloud核心組件

所以,對(duì)于營(yíng)銷業(yè)務(wù)這種不是鏈路上必備的服務(wù)提供者,要有一個(gè)手段,讓它在發(fā)生問題的時(shí)候,隔離它一段時(shí)間。

負(fù)責(zé)這個(gè)功能的組件,就叫做 Hystrix。以我們編程的思維來說,這就是個(gè) if 條件:

  1. if(服務(wù)發(fā)生問題){ 
  2.     return "暫時(shí)不要處理"

但我們不能這么編碼在業(yè)務(wù)代碼里。所以 Hystrix 對(duì)每個(gè)服務(wù)開了一個(gè)線程池,并有比較復(fù)雜的規(guī)則,來控制這些出問題的服務(wù)的行為。

比如,在2分鐘內(nèi),直接返回營(yíng)銷業(yè)務(wù)的默認(rèn)結(jié)果,而不是一直卡在那里。

這個(gè)過程,就叫熔斷。就像電源一樣,出了問題,先切斷保險(xiǎn)絲,別把電器給燒了。

此網(wǎng)關(guān)非彼網(wǎng)關(guān):Zuul

API 網(wǎng)關(guān)是一個(gè)反向的路由,它屏蔽了內(nèi)部的細(xì)節(jié),為調(diào)用者提供了統(tǒng)一的入口。

網(wǎng)關(guān),其實(shí)是一堆過濾器的幾何,可以實(shí)現(xiàn)一系列和業(yè)務(wù)無關(guān)的橫切面功能。

熟悉 Spring 的都知道 AOP,路由的一個(gè)功能,就是針對(duì)于分布式服務(wù)的一個(gè) AOP。

還是先說下網(wǎng)關(guān)的職責(zé)吧。簡(jiǎn)單羅列幾個(gè):

  • 安全認(rèn)證。提供統(tǒng)一的認(rèn)證方式和鑒權(quán)功能,避免重復(fù)開發(fā)。
  • 熔斷,限流。針對(duì)問題服務(wù),進(jìn)行熔斷操作;對(duì)流量進(jìn)行預(yù)估,限制訪問。
  • 日志監(jiān)控。統(tǒng)一流量入口,進(jìn)行流量分析和監(jiān)控。
  • 屏蔽內(nèi)部細(xì)節(jié),對(duì)外提供一致的接口。
  • 實(shí)現(xiàn)灰度。使用自定義策略實(shí)現(xiàn)分流,達(dá)到測(cè)試的目的。

網(wǎng)關(guān)的位置,大體就如下圖:

一次性講明白Spring Cloud核心組件

可以看到,我們平常用的 Nginx,就可以當(dāng)作網(wǎng)關(guān)。但對(duì)于微服務(wù)來說,Nginx 的配置實(shí)在是太麻煩了。

不是說 Nginx 功能不夠強(qiáng)大,而是因?yàn)樗鼈儾皇且粋€(gè)體系的,就存在整合成本(比如 Kong)。

Zuul 就不一樣了,它和 Spring Cloud 的其他組件,是一家子的。一家子的,當(dāng)然會(huì)特殊照顧。

Zuul 本身就是一個(gè) Servlet,外部請(qǐng)求經(jīng)過一系列 Filter 后,會(huì)達(dá)到真正的服務(wù)。上面說的熔斷器,就是高度集成的。

一張聚合圖

有了上面關(guān)鍵組件,事情就明了的多了。我們把它放在一張圖中,就是下面的樣子:

一次性講明白Spring Cloud核心組件 

我們將其簡(jiǎn)化一下,就可以得到一張更簡(jiǎn)潔的圖。可以看到,只需要 3 個(gè)關(guān)鍵點(diǎn):

  • 服務(wù)注冊(cè)中心,統(tǒng)一管理所有服務(wù)的信息,默認(rèn)組件是 Eureka。
  • RPC,網(wǎng)絡(luò)通信組件,服務(wù) A 怎么調(diào)用服務(wù) B。在 Spring Cloud 中,就是 Ribbon+Feign。
  • 網(wǎng)關(guān),拆分的服務(wù)怎么暴露接口,最終見人的樣子。默認(rèn)組件是 Zuul。

一次性講明白Spring Cloud核心組件

一點(diǎn)道理

處理雜亂無章的事情,最有效的途徑,就是集權(quán)和中心化。集權(quán)和中心化的核心就是授權(quán)或者認(rèn)同,否則注定失敗。

授權(quán)是對(duì)上,各位當(dāng)權(quán)者應(yīng)該同意我的做法,所以我需要用極其易懂的語(yǔ)言,去說服他們接受這個(gè)體系;認(rèn)同,是對(duì)下,最好是從人民的抱怨聲中,出具的改善措施,所以要權(quán)威專業(yè)。

和微服務(wù)一樣,需要給一些陳舊的概念,強(qiáng)行賦予看起來比較自然的新意義。比如我把統(tǒng)一語(yǔ)言,叫做文化融合,就顯得高大上一些。

第二個(gè),就是把職責(zé)拆的足夠細(xì)。夠細(xì)才能夠精,每個(gè)位置上的人才能各司其職。

還有一點(diǎn),整個(gè)過程,要能夠系統(tǒng)化,能夠進(jìn)行推演。如果一件事有著不可預(yù)料的后果,那是冒險(xiǎn)家干的事情。

一些途徑

為了對(duì)世界進(jìn)行初步的了解,我成立了資源統(tǒng)計(jì)部,對(duì)山川河流進(jìn)行了初步的勘查,繪制出有章可循的地圖。對(duì)社會(huì)的現(xiàn)狀和錯(cuò)綜復(fù)雜的關(guān)系進(jìn)行了摸底。

我把這些信息出版成圖書,遭到藏寶圖收藏者們的嫉妒和憎惡。他們躲藏在不為人知的角落,齷齪行事。

我還選了一個(gè)自己覺得好聽的方言,統(tǒng)一了每個(gè)諸侯國(guó)的語(yǔ)言。在推行的過程中,多次受到土著們強(qiáng)烈的反對(duì),拒不改正。被我強(qiáng)行斬首了幾個(gè)之后,以后的推行,就快的多了。

對(duì)于所有的重要商品,進(jìn)行了集中管控。這個(gè)世界貴重的不是黃金,而是食物,所以我還修建了四通八達(dá)的道路和無孔不入的交易中心。

從此之后,很少餓死過人。由于這部分是在我的控制范圍內(nèi),所以進(jìn)行的很順暢。

G 國(guó)的民風(fēng)比較彪悍,經(jīng)常發(fā)生暴力事件。這也難免,從剛開始,這個(gè)國(guó)家就難以馴化。好在缺了他們,這個(gè)系統(tǒng)也能循環(huán)的下去。

前不久 G 國(guó)又發(fā)生了重大的事件,所有其他國(guó)家聯(lián)合抵制,禁止 G 國(guó)國(guó)民入境。但時(shí)間是化解傷痛的良藥,我估計(jì)這樣的限制不會(huì)持續(xù)很久。

但糟粕還是有的。有人的地方,就有江湖,就有壓迫。但這樣的糟粕我是不想讓其他人看到的。

來訪的使者,應(yīng)該只能夠看到歌舞升平、安居樂業(yè),這注定了不能讓他們和底層接觸,否則就發(fā)現(xiàn)金玉其外敗絮其中的現(xiàn)狀了。

他們和外交官打的不亦樂乎,我很欣慰。

結(jié)語(yǔ)

我清楚的知道,為了建立一個(gè)和諧自然的系統(tǒng),曾經(jīng)花費(fèi)了多大的代價(jià)。這其中的組成部分,并不能總是完美無缺的運(yùn)行。

而且,在這個(gè)看似平和的整體上,就滋生了其他無數(shù)令人頭痛的問題 ,不過這是另外一個(gè)話題了。

就是這樣。我所做的一切,我所有的期望,只不過是為了:當(dāng)新的機(jī)會(huì)在我身后,我能夠從容的、華麗的轉(zhuǎn)身。

這就是我為了有一天能夠穿越,所做的準(zhǔn)備。

一次性講明白Spring Cloud核心組件

 

責(zé)任編輯:未麗燕 來源: 51CTO技術(shù)棧
相關(guān)推薦

2024-04-26 10:12:38

混合訓(xùn)練AI集群

2014-08-04 14:38:25

LinuxToken

2024-02-28 08:18:13

Java日志項(xiàng)目

2013-04-17 09:16:37

2020-07-08 15:30:29

Java面試題代碼

2022-05-19 12:14:22

分布式開發(fā)框架

2025-02-26 08:30:00

Spring分布式事務(wù)Java

2023-11-03 08:27:46

2021-08-12 09:48:21

Webpack Loa工具Webpack

2023-09-26 07:11:15

KubernetesJob節(jié)點(diǎn)

2022-06-20 07:32:17

ES映射搜索

2022-09-15 14:05:02

ES開源

2009-12-25 14:46:53

Windows 7文件關(guān)聯(lián)

2014-03-06 15:16:18

安全管理linux安全

2010-11-24 16:32:50

2012-09-18 15:04:31

Office 2013微軟

2011-04-18 13:36:42

2021-07-26 09:56:19

AI 數(shù)據(jù)人工智能

2012-02-01 16:48:54

后門Putty

2024-04-03 09:00:10

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩在线视频一区 | 欧美一级毛片在线播放 | 日本不卡免费新一二三区 | 国产精品久久视频 | 午夜免费网站 | 日韩精品成人免费观看视频 | 日韩中文一区二区三区 | 精品久久久久久 | 久久久久99| 日韩精品一区二区三区 | 国产精品久久久久久久久免费樱桃 | 亚洲成人av| 99热热99 | 成人av一区二区在线观看 | 国产成人午夜电影网 | 欧美日韩国产在线观看 | 精品国产精品三级精品av网址 | 欧美成人一区二区三区 | 4hu最新网址| 97av在线 | 精品国产一区二区三区性色 | 欧美色综合天天久久综合精品 | 一区二区三区回区在观看免费视频 | 久久久国产精品一区 | 欧美亚洲国产日韩 | 国产精品大片在线观看 | 日日摸日日添日日躁av | 久久久久久久香蕉 | 欧美一级片免费看 | 二区视频 | 国产精品久久久久aaaa | 久久精品色欧美aⅴ一区二区 | 中文字幕乱码一区二区三区 | 国产精品99久久免费观看 | 国产高清视频在线观看 | 精品久久香蕉国产线看观看亚洲 | 国产区一区 | www四虎com| 成人一区二区在线 | 国产在线观看一区二区 | 色悠悠久 |