spring cloudAlibaba面试题
spring cloud&Alibaba面試題
- 1. 微服務個人理解
- 2. 什么是微服務?什么是服務治理(SOA governance)?
- 3. 什么是Spring Cloud&&Alibaba?
- 4. 注冊中心-Nacos(client端)和配置中心(server端)
- 4.1 什么是Nacos?
- 4.2 Nacos注冊中心原理
- 4.3 Nacos注冊中心使用【Nacos-Client客戶端】
- 4.4 Nacos配置中心使用【Nacos-Server服務端】
- 4.5 通過配置更改動態刷新參數--@RefreshScope注解
- 5. 注冊中心--Eureka
- 6. 服務間通信框架--Feign
- 6.1 Feign介紹
- 6.2 Feign調用原理
- 6.3 服務間Feign的使用
- 6.4 Feign使用中遇到的相關問題
- 7. 服務間通信框架-RestTemplate
- 8. 服務網關-Gateway
- 8.1 Gateway的基礎知識
- 9. 服務網關-Zuul
- 10. 服務容錯-Sentinel
- 10.1 什么是雪崩效應?
- 10.2 Sentinel服務容錯和常見容錯方案?
- 10.3 Sentinel與控制臺通信原理剖析
- 10.4 Sentinel控制臺
- 11. 服務容錯-hystrix
- 12. 微服務調用鏈路監控【actuator-sleuth-Zipkin】
1. 微服務個人理解
1、將微服務劃分為外部服務和內部服務
外部服務:以終端劃分的外部服務,如api-admin、api-pc、api-applets、api-app、api-h5,提供對外(用戶)的API 接口數據 。
外部服務提供Feign服務通信調用內部服務獲取數據。
內部服務:如訂單服務、用戶服務、商品服務、內容服務等內部服務,提供增刪改查(搜索)等基本數據庫操作
2. 什么是微服務?什么是服務治理(SOA governance)?
一:什么是微服務?
微服務是一種分布式系統架構風格,它的核心理念是將傳統的單一應用開發為一組微型服務,每個服務運行在獨立的進程中,服務之間采用輕量級通信機制進行相互調用。
3. 什么是Spring Cloud&&Alibaba?
Spring Cloud是Spring開源組織下的一個子項目,提供了一系列用于實現分布式微服務系統的工具集,幫助開發者快速構建微服務應用。
Spring Cloud Alibaba是Spring Cloud的子項目;包含微服務開發必備組件;基于和符合Spring Cloud標準的阿里的微服務解決方案。
4. 注冊中心-Nacos(client端)和配置中心(server端)
參考:https://www.jianshu.com/p/39ade28c150d
4.1 什么是Nacos?
英文全稱Dynamic Naming and Configuration Service,Na為naming/nameServer即注冊中心,co為configuration即注冊中心,service是指該注冊/配置中心都是以服務為核心。
??
4.2 Nacos注冊中心原理
服務提供者、服務消費者、服務發現組件這三者之間的關系大致如下
1、微服務在啟動時,將自己的網絡地址等信息注冊到服務發現組件(nacos server)中,服務發現組件會存儲這些信息。
2、各個微服務與服務發現組件使用一定機制通信(例如在一定的時間內發送心跳包)。服務發現組件若發現與某微服務實例通信正常則保持注冊狀態(up在線狀態)、若長時間無法與某微服務實例通信,就會自動注銷(即:刪除)該實例。
3、服務消費者可從服務發現組件查詢服務提供者的網絡地址,并使用該地址調用服務提供者的接口。
4、當微服務網絡地址發生變更(例如實例增減或者IP端口發生變化等)時,會重新注冊到服務發現組件。
4.3 Nacos注冊中心使用【Nacos-Client客戶端】
(1)pom文件加依賴:alibaba-nacos-discovery
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>(2)啟動類加注解
//Nacos服務端【早期版本需要加注解,現在0.0.9版本后已不是必須的】 @EnableDiscoveryClient(3)在對應的微服務的yml配置文件【服務名稱和nacos server 地址】
spring:cloud:nacos:discovery:#指定nacos server的地址,不需要寫httpserver-addr: localhost:88484.4 Nacos配置中心使用【Nacos-Server服務端】
(1)在服務上配置 nacos-server 配置中心
1。加依賴–alibaba-nacos-config
<!--nacos-config nacos管理配置的依賴--> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>2。無注解
3。加配置,新增bootstrap.yml文件配置,配置屬性如下
spring:cloud:nacos:config:server-addr: 127.0.0.1:8848 #這里的server-addr用作配置管理file-extension: yamlapplication:name: user-serverprofiles: # profiles區分多環境配置active: dev #切換配置文件,如dev、test、pro等環境(2)配置中心包含:配置管理、服務管理(微服務管理)、命名空間、集群管理
4.5 通過配置更改動態刷新參數–@RefreshScope注解
普通application參數在配置中心直接配置皆可,如果需要可以動態刷新的配置,需要在相應類上加上@RefreshScope注解,示例如下,當在nacos配置中心更改配置后,方法getId的值也會刷新。
@RefreshScope public class IdEntity {@Value("${id}")private int id;public int getId(){return this.id; }5. 注冊中心–Eureka
6. 服務間通信框架–Feign
Feign是Netfilx開源的聲明式HTTP客戶端
6.1 Feign介紹
Feign是一個http請求調用的輕量級框架,可以以Java接口注解的方式調用Http請求。Spring Cloud引入 Feign并且集成了Ribbon實現客戶端負載均衡調用。
6.2 Feign調用原理
https://www.jianshu.com/p/e0218c142d03
Feign遠程調用,核心就是通過一系列的封裝和處理,將以JAVA注解的方式定義的遠程調用API接口,最終轉換成HTTP的請求形式,然后將HTTP的請求的響應結果,解碼成JAVA Bean,放回給調用者。
基于重試器發送HTTP請求:Feign 內置了一個重試器,當HTTP請求出現IO異常時,Feign會有一個最大嘗試次數發送請求
6.3 服務間Feign的使用
(1)加依賴–openfeign
<!--feign依賴、服務通信--> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>(2)在yml配置加依賴
暫無配置
(3)啟動類加注解
@EnableFeignClients//feign注解(4)聲明接口,請求接口的類加FeignClient注解
feign遠程調用文章微服務的接口:
參考:夢學谷的–mengxuegu-blog-api的com.mengxuegu.blog.feign.IFeignArticleController接口
(5)被feign遠程調用文章服務的接口
package com.mengxuegu.blog.article.feign;import com.mengxuegu.blog.feign.IFeignArticleController; import com.mengxuegu.blog.article.service.IArticleService; import com.mengxuegu.blog.article.service.ILabelService; import com.mengxuegu.blog.entities.Label; import com.mengxuegu.blog.req.UserInfoREQ; import io.swagger.annotations.Api; import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource; import java.util.List;/*** 被feign遠程調用的接口* 實現mengxuegu-blog-api模塊下feign包下的IFeignArticleController*/ @RestController//不要少了 @Api(value = "被遠程調用的文章微服務接口", description = "被遠程調用的文章微服務接口") public class FeignArticleController implements IFeignArticleController {@Resourceprivate ILabelService labelService;/*** 根據標簽ids查詢對應的標簽信息* @param labelIds 標簽ids集合,如1,2,3* @return 返回標簽list集合*/@Overridepublic List<Label> getLabelListById(List<String> labelIds) {// 通過標簽ids批量查詢標簽信息,是 Mybatis-plus 提供的return labelService.listByIds(labelIds);//labelIds為collection集合參數}@Resourceprivate IArticleService articleService;/*** 更新文章表和評論表中的用戶信息* @param req* @return*/@Overridepublic boolean updateUserInfo(UserInfoREQ req) {return articleService.updateUserInfo(req);} }(6)在文答服務中 通過Feign遠程調用 文章服務,并查詢文章的標簽信息
/*** 注入com.mengxuegu.blog.feign.IFeignArticleController*/ @Resource private IFeignArticleController feignArticleController; /*** 通過問題id查詢詳情* @param id 問題id* @return*/ @Override public Result findById(String id) {//1、查詢問題詳情和標簽idsQuestion question = baseMapper.findQuestionAndLabelIdsById(id);if (question == null){return Result.error("沒有問題詳情信息");}//TODO 2、通過Feign遠程調用 文章微服務,并查詢標簽信息if (CollectionUtils.isNotEmpty(question.getLabelIds())){List<Label> labelList = feignArticleController.getLabelListById(question.getLabelIds());question.setLabelList(labelList);//將labelList集合設置到question中}return Result.ok(question); }參考:夢學谷的–mengxuegu-blog-api的com.mengxuegu.blog.feign.IFeignArticleController接口
6.4 Feign使用中遇到的相關問題
(1)使用feign客戶端調用其他微服務時,session沒有傳遞成功,sessionId不一樣。
(2)使用feign客戶端調用其他微服務時,發送POST請求時,對象信息沒有傳遞成功。關鍵在于加上注解:@RequestBody
(3)使用feign客戶端調用其他微服務時,報錯超時:e=feign.RetryableException: Read timed out executing POST
7. 服務間通信框架-RestTemplate
8. 服務網關-Gateway
8.1 Gateway的基礎知識
一:什么是服務網關
網關是整個微服務API請求的入口,負責攔截所有請求,再分發到服務上去。
可以實現日志攔截、權限控制、解決跨域、限流、熔斷、負載均衡,隱藏服務端的ip,黑名單與白名單攔截、授權等。
二:gateway的核心概念
- Route(路由):就是轉發規則
Spring Cloud Gateway的基礎元素,可簡單理解成一條轉發的規則。包含:ID、目標URL、Predicate集合以及Filter集合。 - Predicate(斷言或謂詞):就是控制 該請求是不是走轉發規則的(Route) 條件
即java.util.function.Predicate接口的函數式編程的API,Spring Cloud Gateway使用Predicate實現路由的匹配條件。 - Filter(過濾器):就是為該請求添加業務邏輯,修改請求以及響應
通過過濾器可以對請求進行一些修改和響應。
三:gateway限流【兩種方式】
內置的 RequestRateLimiterGatewayFilterFactory 提供限流的能力,基于令牌桶算法實現。目前,它內置的 RedisRateLimiter ,依賴Redis存儲限流配置,以及統計數據。當然你也可以實現自己的RateLimiter,只需實現 RateLimiter 接口,或者繼承AbstractRateLimiter 。
1、漏桶算法:
想象有一個水桶,水桶以一定的速度出水(以一定速率消費請求),當水流速度過大時水會溢出(訪問速率超過響應速率,就直接拒絕)。
漏桶算法的兩個變量:
水桶漏洞的大小:rate
最多可以存多少的水:burst
2、令牌桶算法:
系統按照恒定間隔向水桶里加入令牌(Token),如果桶滿了的話,就不加了。每個請求來的時候,會拿走1個令牌,如果沒有令牌可拿,那么就拒絕服務。
9. 服務網關-Zuul
10. 服務容錯-Sentinel
10.1 什么是雪崩效應?
https://www.jianshu.com/p/1cc0b480fb55
1、將業務拆分為不同服務,服務與服務之間可以相互調用,但是由于網絡原因或者自身的原因,服務并不能保證服務的100%可用,如果單個服務出現問題,調用這個服務就會出現網絡延遲,此時若有大量的網絡涌入,會形成任務堆積,最終導致服務癱瘓。
2、在分布式系統中,由于網絡原因或自身的原因,服務一般無法保證 100% 可用。如果一個服務出現了問題,調用這個服務就會出現線程阻塞的情況,此時若有大量的請求涌入,就會出現多條線程阻塞等待(在java程序里面,一次請求對應線程對應的是服務器資源–>CPU、內存),進而導致服務癱瘓。
3、由于服務與服務之間的依賴性,故障會傳播,會對整個微服務系統造成災難性的嚴重后果,這就是服務故障的 “雪崩效應” 。
4、雪崩發生的原因多種多樣,有不合理的容量設計,或者是高并發下某一個方法響應變慢,亦或是某臺機器的資源耗盡。
10.2 Sentinel服務容錯和常見容錯方案?
一:什么是sentinel服務容錯【流量衛兵】
sentinel是輕量級的流量控制、熔斷降級Java庫(容錯的庫)。
二:常見容錯方案【避免雪崩效應】
超時模式–限流模式–倉壁模式–斷路器模式–降級模式
1、超時【思想:只要釋放夠快服務就不容易那么死了】
為每次請求設置一個最大響應時間(超時時間,如1秒),如果超過這個時間,不管這次請求是否成功,就斷開這次請求,釋放掉線程。只要線程釋放速度夠快,被請求的服務就不那么容易被拖死。
2、限流【思想:只有一碗的飯量,給再多也只是吃一碗】
高并發的系統存在大量的線程阻塞,若經過評估被請求B服務的實例,最大能夠承載的QPS是1000,那么久可以為B服務設置一個適合的限流的值(如800QPS),只要某一個實例達到設置的閾值,再有流量(請求)進來就會被直接拒絕。實現了自己的保護。
3、倉壁/隔離模式【思想:不把雞蛋放一個籃子里面,各有各的線程池】
如將船分為若干個船艙,船艙與船艙之間用鋼板焊死,使船艙達到隔離,即使某個船艙進水也不會影響其它的船艙。
常見的隔離方式有:線程池隔離和信號量隔離。
線程池隔離:如為A、B兩個controller設置獨立的線程池(coreSize=10),他們之間就是用線程池這個鋼板焊死了,而A controller對應的API調不通就像是船艙進水了,A的船艙進水與B的船艙沒有任何關系。這就是倉壁模式。
4、斷路器模式【監控+開關】
(1)全開狀態【服務調用失敗達到一定次數】
一定時間內,服務調用失敗達到一定次數,且多次檢測無恢復跡象,斷路器全開
(2)半開狀態【服務有恢復跡象】
短時間內,有恢復跡象,斷路器會將部分請求發給該服務,斷路器半開
(3)關閉狀態【服務正常狀態】
當服務處于正常狀態,能正常調用,斷路器關閉
- 如下
對A服務的A接口進行監控,5秒以內的錯誤率、錯誤次數達到某個閾值,就認為該A接口的代碼是掛了的,斷路器就進行跳閘,不去調用遠程B服務的API了。
若A服務的A接口恢復正常,調用遠程B服務自動恢復正常。
5、降級
降級其實就是為服務提供一個托底方案,一旦服務無法正常調用,就使用托底方案。
10.3 Sentinel與控制臺通信原理剖析
一:微服是如何將自己注冊到sentinel控制臺的?
微服務需要集成transport(sentinel-transport-simple-http)模塊,微服務就會把自己發送到sentinel控制臺上,并且會定時向控制臺發送心跳【就是說sentinel實現一套服務發現機制–心跳包】,現在微服務把自己注冊到控制后,sentinel控制臺就知道每個微服務的地址是什么了。
二:控制臺是如何獲取到微服務的監控信息的?
1、通過以上的sentinel控制臺的IP+端口:http://192.168.10.1:8719/api
2、可以通過actuator查看
http://localhost:8082/actuator/sentinel
10.4 Sentinel控制臺
一:搭建Sentinel控制臺
1、控制臺版本下載:https://github.com/alibaba/Sentinel/releases
Sentinel-core-1.5.2版本生成環境下載對應版本的jar?!具@里學習使用sentinel-dashboard-1.6.2.jar】
2、啟動和登錄
啟動:java -jar sentinel-dashboard-1.6.2.jar
登錄:http://localhost:8080/#/login,賬號/密碼:sentinel/sentinel
二:為內容中心 整合 Sentinel控制臺
1、加配置–指定sentinel控制臺的地址
2、訪問內容中心調用用戶中心(feign調用)的接口
如:http://localhost:8082/shares/test_search_users?page_num=1&page_size=5&wx_id=wx-432mx325&wx_nickname=wx-小李
3、查看Sentinel控制臺
11. 服務容錯-hystrix
12. 微服務調用鏈路監控【actuator-sleuth-Zipkin】
總結
以上是生活随笔為你收集整理的spring cloudAlibaba面试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 专治各种3D建模疑难杂症|学习之路畅通无
- 下一篇: 【电力电子技术】三相桥式全控整流电路