跳到主要內容

發表文章

目前顯示的是 10月, 2019的文章

spring源碼解析之IOC容器(二)------加載和註冊

  上一篇跟蹤了IOC容器對配置文件的定位,現在我們繼續跟蹤代碼,看看IOC容器是怎麼加載和註冊配置文件中的信息的。開始之前,首先我們先來了解一下IOC容器所使用的數據結構-------BeanDefinition,它是一個上層接口,有很多實現類,分別對應不同的數據載體。我們平時開發的時候,也會定義很多pojo類,來作為獲取數據的載體。最常見的就是,從數據庫中獲取數據之後,使用一個定義的pojo來裝載,然後我們就可以在程序中使用這個pojo類來編寫各種業務邏輯。同樣,IOC容器首先會讀取配置的XML中各個節點,即各個標籤元素,然後根據不同的標籤元素,使用不同的數據結構來裝載該元素中的各種屬性的值。比如我們最熟悉的<bean>標籤,就是使用AbstractBeanDefinition這個數據結構,接下來的分析中我們可以看到。   先回到上篇資源的定位那裡,代碼如下: 1 public int loadBeanDefinitions(String location, Set<Resource> actualResources) throws BeanDefinitionStoreException { 2 ResourceLoader resourceLoader = getResourceLoader(); 3 if (resourceLoader == null ) { 4 throw new BeanDefinitionStoreException( 5 "Cannot import bean definitions from location [" + location + "]: no ResourceLoader available" ); 6 } 7 8 if (resourceLoader instanceof ResourcePatternResolver) { 9 // Resource pattern matching available. 10 ...

【拆分版】Docker-compose構建Elasticsearch 7.1.0集群

寫在前邊 搞了兩三天了,一直有個問題困擾着我,ES集群中配置怎麼能正確映射到主機上,這邊經常報 ClusterFormationFailureHelper master not discovered or elected yet. 原因是容器中的ES節點沒有正確的映射到主機上,而且容器內ip是易變的,我該怎麼配置呢? 臨下班了,終於想到個法子, 固定容器ip——使用network_mode: host 看到主機模式的我眼前一亮,容器就相當於一個主機服務,你占哪個端口就是哪個,沒有必要再去自己指定port去映射到主機。這樣只要主機ip不變,容器中ip不就沒問題了么!!! 本文內容架構圖 解釋: Master節點作為Master節點與協調節點,為防止腦裂問題,降低負載,不存數據 Node1~Node3為數據節點,不參與Master競選 TribeNode節點不存數據,不參與Master競選 準備環境 GNU/Debain Stretch 9.9 linux-4.19 Docker 18.09.6 Docker-Compose 1.17.1 elasticsearch:7.1.0 配置腳本參見我的Github <https://github.com/hellxz/docker-es-cluster.git> 宿主機環境準備參考ELK集群搭建,基於7.1.1 文中開始搭建的前四步 目錄結構 . ├── docker-es-data01 │   ├── data01 │   ├── data01-logs │   ├── docker-compose.yml │   ├── .env │   └── es-config │   └── elasticsearch.yml ├── docker-es-data02 │   ├── data02 │   ├── data02-logs │   ├── docker-compose.yml │   ...

來阿里有段時間了,談談這幾個月最真實的感受

作者:黃小斜 文章來源:微信公眾號【程序員江湖】   閱讀本文大概需要 4 分鐘。   ​   有段時間沒寫過原創了,想了各種理由,發現其實理由就一個,沒時間。   我來阿里,已經幾個月了。這段時間,最大的感受就是累。我是在今年的四月份加入阿里的。   當初我沒有參加阿里巴巴的實習,而是選擇了直接進行校園招聘,這也是因為當時我對實習的部門不感興趣,於是在校招的時候我就選擇了自己感興趣的部門,也就是現在我所在的螞蟻金服。   之前就聽說過阿里的工作強度,可能會比較大,但是,當我在真正來到這家公司的時候,才發現996,並不是虛言,這倒不是說制度上規定的 996 ,而是因為,你手上的工作,是很難做完的,所以導致你不得不用加班的方式來完成,996 最終的目的只有一個,就是你要把手上的工作做完,對其他人有一個交代。   剛來一個月的時候只其實我是非常不適應的,畢竟從學校到公司,整個變化是顛覆性的,雖然之前有過實習經歷,但是是比較划水的,和正式工作差別還是比較大的,第一個月大抵的狀態就是,每天九點多上班,晚上九點及以後下班,這是生活規律上的不適應。   除此之外,在工作上也會有一些不適應,雖然前期給我的活兒都比較的零散,只要求這裏修修補補,那裡加點東西。這倒是其次。   ​   主要的原因還是因為我對業務線的研發流程不太了解,以及對大家在做的事情不太了解,這會導致我在工作上遇到很多困難。因為我會聽不懂大家在說什麼。所以第一個月,更多的是思考。   如何去提高自己的效率,如何去融入這個公司,如何去熟悉部門的業務和技術戰,自己感覺是一個比較外向的人,所以一旦有問題就會諮詢,我的同事,我的師兄。   阿里的師兄是一種文化。就像武俠小說里的同門師兄弟一樣,師兄會帶領着你去做那些工作,並且讓你去熟悉整個部門的一些事情。我的師兄是一個寡言少語的人,但是技術能力非常強,也很有責任心。他總是對總是對工作要求特別高,不放過任何一個問題,不漏掉任何一行問題代碼。   在第一個月的時間里。我學習了很多阿里巴巴的一些中間件技術。其實這些技術。在學校複習的時候,多少也聽說...

kubernetes高級之動態准入控制

系列目錄 動態准入控制器文檔介紹了如何使用標準的,插件式的准入控制器.但是,但是由於以下原因,插件式的准入控制器在一些場景下並不靈活: 它們需要編譯到kube-apiserver里 它們僅在apiserver啟動的時候可以配置 准入鈎子(Admission Webhooks 從1.9版本開始)解決了這些問題,它允許准入控制器獨立於核心代碼編譯並且可以在運行時配置. 什麼是准入鈎子 准入鈎子是一種http回調,它接收准入請求然後做一些處理.你可以定義兩種類型的准入鈎子:驗證鈎子和變換鈎子.對於驗證鈎子,你可以拒絕請求以使自定義准入策略生效.對於變換鈎子,你可以改變請求來使自定義的默認配置生效. 體驗准入鈎子 准入控制鈎子是集群管制面板不可缺少的一部分.你在編寫部署它們時必須要警惕.如果你想要編寫/布置生產級別的准入控制器,請閱讀以下用戶指南.下面我們將介紹如何快速體驗准入鈎子. 準備工作: 確保你的kubernetes集群版本至少是1.9版本. 確保變換鈎子(MutatingAdmissionWebhook) 和驗證鈎子(ValidatingAdmissionWebhook)已經啟用.這裡是推薦開啟的一組准入控制器. 編寫一個准入鈎子服務器(admission webhook server) 請參閱已經被kubernetes e2e測試驗證通過的准入服務器鈎子( admission webhook server)的實現.這個web鈎子處理apiserver發出的 admissionReview 請求,然後把結果封裝成一個 admissionResponse 返回給請求者. admissionReview 請求可能有多個版本( v1beta1 或者 未來的v1),web鈎子可以通過 admissionReviewVersions 字段來定義它們接受的版本.apiserver會嘗試使用列表中出現的,支持的第一個版本.如果列表中的版本沒有一個是被支持的,驗證將失敗.如果webhook配置已經持久化,對web鈎子的請求將會失敗並被失敗策略控制. 示例鈎子服務器(admission webhook server)把 ClientAuth 字段留空,默認為 NoClientCert .這...

高速輸出-我們戲說緩存

前言 緩存要解決的問題是速度的問題,使用緩存的目的是為了減少對物理資源的訪問,緩存大量的應用在軟硬件的方方面面,從 CPU 到硬盤,就應用了 一級緩存、二級緩存,少部分高速緩存和大量低速緩存相結合,以提高 CPU 的計算能力,本文講的主要是系統集成項目中的軟件級別的緩存。 緩存因果圖 緩存在現代系統中的位置可以說是舉足輕重,不是可有可無的問題了,而是怎麼樣用好的問題。怎麼樣講好緩存這個話題,我思考了很久;如果是生搬硬套,我估計我肯定是涼涼,但要是上來就一頓代碼操作,顯得字太多,各位看官老爺也是要噴死我的(你們噴我算我贏)。各位看官就當故事隨便看看就好了。 客戶端緩存 小明同學是一個大學生,每個月都會從爸爸那裡領取生活費,由於爸爸給的生活費比較充裕,他就將一部分存了起來,周而復始,固定頻率,這就是瀏覽器網頁緩存;有一天,他接到爸爸的一個電話,說每個月給現金,我總是從銀行拿也不方便,這樣,咱給存銀行卡裡頭,但是說好了,每個月1號的時候轉1000塊進去,3號之前可以領取,過時不侯。這就是 Cookie!小明說爸,這時間太緊迫了,我萬一太過於專心學習忘記取錢那你兒子可是要餓死的吖,到時候沒人給你養老送終事兒就大了。他爸爸經過深思熟慮后,決定放開取現時間的限制:行,你想什麼時候取都成,就是別把卡給弄掉了就行。這就是LocalStorage/IndexDB,瀏覽器本地存儲。如果銀行卡掉了(瀏覽器重裝,刪庫跑路),那還得找爸爸。 服務器緩存 我們本次討論的重點就是服務器緩存,對於小明的爸爸來說,每次給小明生活費之前都要到銀行(數據庫)去取錢出來,實在是太麻煩,不如提前把錢取出來準備好,每次取半年的錢出來放家裡保險箱里(緩存),小明申請生活費的時候,直接給他就好了,節約時間效率又高,唯一的問題就是可能沒那麼安全,有可能被小偷把錢給偷了(緩存更新),然後就是半年時間過後再重新取一筆出來(緩存過期策略)。 靜態對象緩存 靜態對象也是一種特殊的緩存,靜態對象作用於程序的整個生命周期中。需要注意的是,靜態對象不會被 GC 回收 ,但是,如果靜態對象被多次引用覆蓋,那麼之前的引用就有可能被 GC 回收。這就好像,小明在向爸爸領取生活費的時候,發現這次領到手的錢實在是太破舊了,都不好意思花出去,爸爸只好重新給了另一份。 會話級緩存 在 Web 站...

SpringBoot啟動流程分析(五):SpringBoot自動裝配原理實現

SpringBoot系列文章簡介 SpringBoot源碼閱讀輔助篇:   Spring IoC容器與應用上下文的設計與實現 SpringBoot啟動流程源碼分析: SpringBoot啟動流程分析(一):SpringApplication類初始化過程 SpringBoot啟動流程分析(二):SpringApplication的run方法 SpringBoot啟動流程分析(三):SpringApplication的run方法之prepareContext()方法 SpringBoot啟動流程分析(四):IoC容器的初始化過程 SpringBoot啟動流程分析(五):SpringBoot自動裝配原理實現 SpringBoot啟動流程分析(六):IoC容器依賴注入 筆者註釋版Spring Framework與SpringBoot源碼git傳送門:請不要吝嗇小星星 spring-framework-5.0.8.RELEASE SpringBoot-2.0.4.RELEASE 自定義Starter:   SpringBoot應用篇(一):自定義starter 一、前言   上一篇文章,通過分析refresh()方法中的invokeBeanFactoryPostProcessors()方法,分析了IoC容器的初始化過程,這一節從代碼上如下所示,接上一節ConfigurationClassParser類中的parse()方法,接着分析SpringBoot的自動裝配原理。 1 // ConfigurationClassParser類 2 public void parse(Set<BeanDefinitionHolder> configCandidates) { 3 this .deferredImportSelectors = new LinkedList<> (); 4 for (BeanDefinitionHolder holder : configCandidates) { 5 BeanDefinition bd = holder.getBeanDefinition(...