springcloud面試題常用注解,spring
夕逆IT
- 軟件開(kāi)發(fā)
- 2023-08-13
- 87

老鐵們,大家好,相信還有很多朋友對(duì)于springcloud面試題常用注解和spring的相關(guān)問(wèn)題不太懂,沒(méi)關(guān)系,今天就由我來(lái)為大家分享分享springcloud面試題常...
老鐵們,大家好,相信還有很多朋友對(duì)于springcloud面試題常用注解和spring的相關(guān)問(wèn)題不太懂,沒(méi)關(guān)系,今天就由我來(lái)為大家分享分享springcloud面試題常用注解以及spring的問(wèn)題,文章篇幅可能偏長(zhǎng),希望可以幫助到大家,下面一起來(lái)看看吧!
springcloud-feign實(shí)現(xiàn)原理,如何實(shí)現(xiàn)負(fù)載均衡
首先說(shuō)明一下,feign只是一個(gè)聲明式的Http客戶端,提供以聲明式的方式定義Http調(diào)用。本身并沒(méi)有實(shí)現(xiàn)負(fù)載均衡,負(fù)載均衡是ribbon實(shí)現(xiàn)的,feign只是使用而已。
我從不使用feign進(jìn)行接口調(diào)用開(kāi)始,到使用feign進(jìn)行接口調(diào)用,來(lái)說(shuō)明使用和不使用feign的區(qū)別以及如何實(shí)現(xiàn)負(fù)載均衡的。
不使用Feign的調(diào)用不使用Feign的情況下,進(jìn)行接口調(diào)用,一般都是使用Spring提供的RestTemplate。RestTempate提供了很多調(diào)用接口的方法,你可以簡(jiǎn)單的把RestTemplate理解為是Spring提供的HttpClient。
如果要實(shí)現(xiàn)負(fù)載均衡,那么只需要加一個(gè)LoadBalanced注解,就像下面這樣:
那它是怎么實(shí)現(xiàn)負(fù)載均衡的呢?簡(jiǎn)單梳理一下源碼:
LoadBalancerAutoConfiguration中有下面這段代碼,它會(huì)將所有有LoadBalanced注解的RestTemplate注入進(jìn)來(lái)
然后通過(guò)下面的邏輯,將負(fù)載均衡邏輯給添加進(jìn)去
RestTemplate會(huì)在執(zhí)行之前,先執(zhí)行攔截器,然后去執(zhí)行最終的請(qǐng)求
而攔截器中有負(fù)載均衡邏輯
首先客戶端從服務(wù)列表中獲取到所有的服務(wù)列表信息
客戶端按照負(fù)載均衡算法邏輯,選擇一個(gè)服務(wù)進(jìn)行調(diào)用具體代碼流程比較復(fù)雜,這里不具體說(shuō)明,后續(xù)可能會(huì)專門寫(xiě)幾篇關(guān)于SpringCloud源碼分析的文章問(wèn)題使用RestTemplate有什么問(wèn)題呢?
和RestTemplate強(qiáng)依賴,不利于擴(kuò)展或重構(gòu)
和本地接口調(diào)用方式不統(tǒng)一
我們來(lái)看看使用Feign后會(huì)變成什么情況。使用Feign假設(shè)我要調(diào)用一個(gè)遠(yuǎn)程接口,獲取用戶的信息。那么我們可以這么寫(xiě):
1處,注解UserApiService為FeignClient,其中的name是需要調(diào)用的應(yīng)用的AppName,即注冊(cè)到注冊(cè)中心上的名字
2處,聲明調(diào)用的接口的地址和Method,這里是/api/getuserinfo,GET請(qǐng)求。1、2結(jié)合,即該接口訪問(wèn)的地址是GEThttp://USER/api/getuserinfo3處,請(qǐng)求的參數(shù)。完整的請(qǐng)求是GEThttp://USER/api/getuserinfo?userName=ivan&password=123456怎么調(diào)用呢?
調(diào)用方式是不是和普通的接口一樣?調(diào)用端根本就不必關(guān)系UserApiService是一個(gè)本地實(shí)現(xiàn),還是一個(gè)遠(yuǎn)程調(diào)用。這就解決了上面提到的兩個(gè)問(wèn)題。
springcloud熔斷怎么實(shí)現(xiàn)
SpringCloud框架里熔斷機(jī)制通過(guò)Hystrix實(shí)現(xiàn)。
熔斷機(jī)制是賭贏雪崩效應(yīng)的一種微服務(wù)鏈路保護(hù)機(jī)制。
當(dāng)扇出鏈路的某個(gè)微服務(wù)不可用或者響應(yīng)時(shí)間太長(zhǎng)時(shí),會(huì)進(jìn)行服務(wù)的降級(jí),進(jìn)而熔斷該節(jié)點(diǎn)微服務(wù)的調(diào)用,快速返回錯(cuò)誤的響應(yīng)信息。檢測(cè)到該節(jié)點(diǎn)微服務(wù)調(diào)用響應(yīng)正常后恢復(fù)調(diào)用鏈路。在SpringCloud框架里熔斷機(jī)制通過(guò)Hystrix實(shí)現(xiàn)。Hystrix會(huì)監(jiān)控微服務(wù)間調(diào)用的狀況,當(dāng)失敗的調(diào)用到一定閥值缺省是5秒內(nèi)20次調(diào)用失敗,就會(huì)啟動(dòng)熔斷機(jī)制。熔斷機(jī)制的注解是:@HystrixCommand。
springcloud組件fegin到底該不該使用繼承特性
Feign使用繼承特性,可以減少編碼量,也保證了路徑映射和參數(shù)的一致性。但是會(huì)導(dǎo)致服務(wù)提供者和服務(wù)消費(fèi)者的耦合度太高,如果服務(wù)提供者修改了一個(gè)接口的定義,服務(wù)消費(fèi)者也需要相應(yīng)的修改,進(jìn)而帶來(lái)很多未知的工作量,所以要慎重考慮。
FeginSpringCloudFeign是一套基于NetflixFeign實(shí)現(xiàn)的聲明式服務(wù)調(diào)用客戶端。它使得編寫(xiě)Web服務(wù)客戶端變得更加簡(jiǎn)單。我們只需要通過(guò)創(chuàng)建接口并用注解來(lái)配置它既可完成對(duì)Web服務(wù)接口的綁定。它具備可插拔的注解支持,包括Feign注解、JAX-RS注解。它也支持可插拔的編碼器和解碼器。SpringCloudFeign還擴(kuò)展了對(duì)SpringMVC注解的支持,同時(shí)還整合了Ribbon和Eureka來(lái)提供均衡負(fù)載的HTTP客戶端實(shí)現(xiàn)。
Feign原理Feign通過(guò)處理注解,將請(qǐng)求模板化,當(dāng)實(shí)際調(diào)用的時(shí)候,傳入?yún)?shù),根據(jù)參數(shù)再應(yīng)用到請(qǐng)求上,進(jìn)而轉(zhuǎn)化成真正的Request請(qǐng)求。通過(guò)Feign以及JAVA的動(dòng)態(tài)代理機(jī)制,使得Java開(kāi)發(fā)人員,可以不用通過(guò)HTTP框架去封裝HTTP請(qǐng)求報(bào)文的方式,完成遠(yuǎn)程服務(wù)的HTTP調(diào)用。
微服務(wù)啟動(dòng)啟動(dòng)時(shí),F(xiàn)eign會(huì)進(jìn)行包掃描,掃描所有包下@FeignClient注解的接口,按照注解的規(guī)則,創(chuàng)建遠(yuǎn)程接口的本地JDKProxy代理實(shí)例。然后,將這些本地Proxy代理實(shí)例,注入到SpringIOC容器中。當(dāng)定義的Feign中的接口被調(diào)用時(shí),通過(guò)Java的動(dòng)態(tài)代理來(lái)生成RequestTemplate。RequestTemplate中包含請(qǐng)求的所有信息,如請(qǐng)求參數(shù),請(qǐng)求URL等。RequestTemplate生成Request,然后將Request交給client處理,這個(gè)client默認(rèn)是Java的HTTPUrlConnection,也可以是OKhttp、Apache的HTTPClient等。最后Client封裝成LoadBaLanceClient,結(jié)合ribbon負(fù)載均衡地發(fā)起調(diào)用。如果解決了你的疑惑,請(qǐng)點(diǎn)點(diǎn)關(guān)注,謝謝支持。
面試java崗位的時(shí)候,你被提過(guò)哪些問(wèn)題
程序員朋友由于每天面對(duì)和電腦溝通的語(yǔ)言,有時(shí)候可能忽略了一些自然語(yǔ)言的技巧,而在面試中,一些說(shuō)話的套路往往會(huì)幫求職者增分不少,Java就業(yè)課中,就有關(guān)于面試技巧的分析和參考:
一、面試官:在我們這兒工作,您希望有什么樣的薪資待遇?
提示:了解該公司所在地區(qū)、所屬行業(yè)、公司規(guī)模等信息,你的薪水要求應(yīng)該在該公司所在地區(qū)、行業(yè)、公司規(guī)模相應(yīng)的薪水范圍之內(nèi)。盡可能提供一個(gè)你期望的薪水范圍,而不是具體的薪金數(shù)。
求職者:其實(shí)工資并不是我決定工作機(jī)會(huì)的唯一因素,如果您一定要我回答這個(gè)問(wèn)題,只能說(shuō)我希望以我所受的教育背景及工作經(jīng)驗(yàn),我希望我的工資不低于年薪50,000元。
二、面試官:你認(rèn)為每年加薪的幅度是多少?
提示:通常,比較可靠的回答是:你希望收入的增長(zhǎng)和生活水平的提高保持一致。你還應(yīng)該提到,你的業(yè)績(jī)將是加薪的主要因素。
求職者:總體來(lái)說(shuō),取決于我個(gè)人的業(yè)績(jī)和公司的業(yè)績(jī)(盈利狀況)。但一般而言,至少和生活水平的提高保持一致。
三、面試官:你上一份工作的收入是多少?
提示:有時(shí)候面試人員希望得到一個(gè)比較明確的答案。記住,在陳述你的收入時(shí),要把你的整個(gè)福利收入也加在上面。在有的公司福利收入可以使你的年收入增加30%或更多。
求職者:我過(guò)去的三年內(nèi)一直在ABC公司工作,我是大學(xué)一畢業(yè)就在這個(gè)公司的,當(dāng)時(shí)并沒(méi)有管理經(jīng)驗(yàn)。這三年中,我積累了很多管理和財(cái)務(wù)方面的技巧?,F(xiàn)在ABC公司給我的薪水是非常富有競(jìng)爭(zhēng)性的。
四、面試官:你愿意降低你的標(biāo)準(zhǔn)嗎?
提示:如果這確實(shí)是你非常希望得到的工作,那么,你應(yīng)該考慮在開(kāi)始時(shí)工資有所降低。
應(yīng)強(qiáng)調(diào)你可以把工作做得很好,并設(shè)法了解公司調(diào)整你薪水的時(shí)間。另外,對(duì)你能夠接受的極低數(shù)額應(yīng)心里有數(shù),但千萬(wàn)不要把這個(gè)數(shù)字告訴給面試人員。
求職者:由于我對(duì)該職位非常感興趣,我可以考慮接受低一些的薪水,你也需要時(shí)間讓我證明我的能力。我相信我可以干得十分出色,如果我能證明我的能力,你是否會(huì)考慮對(duì)我的薪水作一些調(diào)整呢,比如說(shuō),在三個(gè)月后。
五、面試官:你認(rèn)為我們提供給你的薪水如何?
提示:在回答這個(gè)問(wèn)題之前,首先確定這是否是正式聘用的工資數(shù)額,也許面試人只是想了解你的工資要求。如果是正式聘用的工資數(shù)額,你要確定自己是否能夠接受這個(gè)數(shù)額。
在西方國(guó)家,多數(shù)雇主希望你能跟他們進(jìn)一步商量;而在亞洲國(guó)家,則相反。如果這個(gè)數(shù)目大大低于你的期望,可以有技巧性地詢問(wèn)其它的福利項(xiàng)目是怎樣的。
求職者:這個(gè)數(shù)字跟我期望的非常接近,不過(guò)我的期望值要稍高些。您是否可以提供一個(gè)大致的薪資范圍?
六、面試官:能否告訴我,你的工資調(diào)整紀(jì)錄?
提示:在這個(gè)問(wèn)題中,面試人員只是想知道是否你一直原職不變,或者說(shuō)是否你不斷得到晉升的機(jī)會(huì)。所以,盡量避免提供薪資具體數(shù)額,除非他們要求。
求職者:N年來(lái),我一直在ABC公司工作,曾得到X次職務(wù)提升。ABC公司每年薪資調(diào)整的幅度不是太大,但由于我的工作總是十分優(yōu)秀,每年的薪資調(diào)整都接近調(diào)整的很高水平。我目前的工資已比我開(kāi)始工作的頭一年提高XX%。
springcloud報(bào)多個(gè)bean怎么處理
當(dāng)SpringCloud報(bào)多個(gè)bean時(shí),可以使用@Qualifier注解來(lái)指定要注入的特定bean。@Qualifier注解可以與@Autowired或@Inject一起使用,以指定要注入的bean的名稱或限定符。
另外,還可以使用@Primary注解來(lái)指定首選的bean,當(dāng)存在多個(gè)候選bean時(shí),將優(yōu)先選擇帶有@Primary注解的bean進(jìn)行注入。如果以上方法仍無(wú)法解決沖突,可以考慮使用@Conditional注解來(lái)根據(jù)條件選擇要注入的bean。
spring boot使用shiro還是secuitry好
Shiro和SpringSecurity都是安全框架,簡(jiǎn)單說(shuō)是對(duì)訪問(wèn)權(quán)限進(jìn)行控制,他們都提供了認(rèn)證、授權(quán)、加密、會(huì)話管理;這里要提一句,通常這種安全框架不會(huì)去幫助我們維護(hù)用戶/權(quán)限;這些需要我們自己去實(shí)現(xiàn),然后通過(guò)相應(yīng)的接口注入給安全框架。
那么SpringBoot項(xiàng)目的話,是使用Shiro還是SpringSecurity呢?還是先看看兩者有什么區(qū)別和各自的優(yōu)缺點(diǎn):
Shiro的配置和使用比較簡(jiǎn)單,SpringSecurity上手復(fù)雜些;
Shiro依賴性低,理論上不需要任何框架和容器,可以獨(dú)立運(yùn)行(但是最常用的環(huán)境還是JavaEE);SpringSecurity依賴Spring容器;
Shiro支持Web項(xiàng)目和非Web項(xiàng)目;在集群環(huán)境中,Shiro可以獨(dú)立于容器;
SpringSecurity基于Spring開(kāi)發(fā),項(xiàng)目若使用Spring(包括SpringBoot)作為基礎(chǔ),配合SpringSecurity做權(quán)限更加方便;Shiro需要和Spring進(jìn)行整合(不過(guò)這個(gè)復(fù)雜程度可以忽略);
SpringSecurity對(duì)Oauth、OpenID也有支持,Shiro則需要自己手動(dòng)實(shí)現(xiàn)。
總結(jié)一下,SpringBoot使用Shiro還是SpringSecurity,我更傾向于Shiro。
一方面雖然Shiro需要和SpringBoot做整合,但是這個(gè)過(guò)程不復(fù)雜;
另外一方面Oauth、OpenID站點(diǎn)間統(tǒng)一登錄功能,會(huì)有更好的實(shí)現(xiàn)方案,很少在這個(gè)層級(jí)實(shí)現(xiàn),所以SpringSecurity的這兩個(gè)功能可以不考慮。
我將持續(xù)分享Java開(kāi)發(fā)、架構(gòu)設(shè)計(jì)、程序員職業(yè)發(fā)展等方面的見(jiàn)解,希望能得到你的關(guān)注。如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
本文鏈接:http://xinin56.com/ruanjian/3273.html