日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spring cloudAlibaba面试题

發布時間:2024/3/24 编程问答 72 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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:8848

4.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遠程調用文章微服務的接口:

package com.mengxuegu.blog.feign;import com.mengxuegu.blog.entities.Label; import com.mengxuegu.blog.req.UserInfoREQ; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody;import java.util.List;/*** 通過feign遠程調用文章微服務的接口*/ // value 指定是哪個微服務接口,path 是在 Feign 調用時會加上此前綴,它與接口實現類的 // 微服務中配置的 context-path 值一致,如果微服務中 沒有配置 context-path 下面就不需要寫 path @FeignClient(value="article-server", path = "/article") public interface IFeignArticleController {/*** Feign接口-根據標簽ids查詢對應的標簽信息* @param labelIds 標簽ids集合,如1,2,3* @return*/// allowMultiple=true 表示數組格式的參數,dataType="String" 表示數組中參數的類型@ApiImplicitParam(allowMultiple=true,dataType="String", name="ids", value="標簽ID集合", required=true)@ApiOperation("Feign接口-根據標簽ids查詢對應的標簽信息")@GetMapping("/api/feign/label/list/{ids}")//@PathVariable一定要指定idsList<Label> getLabelListById(@PathVariable("ids") List<String> labelIds);}

參考:夢學谷的–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

ribbon.ReadTimeout=60000 ribbon.ConnectTimeout=60000

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控制臺的地址

spring:#服務名稱 application:name: SPC-CONTENT-CENTER #mysql連接datasource: url: jdbc:mysql://127.0.0.1:3306/xxx?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTCusername: rootpassword:driverClassName: com.mysql.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourcecloud:#nacosnacos:discovery:server-addr: localhost:8848 #指定nacos server的地址,不需要寫http#namespace: 05ebdf73-567b-4446-965d-2d11f1ea50cf #指定namespace,在Nacos Server 創建命名空間,使用命名空間ID,不能使用命名空間名稱cluster-name: BJ #指定集群名稱--北京#指定sentinel控制臺的地址 sentinel:transport:dashboard: localhost:8080

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面试题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。