1.SpringCloud服務調用方式有幾種?
1.Feight聲明式客戶端工具調用調用
2.RestTemplate調用
注意:需要@bean初始化RestTemplate對象 ,默認爲負載均衡,故初始化需要加@LoadBalanced
初始化RestTemplate對象示例:
@Bean @LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
調用方式示例: String memberUrl="http://app-itmayi-member/getMember"; //http"//+服務名/+請求地址
restTemplate.getForObject(memberUrl,String.class); //請求地址 , 返回類型
2.什麼是Eureka自我保護機制? 什麼環境下開啓自我保護機制? 如何開啓禁止?
1.自我保護機制:默認情況下EurekaClient定時向EurekaServer端發送心跳包,如果EurekaServer在一定時間內沒有收到
EurekaClient發送的心跳包,便會從註冊列表剔除該服務(默認90秒)
但是在短時間丟失大量的服務實例心跳,這時候EurekaSever會開啓自我保護機制,不會去剔除該服務.
2.作用:爲了防止EurekaClient可以正常運行,但是與EurekaServer網絡不通的情況下
,EurekaServer將EurekaClient服務進行剔除,開啓後便不會剔除.
3.建議在本地環境禁止自我保護機制(防止測試關閉Client,但是依然在註冊列表,測試出現錯誤),在生產環境開啓自我保護機制.
4.開啓禁止 Application.yml配置如下: false->關閉 true->開啓 eureka.server.enable-self-preservation=false
3.EurekaServer服務端常見配置 application.properties文件配置信息
#指定運行端口
server.port=8001
#指定服務名稱
spring.application.name=eureka-server
#指定主機地址
eureka.instance.hostname=localhost
#指定是否要從註冊中心獲取服務(單個註冊中心不需要開啓,集羣需要開啓)
eureka.client.fetch-registry=false
#指定是否要註冊到註冊中心(單個註冊中心不需要開啓,集羣需要開啓)
eureka.client.register-with-eureka=false
#關閉保護模式
eureka.server.enable-self-preservation=false
#註冊到另一個Eureka註冊中心(搭建集羣使用,多個,逗號分開)
eureka.client.service-url.defaultZone=http://127.0.0.1:8100/eureka/,http://localhost:9100/eureka/
#註冊中心添加認證,需要SpringSecurity依賴包 配置SpringSecurity登錄用戶名和密碼
spring.security.user.name=root
spring.security.user.password=123456
3.EurekaClient客戶端常見配置 application.properties文件配置信息
#指定運行端口
server.port=8101
#服務名稱
spring.application.name=eureka-client
#獲取註冊實例列表
eureka.client.fetch-registry=true
#註冊到Eureka的註冊中心
eureka.client.register-with-eureka=true
#配置註冊中心地址
#連接單個 eureka.client.service-url.defaultZone=http://localhost:8001/eureka/
#心跳檢測和續約時間
#Eureka服務刪除實例之前等待的時間(秒) 如90秒沒有收到心跳檢測,則剔除服務
eureka.instance.lease-expiration-duration-in-seconds=90
#Eureka客戶端需要發送心跳的間隔(秒) 30秒發送一次
eureka.instance.lease-renewal-interval-in-seconds=30
#連接到Eureka集羣 eureka.client.service-url.defaultZone=http://localhost:8100/eureka/,http://localhost:9100/eureka/
#連接帶有認證的註冊中心 連接格式 http://${username}:${password}@${hostname}:${port}/eureka/
#eureka.client.service-url.defaultZone=http://root:123456@localhost:8004/eureka/
#feign客戶端建立連接超時時間
feign.client.config.default.connect-timeout=10000
#feign客戶端建立連接後讀取資源超時時間
feign.client.config.default.read-timeout=10000
#開啓Hystrix斷路器
feign.hystrix.enabled=true
4.獲取註冊中心服務列表信息方法
1.引入接口 @Autowired private DiscoveryClient discoveryClient;
2.discoveryClient調getInstances()方法,參數爲服務名稱. 例: discoveryClient.getInstances("consul-member");
5.Ribbon本地負載均衡客戶端與Nginx服務器端負載均衡的區別?應用場景?
Ribbon本地負載均衡,原理:在調用接口的時候,會在Eureka註冊中心上獲取註冊信息服務列表,獲取到之後,緩存在JVM本地
然後使用本地實現RPC遠程調用技術進行調用,既是客戶端實現負載均衡.
Nginx 是服務器負載均衡,客戶端所有請求都會交給Nginx,然後再由Nginx實現轉發請求,既負載均衡是有服務器端實現.
應用場景:
Ribbon本地負載均衡適合在微服務RPC遠程調用,比如dubbo ,springcloud
Nginx服務器負載均衡 適合於針對與服務器端 比如tomcat ,jetty
6.服務雪崩效應?
解釋:默認情況下tomcat只有一個線程池去處理客戶端發送的所有服務請求,這樣的話在高併發的情況下,如果客戶端
所有的請求堆積到同一個服務接口上,就會產生tomcat的所有線程去處理該服務接口,可能會導致其他服務接口無法訪問,
就會導致其他服務接口訪問的時候,產生延遲和等待.
7.Hystrix服務保護框架,在微服務中Hystrix能夠爲我們解決哪些問題?
1.斷路器
2.服務降級
3.服務熔斷
4.服務隔離機制
5.服務雪崩效應 連環雪崩效應 如果嚴重的話,可能會導致整個微服務接口無法訪問,所有服務器都會癱瘓.
8.基於Hystrix解決服務雪崩效應原理:
服務降級
1.在高併發的情況下,防止用戶一直等待.使用服務降級方式(返回一個友好的提示直接給客戶端,不會去處理請求,調用fallBack)
目的是爲了用戶體驗.
2.秒殺-----當前請求人數過多,請稍後嘗試. (在tomcat中沒有線程進行處理客戶端請求的時候,不應該讓用戶一直轉圈等待)
3.如果調用其他接口超時的時候(默認是1秒時間),如果在一秒鐘沒有及時響應返回的話,(默認情況下業務邏輯是可以執行的)
,則直接執行服務降級.
服務隔離機制
服務熔斷目的是爲了保護服務,在高併發情況下,如果請求達到了一定的極限(可以自己設置閾值).如果流量
超出了設置的閾值,自動開啓保護服務功能,使用服務降級方式返回友好提示.熔斷機制和服務降級一起使用.
服務熔斷
隔離方式線程池和信號量隔離.
線程池隔離:每個服務接口都有自己獨立的線程池,每個線程池互不影響,缺點:CPU佔用率非常高.不是所有
的接口都去採用線程池隔離,核心關鍵接口.
9.SpringCloud Config 分佈式配置文件中心
1.爲什麼要使用分佈式配置中心?
產生的背景:在微服務如果使用傳統的方式管理配置文件,配置文件管理器非常複雜,如果生產環境配置文件,可能
需要發生改變的時候,重新打war包,重新讀取配置信息在jvm內存中
2.什麼是分佈式配置中心?
在微服務當中使用同一個服務器管理所有服務配置文件信息,能夠實現後臺可管理,當服務器正在運行的時候,
如果配置文件需要發生改變,可以實現不需要重啓服務器實時更改配置文件信息.
3.有哪些分佈式配置中心框架?
1.阿波羅攜程寫分佈式配置中心,有圖形界面可管理配置文件信息.配置文件信息存放在數據庫裏面.
2.SpringCloud Config沒有後臺可管理分佈式配置中心,配置文件信息存放在版本控制器裏面.
3.使用Zookeeper實現分佈式配置中心,持久節點+事件通知
4.分佈式配置中心需要哪些組件?
1.Web管理系統--後臺可以使用圖形界面管理配置文件SpringCloud Config沒有圖像化管理配置文件
2.存放分佈式配置文件服務器(持久存儲服務器)--使用版本控制器存放配置文件信息,使用git環境
3.ConfigServer緩存配置文件服務器(臨時緩存存放)
4.ConfigClient 讀取ConfigServer配置文件信息.
10.搭建分佈式配置中心 SpringCloud Config
1.搭建git環境, 目的:持久化存儲配置文件信息 採用碼雲
git環境上文件夾以項目進行區分
member_config會員服務配置文件
order_config訂單服務配置文件
2.公司項目中環境是如何區分?
dev 開發環境
sit 測試環境
pre 預發佈環境
prd 準生產環境
uat 驗收環境
3.在Git環境上創建配置文件命名規範
會員服務---服務名稱---member: 服務名稱-環境.properties member-dev.properties
4.默認情況下不能及時的獲取實時變更的配置文件信息
springcloud分佈式配置中心,可以採用手動刷新或者自動刷新
手動刷新--需要人工調用接口,讀取最新配置文件(監控中心) 人工調用/actuator/refresh進行刷新(post請求)
自動刷新--消息總線進行實時通知---springbus
11.網關API(接口) Gateway(網關) ---接口網關注意: 接口沒有界面
1.網關概念:相當於客戶端請求統一先請求到網關服務器上,在由網關服務器進行轉發到實際服務地址上,類似Nginx
2.網關作用:網關可以攔截客戶端所有請求,對該請求進行權限控制,負載均衡,日誌管理,接口調用監控等
3.網關和過濾器區別是什麼?
網關是攔截整個微服務所有請求,過濾器是攔截單個tomcat服務器請求
4.Nginx與Zuul區別?
相同點: Nginx和Zuul都可以實現負載均衡,反向代理,過濾請求,實現網關效果.
不同點: Nginx採用C語言編寫,Zuul採用java語言編寫. Zuul負載均衡實現:採用ribbon+eureka實現本地負載均衡
Nginx負載均衡實現:採用服務器端實現負載均衡.Nginx比Zuul功能會更加強大,因爲Nginx整合一些腳本語言(Nginx+Lua)可以實現一些其他功能.
Nginx適合於服務器負載均衡 + 也可以實現網關. Zuul適合微服務中實現網關,而且使用技術是java語言
Nginx作用實現反向代理,Zuul對微服務實現網關攔截. 標配最好Nginx+Zuul實現網關.
4.接口什麼背景下產生? 在面向服務架構和微服務背景下產生,目的都是爲了解耦,RPC遠程調用中產生
5.接口如何分類?
開放接口:其他機構合作伙伴進行調用(必須在外網訪問) 螞蟻開放平臺 ,微信公衆號開發
需要通過appid+appsocet生成accessToken進行通訊.對接支付開發,微信開發,目的可以
授權一些接口權限OAuth2.0協議方式 如:第三方聯合登錄
內部接口:一般只能在局域網中進行訪問,服務與服務調用之間關係都在同一個微服務系統中,目的是爲了
保證安全問題
12.設計一套公司項目的接口,你會如何設計?
接口權限(開放接口(遵循OAuth2.0協議)|內部接口),考慮冪等性,安全性(Https) 防止篡改數據(驗證簽名),
使用網關攔截接口實現黑名單和白名單 , 接口使用http協議+json格式restful風格目的爲了跨平臺.
考慮高併發 對接口服務實現保護.服務降級熔斷隔離等.最後使用API統一管理平臺 Swagger UI