學習初衷
因為加了不少優秀的知識星球,結交了更多的小伙伴,加了更多的群,每每在自我介紹的時候,都說自己是Android & Java攻城獅。
然鵝,有的小伙伴就來問了,你是搞Java的,那對Spring很熟悉咯?哦,大佬,Spring Cloud搞的怎么樣了呢?我是微服務的開發,期待和你一起交流......這樣來交流的朋友,我覺得自己很慚愧。
其實我是個中間件開發。我目前的技術棧是基於Netty、WebSocket在開發一款聊天服務器,所以這些我並不會啊。可是,也確實一直在圈內聽到微服務這個字眼,知道很多公司已經在使用微服務用的很熟悉了,我要是再跟不上,那就真的得跪了。所以,給自己定了一個小目標,必須開啟微服務之旅,哪怕只是練手。
微服務,我來啦
小編參考的書籍是【猿天地】的號主,尹吉歡撰寫的《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。版本選擇很重要,版本選擇很重要,版本選擇很重要,重要的事情說三遍,版本選擇如何,決定你之后編程的路好不好走。
微服務踩坑之旅
因為選擇了最新的版本,很多資料也就不怎么存在了,好在Spring Cloud 2.x版本通過搜索還是能找到一部分資料的,而且多虧有尹大的在線幫助,在學習的過程中也是避開了一部分困難。
這部分我叫他踩坑之旅,就是因為在實踐過程中,遇到了不少問題,都是一步一步調試過來的,確實很艱辛。想必也是大家比較想看的部分,馬上呈上來。
- 導入Spring Boot 2.1.5 版本就開始報錯了
在pom.xml文件的第一個行,總是報“Maven Configuration Problem,Unknwon”,很無語有木有,你報錯就報錯唄,還給我來了一個unkown,讓我無從下手。
這次的答案,是在Stackoverflow上找到了答案,說明如下
照着這個步驟,我所在的環境是解決了,如果你有類似的報錯,以及還沒有完美解決,可以互相交流交流。
- 導入的dependency遇到missing
這里有一類問題,小編剛開始入門,學習的是注冊,那就得用到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開啟驗證,登錄的用戶名和密碼始終錯誤
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開啟關閉認證方式
繼續上一個問題的補充,在開啟驗證的時候,老版本是需要在配置文件里將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小時來排查問題,等到夜深人靜的時候,小編又在報錯看了又看,看了又看,把眼淚都看出來了。好的,最終決定去刪除一下依賴包。
就在小編沒報任何希望的時候,代碼竟然過了,跑的不亦樂乎。寫程序的你,能感受到那份興奮吧。噢,如果你是大拿,那可能不會這么強烈,不過我是達到高潮了,這個必須高潮。在此之前,小編在知識星球上求助了,貼子剛發完,沒想到啊沒想到,看來有時候不逼自己一把,還真不知道自己潛力有多少。
- Feign整合Hystrix又有錯
錯誤真的是一環扣一環,每次學習完這個組件,馬上進入下一個組件,開始功能整合的時候,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
這本書的第一階段就快學完了,小編甚是興奮。本以為到最后了,該解決的問題基本都差不多了,該遇到的問題基本上也都遇到過了,呵呵,太年輕。
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開發的標簽了,也不能更好地和朋友們做技術交流。想到這里,我就會去泡杯咖啡,洗把臉,繼續回來努力着,堅持着,奮斗着,或許這就是技術的魅力所在吧。
愛生活,愛學習,愛感悟,愛挨踢