由於加了很多優秀的知識星球,結交了更多的小夥伴,加了更多的羣,往往在自我介紹的時候,都說本身是Android & Java攻城獅。java
然鵝,有的小夥伴就來問了,你是搞Java的,那對Spring很熟悉咯?哦,大佬,Spring Cloud搞的怎麼樣了呢?我是微服務的開發,期待和你一塊兒交流......這樣來交流的朋友,我以爲本身很慚愧。web
其實我是個中間件開發。我目前的技術棧是基於Netty、WebSocket在開發一款聊天服務器,因此這些我並不會啊。但是,也確實一直在圈內聽到微服務這個字眼,知道不少公司已經在使用微服務用的很熟悉了,我要是再跟不上,那就真的得跪了。因此,給本身定了一個小目標,必須開啓微服務之旅,哪怕只是練手。spring
小編參考的書籍是【猿天地】的號主,尹吉歡撰寫的《Spring Cloud微服務》。這裏還得感謝【明哥的江湖】號主明哥的贈書,也算是給我節省了買書的飯錢。編程
初次接觸Spring Cloud,一看到各類版本,剛開始有點懵逼。給你們看下最新的Spring Cloud的版本是什麼樣子的。安全
這些版本名稱的命名方式採用了倫敦地鐵站的名稱,同時根據字母表的順序來對應版本時間順序。好比最先的Release版本:Angel,第二個Release版本:Brixton,而後是Camden、Dalston、Edgware、Finchley,Gerrnwich,如今最新的快照版本是Hoxton了。服務器
SNAPSHOT:快照版本,隨時可能修改
SR:Service Release,SR1表示第一個正式版本,通常同時標註GA:(GenerallyAvailable),表示穩定版本。架構
因此小編在這裏選擇了最新的Greenwich SR1版本。相對應的,Spring Boot在官網裏,也會有介紹。Greenwich對應的就是2.1.x,由於小編是初學,因此也用了最新的版本,2.1.5 Release。版本選擇很重要,版本選擇很重要,版本選擇很重要,重要的事情說三遍,版本選擇如何,決定你以後編程的路好很差走。maven
由於選擇了最新的版本,不少資料也就不怎麼存在了,好在Spring Cloud 2.x版本經過搜索仍是能找到一部分資料的,並且多虧有尹大的在線幫助,在學習的過程當中也是避開了一部分困難。ide
這部分我叫他踩坑之旅,就是由於在實踐過程當中,遇到了很多問題,都是一步一步調試過來的,確實很艱辛。想必也是你們比較想看的部分,立刻呈上來。微服務
在pom.xml文件的第一個行,老是報「Maven Configuration Problem,Unknwon」,很無語有木有,你報錯就報錯唄,還給我來了一個unkown,讓我無從下手。
此次的答案,是在Stackoverflow上找到了答案,說明以下
照着這個步驟,我所在的環境是解決了,若是你有相似的報錯,以及尚未完美解決,能夠互相交流交流。
這裏有一類問題,小編剛開始入門,學習的是註冊,那就得用到eureka組件。書中用的版本是Dalston版本,Sping boot用了1.5.x的,因此導入的依賴就是
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency>
可是,這個在升級的版本里就報錯了,硬是沒找到依賴。後面還有好幾個須要用到spring-cloud-starter-xxx的地方,都會報相同的錯誤。好比
<artifactId>spring-cloud-starter-hystrix</artifactId>
也是如此。遇到此類狀況,咱們須要更換下地址,得把netflix這個重要的加上,加這個的緣由,不只僅是爲了升級,我想也是Netflix公司爲了更好的宣傳自家的產品吧。解決方案就是
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
本來覺得這個套路很深,都加netflix就搞定了,可是遇到feign組件的是,這個不奏效了,攤手。
<artifactId>spring-cloud-starter-feign</artifactId>
加了netflix也不奏效,好吧,繼續努力尋找答案去唄。由於這裏找的資料比較多了,來源有點不清晰,最後的結果就是將這個依賴改爲以下便可
<artifactId>spring-cloud-starter-openfeign</artifactId>
eureka開啓驗證以後,須要在配置文件裏把用戶名和密碼配置上去,不然就會有默認的用戶名「user」,以及在控制檯自動生成一串密碼供咱們登陸。
小編剛開始的配置,仍是按照書上寫的
用戶名 security.user.name=xxx 密碼 security.user.password=xxx
結果啓動的時候,看到控制檯上仍是生成了一串密碼,而且輸入了本身在配置文件中的用戶名和密碼,都是進不了註冊後臺的。這個時候,就完全懵逼了,代碼也看不到錯誤,配置文件錯誤的話,也看不到啥信息,如何是好。
最後,小編在CSDN上找到一篇名爲《security.basic.enabled 配置過期或不可用》的文章裏,看到了,2.x版本的屬性配置,是須要加前綴spring的,也就是以下:
spring.security.user.name=xxx spring.security.user.password=xxx
繼續上一個問題的補充,在開啓驗證的時候,老版本是須要在配置文件裏將eureka開關打開,也就是用
security.basic.enabled=true
只不過當小編把值改爲false的時候,仍是出現須要用戶名和密碼登陸的驗證框。在沒看上一篇的解決方案以前,也確實有點不知所措,後來看了CSDN的那篇解決方案下面就有了答案。
結合其餘地方的資料,總結起來就是:舊版本的Spring Security的依賴是能夠在配置文件內容直接通security.basic.enabled參數進行開啓basic認證,不過目前版本已經被廢除,既然這種方式不可行,那咱們就使用另一種方式進行配置,經過繼承WebSecurityConfigurerAdapter安全配置類來完成開啓認證權限
@EnableWebSecurity static class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable().authorizeRequests() .anyRequest() .authenticated() .and() .httpBasic(); } }
這裏小編遇到了兩次,解決方式都是一樣的。第一個是遇到Caused by: java.lang.ClassNotFoundException: com.google.common.collect.Lists。
在這裏,網上有朋友就說了,若是在查閱完代碼,發現沒有問題的時候,那麼有一種多是你的此依賴包並無下載完整。記住這個重點哦,小編就是由於第一次遇到的時候沒在乎,第二次還碰到了。
第一次出現的時候,小編直接看到就去刪了maven的依賴,在這個錯誤下刪除的路徑是「/repository/com/google/guava/guava」 ,而後就能夠編譯成功,並執行完成了。到第二次,我居然又踩坑。
第二次的錯誤是一堆堆棧報錯
看到小編劃的紅線了沒,其實這個時候,已經很明確告訴咱們是沒找到包下的類,可是小編一開始並無仔細看這個錯,而是去搜索引擎上查找答案。此次遇到麻煩了,全網就一篇相似的文章,還各類中文簡體、繁體、英文大肆的寫,可能對當時的場景有用,對咱們這個場景沒啥幫助。
此次,由於沒有仔細吸收上次的教訓,小編花了3小時來排查問題,等到夜深人靜的時候,小編又在報錯看了又看,看了又看,把眼淚都看出來了。好的,最終決定去刪除一下依賴包。
就在小編沒報任何但願的時候,代碼居然過了,跑的不亦樂乎。寫程序的你,能感覺到那份興奮吧。噢,若是你是大拿,那可能不會這麼強烈,不過我是達到高潮了,這個必須高潮。在此以前,小編在知識星球上求助了,貼子剛發完,沒想到啊沒想到,看來有時候不逼本身一把,還真不知道本身潛力有多少。
錯誤真的是一環扣一環,每次學習完這個組件,立刻進入下一個組件,開始功能整合的時候,Bug老是不停地向你招手,招手,要是小姐姐也就算了,惋惜她不是呀。
在微服務架構中,Hystrix除了實現容錯外,還提供了實時監控功能。在服務調用時,Hystrix會實時累積關於HystrixCommand的執行信息,好比每秒的請求數、成功數等。
當你啓動了Hystrix,而且輸入http://localhost:8082/hystrix.stream這個地址的時候,本來咱們指望看到的結果是能在頁面中看到"ping"請求,以及請求的""data"數據,可是此次小編並無看到。
看過前面遇到的這麼多錯,想必你也知道,這是由於新版本引發了的吧。這個還好說,把地址改爲http://localhost:8082/actuator/hystrix.stream,
Actuator 2.x 之後endpoints所有在/actuator下,能夠經過management.endpoints.web.base-path修改)
management.endpoints.web.exposure.include=*
這本書的第一階段就快學完了,小編甚是興奮。本覺得到最後了,該解決的問題基本都差很少了,該遇到的問題基本上也都遇到過了,呵呵,太年輕。
Zuul在自定義異常上換包名了。其中其中的ErrorAttributes,ErrorController,DefaultErrorAttributes在SpringBoot 2.x的時候都轉到org.springframework.boot.web.servlet.error包中,本來是在org.springframework.boot.autoconfigure.web上的。
因此,原先使用的
public Object errorApiHandler(HttpServletRequest request,boolean includeStackTrace) { RequestAttributes requestAttributes = new ServletRequestAttributes(request); Map<String, Object> attr = this.errorAttributes.getErrorAttributes((WebRequest)requestAttributes,includeStackTrace); ...... }
就不能這麼使用了,得把代碼換成
public Object errorApiHandler(HttpServletRequest request,boolean includeStackTrace) { WebRequest webRequest=new ServletWebRequest(request); Map<String, Object> attr = this.errorAttributes.getErrorAttributes(webRequest, includeStackTrace); ...... }
至此,在學完《Spring Cloud微服務》的準備篇和基礎篇以後,小編算是見識到了微服務的厲害。
也由於小編選擇了新版本,有部分問題出現的時候並不能第一時間在網上找到解決方案,這就讓本身對微服務的研究更加深刻。其實一開始,小編連版本都不知道怎麼選,都不知道剛開始接觸的時候,是哪來的自信。
微服務社區如今已經很強大了,小編在找資料的過程當中,不少疑問都是經過Netflix在GitHub上的issue找到的答案,還有尹大的GitHub上也給了我很大的幫助。這些都是寶貴的經驗所在。以及尹大的【猿天地】知識星球,在那裏提出問題,尹大說了,我就是在最專業的星球裏,讓我不能畏首畏尾,儘管放馬過去。
除了須要好好使用搜索引擎以外,小編最大的感觸就是要看官方文檔,看官方文檔,看官方文檔,不少文章確定也是根據官方文檔得出的答案,在使用過程當中,小編有部分問題也是在那裏解決的。此次學習,單獨整理了一個微服務的書籤,天天看着裏面的數量在增長,問題在減小,幫我一步步完成了小白到入門的進化,非常欣慰。
學習是艱辛的,尤爲是遇到困擾了3小時的問題,還束手無策的時候,都想過放棄。可是,放棄了,我就不能在其餘地方更好地給本身貼上Java開發的標籤了,也不能更好地和朋友們作技術交流。想到這裏,我就會去泡杯咖啡,洗把臉,繼續回來努力着,堅持着,奮鬥着,或許這就是技術的魅力所在吧。
愛生活,愛學習,愛感悟,愛挨踢