Springcloud Alibaba超詳細使用詳解
簡介
Spring Cloud Alibaba是阿里巴巴結合自身的微服務實踐開源的微服務全家桶,我個人覺得其組件比Spring Cloud 中的組件更加好用和強大。并且對的Spring Cloud組件做了很好的兼容。比如在Spirng Cloud Alibaba中依然可以使用Feign作為服務調(diào)用方式,使用Eureak做服務注冊發(fā)現(xiàn)等等。
主要功能
1.服務注冊和發(fā)現(xiàn)(nacos):可以注冊服務,并且客戶可以使用Spring托管的bean(自動集成功能區(qū))發(fā)現(xiàn)實例。注冊中心。
2.分布式配置(nacos):支持分布式系統(tǒng)中的外部配置,配置更改時自動刷新。 配置中心
3.流控制和服務降級(Sentinel ):支持WebServlet,WebFlux-->(比Springmvc更高級)OpenFeign,RestTemplate,Dubbo訪問限制和降級流的功能。它可以在運行時通過控制臺實時修改限制和降級流的規(guī)則,并且還支持監(jiān)視限制和降級度量標準。 - 服務熔斷限流hystrix
4.Rpc服務:擴展Spring Cloud客戶端RestTemplate(ribbon)和OpenFeign以支持調(diào)用Dubbo RPC服務。
5.分布式事務(seata):支持高性能且易于使用的分布式事務解決方案。
6.事件驅動:支持構建與共享消息系統(tǒng)連接的高度可擴展的事件驅動微服務。
7.阿里云對象存儲:大規(guī)模,安全,低成本,高度可靠的云存儲服務。支持隨時隨地在任何應用程序中存儲和訪問任何類型的數(shù)據(jù)。
8.阿里云SchedulerX:準確,高度可靠,高可用性的計劃作業(yè)調(diào)度服務,響應時間在幾秒鐘內(nèi)。
9.阿里云短信:阿里云短信服務覆蓋全球,提供便捷,高效,智能的通信功能,幫助企業(yè)快速聯(lián)系客戶。
與奈飛對比

注冊中心nacos
什么是nacos
Nacos致力于幫助您發(fā)現(xiàn),配置和管理微服務。它提供了一組簡單有用的功能,使您能夠實現(xiàn)動態(tài)服務發(fā)現(xiàn),服務配置,服務元數(shù)據(jù)和流量管理。Nacos使構建,交付和管理微服務平臺變得更容易,更快捷。它是通過微服務或云原生方法支持以服務為中心的現(xiàn)代應用程序體系結構的基礎架構。說的通俗一些,就是承擔了奈飛框架中的Eureka的功能,相當于注冊中心,但比Eureka更加智能與便捷。
如何安裝nacos
官方提供了Nacos的服務端供我們下載使用,我們啟動Nacos后將我們的微服務注冊進入Nacos即可。
下載地址:[https://github.com/alibaba/nacos/releases]
啟動nacos
nacos的啟動也十分方便,在下載好的jar包目錄下執(zhí)行
- windows執(zhí)行bin目錄下的startup命令 :startup.cmd -m standalone
- linux 執(zhí)行 :sh startup.sh -m standalone
啟動成功頁面如下所示

nacos的默認端口為8848,在啟動成功后,用戶即可訪問nacos,訪問地址為:(本地單機模式)http://127.0.0.1:8848/nacos/index.html
登錄的賬號和密碼均為:nacos
登錄成功頁面如圖所示(筆者這里已經(jīng)注冊好了幾個服務,故會有信息,第一次登錄且未將服務注冊到nacos的話,這里是沒有信息的)

服務架構簡單搭建
舉例服務項目結構

微服務調(diào)用流程
Order-Service-20010提供訂單的查詢服務,Order-Client-30010調(diào)用Order-Service-20010提供的服務查詢自身的訂單信息,Order-Common作為公共服務,提供了相關實體類以及對應的無參有參構造方法
項目搭建
父工程的pom.xml
<!--公共的一些配置-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<!--SpringBoot-->
<parent>
<groupId> org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
</parent>
<!--SpringCloud-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--導入lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
</dependencies>服務注冊到nacos
Order-Service-20010配置
添加依賴
<dependency>
<groupId>com.alibaba.cloud </groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>編寫啟動類
@SpringBootApplication
@EnableDiscoveryClient
public class OrderServerStart {
public static void main(String[] args) {
SpringApplication.run(OrderServerStart.class);
}
}編寫配置文件yml
server:
port: 20010
spring:
application:
name: Order-server
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848Order-Client-30010配置
添加依賴
<dependency>
<groupId>com.alibaba.cloud </groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>編寫啟動類
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OrderClientStart
{
public static void main( String[] args )
{
SpringApplication.run(OrderClientStart.class);
}
}編寫配置文件yml
server:
port: 30010
spring:
application:
name: Order-client
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848啟動成功后,nacos當中便會看見注冊成功的服務

Nacos配置中心
客戶端接入配置中心
概述
在《SpringCloud極簡入門》中我們通過Spring Cloud Config作為統(tǒng)一配置文件管理中心,其實我們總結一下發(fā)現(xiàn)Spring Cloud Config使用起來總歸比較麻煩。Nacos作為Spring Cloud Alibaba的一個重要組件,它不僅可以用作服務注冊與發(fā)現(xiàn),也可以用來替代Spring Cloud Config作為統(tǒng)一配置文件管理,而且他的使用更為簡單和人性化。
如何實現(xiàn)
點擊頁面左上角的"+"按鈕即可添加新的配置,不過需要注意的是,編寫的后綴改為yaml,在項目中要將application.yml,修改為bootstrap.yml,并在內(nèi)部進行相關的配置

導入依賴
<dependencies>
<!-- 配置中心客戶端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- 服務注冊與發(fā)現(xiàn)-->
<dependency>
<groupId>com.alibaba.cloud </groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.example</groupId>
<artifactId>springcloudalibaba-user-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>配置Controller
@RefreshScope //刷新配置
@RestController
public class UserController {
@Value("${temp.notify}")
private String notify;
@GetMapping("/user/{id}")
public User getById(@PathVariable Long id){
User user = new User(id,"root"+notify ,null);
return user;
}
}修改yml配置
以修改order-client的yml為例
server:
port: 30010
spring:
application:
name: Order-client
profiles:
active: dev
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
prefix: application-user
group: DEFAULT_GROUP測試

root后多了一個1234,為什么呢?
因為筆者在nacos當中的配置文件中,定義了notify的值為1234,這樣就表示配置中心配置成功
Sentinel限流控制
Sentinel和Hystrix
限流和熔斷
限流 , 限制流量,這里的流量我們可以理解成請求數(shù)量,其實就是限制服務器的請求并發(fā)數(shù)量,為什么要這么做?如果不做限流,那么在大量并發(fā)請求下我們的服務器會慢慢的變慢然后頂不住壓力而掛掉(類似堵車)。并不是說并發(fā)越大越好,有的時候我們的項目規(guī)模和業(yè)務決定了我們不需要那么大的并發(fā)性,當大量的并發(fā)請求訪問到服務器時我們需要把部分請求拒絕在外,這個是流量限制 - 限流。
熔斷機制在在[《Spring Cloud 極簡入門》)中有詳細的解釋,熔斷機制是對服務調(diào)用鏈路的保護機制,如果鏈路上的某個服務不可訪問,調(diào)用超時,發(fā)生異常等,服務會進行發(fā)熔斷,觸發(fā)降級返回托底數(shù)據(jù)。簡單理解就是當服務器不可訪問,可以返回一些預先準備好的兜底數(shù)據(jù)給用戶,比如友好的提示信息,不至于直接向客戶拋出異常。
Hystrix的熔斷和資源隔離
其實在[《Spring Cloud 極簡入門》]中我們已經(jīng)學習過Hystrix的熔斷和資源隔離機制,它的資源隔離可以通過線程池隔離和信號量隔離兩種方式來實現(xiàn)對流量的控制。Hystrix相比Sentinel來說它的線程池隔離(限流)會造成線程上下切換對資源的消耗比較大;Hystrix使用的信號量進行資源的隔離效果不錯,但是無法對慢調(diào)用進行自動降級。
Sentinel定義
Sentinel誕生于阿里巴巴,其主要目標是流量控制和服務熔斷,2018年,Sentinel演變?yōu)橐粋€開源項目現(xiàn)如今成為了Spring Cloud Alibaba的一個子項目。Sentinel是通過限制并發(fā)線程的數(shù)量來減少不穩(wěn)定資源的影響,而不是使用線程池,省去了線程切換的性能開銷。
當資源的響應時間變長時,線程將開始被占用。當線程數(shù)累積到一定數(shù)量時,新的傳入請求將被拒絕。反之亦然,當資源恢復并變得穩(wěn)定時,占用的線程也將被釋放,新請求將被接受。
除了限制并發(fā)性外,Sentinel可以根據(jù)響應時間降級不穩(wěn)定資源也是保證可靠性的有效方法。當資源的響應時間太大時,將在指定的時間窗口中拒絕所有對該資源的訪問。-- 熔斷機制
此外,Sentinel支持的熔斷降級維度更多,可對多種指標進行流控、熔斷,且提供了實時監(jiān)控和控制面板,功能更為強大。
Sentinel客戶端接入
導入依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>添加yml配置
spring:
cloud:
sentinel:
transport:
dashboard: localhost:1111資源限流實現(xiàn)
在Controller中添加一個Sentinelresource注解
@SentinelResource(value = "getUser",blockHandler = "LimitResource")
value表示要進行限流的方法,blockHandler表示限流之后系統(tǒng)調(diào)用的方法
完整代碼:
@RefreshScope
@RestController
@RequestMapping("/user")
public class UserController {
@Value("${temp.notify}")
private String notify;
@Autowired
private OrderOpenFeignClient feignClient;
//限制的資源
@SentinelResource(value = "getUser",blockHandler = "LimitResource")
// 給資源取名user,后續(xù)通過名字來進行限流
@GetMapping("/{id}")
public User getUser(@PathVariable("id") Long id){
//發(fā)起遠程調(diào)用
List<Order> orders =feignClient.getList(id);
int i=new Random().nextInt(2);
System.out.println(1/i);
User user = new User(id,"root"+notify ,orders);
return user;
}
public User LimitResource(@PathVariable("id") Long id,BlockException e){
e.printStackTrace();
return new User(-1L,"限流了",null);
}
}如何設置限流

在sentinel的當前頁面,點擊對應資源的流控按鈕,進行流控策略的配置。

這里單機閾值設置為1,表示1s內(nèi)的訪問量超過一次,則會觸發(fā)限流效果。 系統(tǒng)便會執(zhí)行自己設定的LimitResource方法,筆者這里便不附上運行截圖了,配置十分簡單,配置完成也不需要重啟服務,直接進行接口訪問壓測即可。
Sentinel流控效果
快速失敗
快速失敗:(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)是默認的流控方式,當流量達到閥值直接返回異常,QPS達到任何規(guī)則閾值后,后續(xù)請求就會立即拒絕,并拋出FlowException 異常。簡單理解:并發(fā)太高,直接請求拒絕
warmup預熱
Warm Up預熱:(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,根據(jù)codeFactor(默認3)的值,從(閥值/codeFactor)為初始閥值,經(jīng)過預熱時長,才到達設置的QPS的閥值,即預熱/冷啟動方式。簡單理解:慢慢的增大處理并發(fā)的能力
排隊等待
排隊等待(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER),忽然增加的請求并發(fā)量達到了限流閾值后續(xù)請求會被拒絕,有時候我們可能更希望后續(xù)的請求可以加入隊列進行排隊,慢慢執(zhí)行,而不是直接拒絕請求,這種方式后嚴格控制請求通過的時間間隔,也即是讓請求以均勻的速度通過,對應的是漏桶算法,這種方式主要用于處理間隔性突發(fā)的流量,例如消息隊列。 簡單理解:突發(fā)流量處理不過來,讓請求排隊。
Sentinel熔斷
概述
什么是熔斷
Sentinel除了流控還提供了服務熔斷和降級機制,服務之間的調(diào)用關系錯綜復雜,微服務的調(diào)用鏈上的某些服務資源不穩(wěn)定(宕機,異常,超時)可能會導致可能請求的失敗和請求的堆積,調(diào)用鏈產(chǎn)生連鎖反應可能會導致整個微服務架構癱瘓。服務熔斷降級機制是保障高可用的重要措施之一。
Sentinel熔斷
Sentinel的服務熔斷機制會對調(diào)用鏈上的某個不穩(wěn)定(宕機,異常,超時)的資源,做出請求限制,快速失敗,避免影響到其它的服務而導致級聯(lián)錯誤。資源熔斷后,在后續(xù)的一定時間(時間窗口)之內(nèi),對該服務的請求都自動熔斷,拋出 DegradeException異常。Sentinel擁有比Hystrix更強大和豐富的功能,能滿足我們的各種應用場景,并且經(jīng)歷過淘寶雙十一的考驗,是微服務架構中熔斷機制的不二選擇。
熔斷規(guī)則
平均響應RT
平均響應時間 (DEGRADE_GRADE_RT):當資源的平均響應時間超過閾值(DegradeRule 中的 count,以 ms 為單位)之后,資源進入準降級狀態(tài)。如果接下來 1s 內(nèi)持續(xù)進入 5 個請求(即 QPS >= 5),它們的 RT 都持續(xù)超過這個閾值,那么在接下的時間窗口(DegradeRule 中的 timeWindow,以 s 為單位)之內(nèi),對這個方法的調(diào)用都會自動地熔斷(拋出 DegradeException)。注意 Sentinel 默認統(tǒng)計的 RT 上限是 4900 ms,超出此閾值的都會算作 4900 ms,若需要變更此上限可以通過啟動配置項 -Dcsp.sentinel.statistic.max.rt=xxx 來配置。
異常比例
異常比例(DEGRADE_GRADE_EXCEPTION_RATIO):每秒請求量 > 5 ,當資源的每秒異??倲?shù)占通過量的比值超過閾值(DegradeRule 中的 count)之后,資源進入降級狀態(tài),即在接下的時間窗口(DegradeRule 中的 timeWindow,以 s 為單位)之內(nèi),對這個方法的調(diào)用都會自動地返回。異常比率的閾值范圍是 [0.0, 1.0],代表 0% - 100%。
異常數(shù)
異常數(shù) (DEGRADE_GRADE_EXCEPTION_COUNT):當資源近 1 分鐘的異常數(shù)目超過閾值之后會進行熔斷。注意由于統(tǒng)計時間窗口是分鐘級別的,若 timeWindow 小于 60s,則結束熔斷狀態(tài)后仍可能再進入熔斷狀態(tài)。
慢調(diào)用比例
熔斷策略慢調(diào)用比例是以慢調(diào)用數(shù)量的比例作為閾值,首先需要設置最大 RT(即最大的響應時間,用于鑒定是否是慢調(diào)用),請求的響應時間大于該值則統(tǒng)計為慢調(diào)用。當單位統(tǒng)計時長(statIntervalMs)內(nèi)請求數(shù)大于設置的最小請求數(shù),并且慢調(diào)用的比例大于比例閾值,則接下來的請求會自動熔斷,熔斷時間為設置的熔斷時長。經(jīng)過熔斷時長后熔斷器會進入探測恢復狀態(tài)(HALF-OPEN 狀態(tài)),若在HALF-OPEN狀態(tài)下有一個請求響應時間小于 最大RT 則結束熔斷,否則繼續(xù)熔斷。
熔斷實戰(zhàn)示例
導入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>配置yml
feign:
sentinel:
enabled: true #熔斷配置OpenFeign
接口
@FeignClient(value = "Order-server")
public interface OrderOpenFeignClient {
@GetMapping("/order/{id}")
public List<Order> getList(@PathVariable("id") Long id);
}熔斷返回fallback
@Component
public class UserFallBack implements FallbackFactory<OrderOpenFeignClient> {
@Override
public OrderOpenFeignClient create(Throwable throwable) {
return id ->Arrays.asList(new Order(-2L,"服務暫時不可用","請您稍后再試"));
}
}修改Controller
在SentinelResource中添加相關屬性值
Controller完整代碼
@RefreshScope
@RestController
@RequestMapping("/user")
public class UserController {
@Value("${temp.notify}")
private String notify;
@Autowired
private OrderOpenFeignClient feignClient;
//限制的資源
@SentinelResource(value = "getUser",blockHandler = "LimitResource",blockHandlerClass = UserFallback.class,
fallback = "Error")
// 給資源取名user,后續(xù)通過名字來進行限流
@GetMapping("/{id}")
public User getUser(@PathVariable("id") Long id){
//發(fā)起遠程調(diào)用
List<Order> orders =feignClient.getList(id);
int i=new Random().nextInt(2);
System.out.println(1/i);
User user = new User(id,"root"+notify ,orders);
return user;
}
//方案1
// public User LimitResource(@PathVariable("id") Long id,BlockException e){
// e.printStackTrace();
// return new User(-1L,"限流了",null);
// }
public User Error(@PathVariable("id") Long id){
return new User(-1L,"熔斷數(shù)據(jù)集",null);
}
}因為在這里,寫了一個Error方法,并且在SentinelResource中添加了fallback="Error"所以fallback返回的將是Error的內(nèi)容。
測試結果:

寫在最后:
SpringCloudAlibaba是一款優(yōu)秀的微服務架構,在市面上有著廣泛的應用。這篇文章介紹了SpringCloudAlibaba的一些基本使用,適合初學者,希望能夠給大家?guī)韼椭?。筆者小,中,大廠均有面試經(jīng)驗,目前正在從事全棧開發(fā)工作,堅持每日分享java全棧開發(fā)知識與相關的面試真題,希望能夠給大家?guī)韼椭蠹夜餐M步
- SpringCloudAlibaba微服務調(diào)用組件OpenFeign的方法
- Alibaba?SpringCloud集成Nacos、openFeign實現(xiàn)負載均衡的解決方案
- 淺談SpringCloud?Alibaba和SpringCloud的區(qū)別
- 聊聊SpringCloud和SpringCloudAlibaba的區(qū)別
- SpringCloudAlibaba整合Feign實現(xiàn)遠程HTTP調(diào)用的簡單示例
- SpringCloudAlibaba分布式組件詳解
- SpringCloud Alibaba項目實戰(zhàn)之nacos-server服務搭建過程
- SpringCloud Alibaba 基本開發(fā)框架搭建過程
相關文章
Python如何使用@property @x.setter及@x.deleter
這篇文章主要介紹了Python如何使用@property @x.setter及@x.deleter,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-05-05
解決SpringAop內(nèi)部調(diào)用時不經(jīng)過代理類的問題
這篇文章主要介紹了解決SpringAop內(nèi)部調(diào)用時不經(jīng)過代理類的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
Spring Boot 中application.yml與bootstrap.yml的區(qū)別
其實yml和properties文件是一樣的原理,且一個項目上要么yml或者properties,二選一的存在。這篇文章給大家介紹了Spring Boot 中application.yml與bootstrap.yml的區(qū)別,感興趣的朋友一起看看吧2018-04-04
springboot中PostMapping正常接收json參數(shù)后返回404問題
這篇文章主要介紹了springboot中PostMapping正常接收json參數(shù)后返回404問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05
解析MapStruct轉換javaBean時出現(xiàn)的詭異事件
在項目中用到了MapStruct,對其可以轉換JavaBean特別好奇,今天小編給大家分享一個demo給大家講解MapStruct轉換javaBean時出現(xiàn)的詭異事件,感興趣的朋友一起看看吧2021-09-09
java 實現(xiàn)讀取txt文本數(shù)據(jù)并以數(shù)組形式一行一行取值
今天小編就為大家分享一篇java 實現(xiàn)讀取txt文本數(shù)據(jù)并以數(shù)組形式一行一行取值,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07

