Springcloud Alibaba超詳細(xì)使用詳解
簡(jiǎn)介
Spring Cloud Alibaba是阿里巴巴結(jié)合自身的微服務(wù)實(shí)踐開(kāi)源的微服務(wù)全家桶,我個(gè)人覺(jué)得其組件比Spring Cloud 中的組件更加好用和強(qiáng)大。并且對(duì)的Spring Cloud組件做了很好的兼容。比如在Spirng Cloud Alibaba中依然可以使用Feign作為服務(wù)調(diào)用方式,使用Eureak做服務(wù)注冊(cè)發(fā)現(xiàn)等等。
主要功能
1.服務(wù)注冊(cè)和發(fā)現(xiàn)(nacos):可以注冊(cè)服務(wù),并且客戶可以使用Spring托管的bean(自動(dòng)集成功能區(qū))發(fā)現(xiàn)實(shí)例。注冊(cè)中心。
2.分布式配置(nacos):支持分布式系統(tǒng)中的外部配置,配置更改時(shí)自動(dòng)刷新。 配置中心
3.流控制和服務(wù)降級(jí)(Sentinel ):支持WebServlet,WebFlux-->(比Springmvc更高級(jí))OpenFeign,RestTemplate,Dubbo訪問(wèn)限制和降級(jí)流的功能。它可以在運(yùn)行時(shí)通過(guò)控制臺(tái)實(shí)時(shí)修改限制和降級(jí)流的規(guī)則,并且還支持監(jiān)視限制和降級(jí)度量標(biāo)準(zhǔn)。 - 服務(wù)熔斷限流hystrix
4.Rpc服務(wù):擴(kuò)展Spring Cloud客戶端RestTemplate(ribbon)和OpenFeign以支持調(diào)用Dubbo RPC服務(wù)。
5.分布式事務(wù)(seata):支持高性能且易于使用的分布式事務(wù)解決方案。
6.事件驅(qū)動(dòng):支持構(gòu)建與共享消息系統(tǒng)連接的高度可擴(kuò)展的事件驅(qū)動(dòng)微服務(wù)。
7.阿里云對(duì)象存儲(chǔ):大規(guī)模,安全,低成本,高度可靠的云存儲(chǔ)服務(wù)。支持隨時(shí)隨地在任何應(yīng)用程序中存儲(chǔ)和訪問(wèn)任何類型的數(shù)據(jù)。
8.阿里云SchedulerX:準(zhǔn)確,高度可靠,高可用性的計(jì)劃作業(yè)調(diào)度服務(wù),響應(yīng)時(shí)間在幾秒鐘內(nèi)。
9.阿里云短信:阿里云短信服務(wù)覆蓋全球,提供便捷,高效,智能的通信功能,幫助企業(yè)快速聯(lián)系客戶。
與奈飛對(duì)比
注冊(cè)中心nacos
什么是nacos
Nacos致力于幫助您發(fā)現(xiàn),配置和管理微服務(wù)。它提供了一組簡(jiǎn)單有用的功能,使您能夠?qū)崿F(xiàn)動(dòng)態(tài)服務(wù)發(fā)現(xiàn),服務(wù)配置,服務(wù)元數(shù)據(jù)和流量管理。Nacos使構(gòu)建,交付和管理微服務(wù)平臺(tái)變得更容易,更快捷。它是通過(guò)微服務(wù)或云原生方法支持以服務(wù)為中心的現(xiàn)代應(yīng)用程序體系結(jié)構(gòu)的基礎(chǔ)架構(gòu)。說(shuō)的通俗一些,就是承擔(dān)了奈飛框架中的Eureka的功能,相當(dāng)于注冊(cè)中心,但比Eureka更加智能與便捷。
如何安裝nacos
官方提供了Nacos的服務(wù)端供我們下載使用,我們啟動(dòng)Nacos后將我們的微服務(wù)注冊(cè)進(jìn)入Nacos即可。
下載地址:[https://github.com/alibaba/nacos/releases]
啟動(dòng)nacos
nacos的啟動(dòng)也十分方便,在下載好的jar包目錄下執(zhí)行
- windows執(zhí)行bin目錄下的startup命令 :startup.cmd -m standalone
- linux 執(zhí)行 :sh startup.sh -m standalone
啟動(dòng)成功頁(yè)面如下所示
nacos的默認(rèn)端口為8848,在啟動(dòng)成功后,用戶即可訪問(wèn)nacos,訪問(wèn)地址為:(本地單機(jī)模式)http://127.0.0.1:8848/nacos/index.html
登錄的賬號(hào)和密碼均為:nacos
登錄成功頁(yè)面如圖所示(筆者這里已經(jīng)注冊(cè)好了幾個(gè)服務(wù),故會(huì)有信息,第一次登錄且未將服務(wù)注冊(cè)到nacos的話,這里是沒(méi)有信息的)
服務(wù)架構(gòu)簡(jiǎn)單搭建
舉例服務(wù)項(xiàng)目結(jié)構(gòu)
微服務(wù)調(diào)用流程
Order-Service-20010提供訂單的查詢服務(wù),Order-Client-30010調(diào)用Order-Service-20010提供的服務(wù)查詢自身的訂單信息,Order-Common作為公共服務(wù),提供了相關(guān)實(shí)體類以及對(duì)應(yīng)的無(wú)參有參構(gòu)造方法
項(xiàng)目搭建
父工程的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> <!--導(dǎo)入lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </dependency> </dependencies>
服務(wù)注冊(cè)到nacos
Order-Service-20010配置
添加依賴
<dependency> <groupId>com.alibaba.cloud </groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
編寫啟動(dòng)類
@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:8848
Order-Client-30010配置
添加依賴
<dependency> <groupId>com.alibaba.cloud </groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
編寫啟動(dòng)類
@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
啟動(dòng)成功后,nacos當(dāng)中便會(huì)看見(jiàn)注冊(cè)成功的服務(wù)
Nacos配置中心
客戶端接入配置中心
概述
在《SpringCloud極簡(jiǎn)入門》中我們通過(guò)Spring Cloud Config作為統(tǒng)一配置文件管理中心,其實(shí)我們總結(jié)一下發(fā)現(xiàn)Spring Cloud Config使用起來(lái)總歸比較麻煩。Nacos作為Spring Cloud Alibaba的一個(gè)重要組件,它不僅可以用作服務(wù)注冊(cè)與發(fā)現(xiàn),也可以用來(lái)替代Spring Cloud Config作為統(tǒng)一配置文件管理,而且他的使用更為簡(jiǎn)單和人性化。
如何實(shí)現(xiàn)
點(diǎn)擊頁(yè)面左上角的"+"按鈕即可添加新的配置,不過(guò)需要注意的是,編寫的后綴改為yaml,在項(xiàng)目中要將application.yml,修改為bootstrap.yml,并在內(nèi)部進(jìn)行相關(guān)的配置
導(dǎo)入依賴
<dependencies> <!-- 配置中心客戶端--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!-- 服務(wù)注冊(cè)與發(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
測(cè)試
root后多了一個(gè)1234,為什么呢?
因?yàn)楣P者在nacos當(dāng)中的配置文件中,定義了notify的值為1234,這樣就表示配置中心配置成功
Sentinel限流控制
Sentinel和Hystrix
限流和熔斷
限流 , 限制流量,這里的流量我們可以理解成請(qǐng)求數(shù)量,其實(shí)就是限制服務(wù)器的請(qǐng)求并發(fā)數(shù)量,為什么要這么做?如果不做限流,那么在大量并發(fā)請(qǐng)求下我們的服務(wù)器會(huì)慢慢的變慢然后頂不住壓力而掛掉(類似堵車)。并不是說(shuō)并發(fā)越大越好,有的時(shí)候我們的項(xiàng)目規(guī)模和業(yè)務(wù)決定了我們不需要那么大的并發(fā)性,當(dāng)大量的并發(fā)請(qǐng)求訪問(wèn)到服務(wù)器時(shí)我們需要把部分請(qǐng)求拒絕在外,這個(gè)是流量限制 - 限流。
熔斷機(jī)制在在[《Spring Cloud 極簡(jiǎn)入門》)中有詳細(xì)的解釋,熔斷機(jī)制是對(duì)服務(wù)調(diào)用鏈路的保護(hù)機(jī)制,如果鏈路上的某個(gè)服務(wù)不可訪問(wèn),調(diào)用超時(shí),發(fā)生異常等,服務(wù)會(huì)進(jìn)行發(fā)熔斷,觸發(fā)降級(jí)返回托底數(shù)據(jù)。簡(jiǎn)單理解就是當(dāng)服務(wù)器不可訪問(wèn),可以返回一些預(yù)先準(zhǔn)備好的兜底數(shù)據(jù)給用戶,比如友好的提示信息,不至于直接向客戶拋出異常。
Hystrix的熔斷和資源隔離
其實(shí)在[《Spring Cloud 極簡(jiǎn)入門》]中我們已經(jīng)學(xué)習(xí)過(guò)Hystrix的熔斷和資源隔離機(jī)制,它的資源隔離可以通過(guò)線程池隔離和信號(hào)量隔離兩種方式來(lái)實(shí)現(xiàn)對(duì)流量的控制。Hystrix相比Sentinel來(lái)說(shuō)它的線程池隔離(限流)會(huì)造成線程上下切換對(duì)資源的消耗比較大;Hystrix使用的信號(hào)量進(jìn)行資源的隔離效果不錯(cuò),但是無(wú)法對(duì)慢調(diào)用進(jìn)行自動(dòng)降級(jí)。
Sentinel定義
Sentinel誕生于阿里巴巴,其主要目標(biāo)是流量控制和服務(wù)熔斷
,2018年,Sentinel演變?yōu)橐粋€(gè)開(kāi)源項(xiàng)目現(xiàn)如今成為了Spring Cloud Alibaba的一個(gè)子項(xiàng)目。Sentinel是通過(guò)限制并發(fā)線程的數(shù)量來(lái)減少不穩(wěn)定資源的影響
,而不是使用線程池,省去了線程切換的性能開(kāi)銷。
當(dāng)資源的響應(yīng)時(shí)間變長(zhǎng)時(shí),線程將開(kāi)始被占用。當(dāng)線程數(shù)累積到一定數(shù)量時(shí),新的傳入請(qǐng)求將被拒絕。反之亦然,當(dāng)資源恢復(fù)并變得穩(wěn)定時(shí),占用的線程也將被釋放,新請(qǐng)求將被接受。
除了限制并發(fā)性外,Sentinel可以根據(jù)響應(yīng)時(shí)間降級(jí)不穩(wěn)定資源也是保證可靠性的有效方法。當(dāng)資源的響應(yīng)時(shí)間太大時(shí),將在指定的時(shí)間窗口中拒絕所有對(duì)該資源的訪問(wèn)。-- 熔斷機(jī)制
此外,Sentinel支持的熔斷降級(jí)維度更多,可對(duì)多種指標(biāo)進(jìn)行流控、熔斷,且提供了實(shí)時(shí)監(jiān)控和控制面板,功能更為強(qiáng)大。
Sentinel客戶端接入
導(dǎo)入依賴
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
添加yml配置
spring: cloud: sentinel: transport: dashboard: localhost:1111
資源限流實(shí)現(xiàn)
在Controller中添加一個(gè)Sentinelresource注解
@SentinelResource(value = "getUser",blockHandler = "LimitResource")
value表示要進(jìn)行限流的方法,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ù)通過(guò)名字來(lái)進(jìn)行限流 @GetMapping("/{id}") public User getUser(@PathVariable("id") Long id){ //發(fā)起遠(yuǎn)程調(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); } }
如何設(shè)置限流
在sentinel的當(dāng)前頁(yè)面,點(diǎn)擊對(duì)應(yīng)資源的流控按鈕,進(jìn)行流控策略的配置。
這里單機(jī)閾值設(shè)置為1,表示1s內(nèi)的訪問(wèn)量超過(guò)一次,則會(huì)觸發(fā)限流效果。 系統(tǒng)便會(huì)執(zhí)行自己設(shè)定的LimitResource方法,筆者這里便不附上運(yùn)行截圖了,配置十分簡(jiǎn)單,配置完成也不需要重啟服務(wù),直接進(jìn)行接口訪問(wèn)壓測(cè)即可。
Sentinel流控效果
快速失敗
快速失敗:(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)是默認(rèn)的流控方式,當(dāng)流量達(dá)到閥值直接返回異常,QPS達(dá)到任何規(guī)則閾值后,后續(xù)請(qǐng)求就會(huì)立即拒絕,并拋出FlowException 異常。簡(jiǎn)單理解:并發(fā)太高,直接請(qǐng)求拒絕
warmup預(yù)熱
Warm Up預(yù)熱:(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,根據(jù)codeFactor(默認(rèn)3)的值,從(閥值/codeFactor)為初始閥值,經(jīng)過(guò)預(yù)熱時(shí)長(zhǎng),才到達(dá)設(shè)置的QPS的閥值,即預(yù)熱/冷啟動(dòng)方式。簡(jiǎn)單理解:慢慢的增大處理并發(fā)的能力
排隊(duì)等待
排隊(duì)等待(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER),忽然增加的請(qǐng)求并發(fā)量達(dá)到了限流閾值后續(xù)請(qǐng)求會(huì)被拒絕,有時(shí)候我們可能更希望后續(xù)的請(qǐng)求可以加入隊(duì)列進(jìn)行排隊(duì),慢慢執(zhí)行,而不是直接拒絕請(qǐng)求,這種方式后嚴(yán)格控制請(qǐng)求通過(guò)的時(shí)間間隔,也即是讓請(qǐng)求以均勻的速度通過(guò),對(duì)應(yīng)的是漏桶算法,這種方式主要用于處理間隔性突發(fā)的流量,例如消息隊(duì)列。 簡(jiǎn)單理解:突發(fā)流量處理不過(guò)來(lái),讓請(qǐng)求排隊(duì)。
Sentinel熔斷
概述
什么是熔斷
Sentinel除了流控還提供了服務(wù)熔斷和降級(jí)機(jī)制,服務(wù)之間的調(diào)用關(guān)系錯(cuò)綜復(fù)雜,微服務(wù)的調(diào)用鏈上的某些服務(wù)資源不穩(wěn)定(宕機(jī),異常,超時(shí))可能會(huì)導(dǎo)致可能請(qǐng)求的失敗和請(qǐng)求的堆積,調(diào)用鏈產(chǎn)生連鎖反應(yīng)可能會(huì)導(dǎo)致整個(gè)微服務(wù)架構(gòu)癱瘓。服務(wù)熔斷降級(jí)機(jī)制是保障高可用的重要措施之一。
Sentinel熔斷
Sentinel的服務(wù)熔斷機(jī)制會(huì)對(duì)調(diào)用鏈上的某個(gè)不穩(wěn)定(宕機(jī),異常,超時(shí))的資源,做出請(qǐng)求限制,快速失敗,避免影響到其它的服務(wù)而導(dǎo)致級(jí)聯(lián)錯(cuò)誤。資源熔斷后,在后續(xù)的一定時(shí)間(時(shí)間窗口)之內(nèi),對(duì)該服務(wù)的請(qǐng)求都自動(dòng)熔斷,拋出 DegradeException異常。Sentinel擁有比Hystrix更強(qiáng)大和豐富的功能,能滿足我們的各種應(yīng)用場(chǎng)景,并且經(jīng)歷過(guò)淘寶雙十一的考驗(yàn),是微服務(wù)架構(gòu)中熔斷機(jī)制的不二選擇。
熔斷規(guī)則
平均響應(yīng)RT
平均響應(yīng)時(shí)間 (DEGRADE_GRADE_RT):當(dāng)資源的平均響應(yīng)時(shí)間超過(guò)閾值(DegradeRule 中的 count,以 ms 為單位)之后,資源進(jìn)入準(zhǔn)降級(jí)狀態(tài)。如果接下來(lái) 1s 內(nèi)持續(xù)進(jìn)入 5 個(gè)請(qǐng)求(即 QPS >= 5),它們的 RT 都持續(xù)超過(guò)這個(gè)閾值,那么在接下的時(shí)間窗口(DegradeRule 中的 timeWindow,以 s 為單位)之內(nèi),對(duì)這個(gè)方法的調(diào)用都會(huì)自動(dòng)地熔斷(拋出 DegradeException)。注意 Sentinel 默認(rèn)統(tǒng)計(jì)的 RT 上限是 4900 ms,超出此閾值的都會(huì)算作 4900 ms,若需要變更此上限可以通過(guò)啟動(dòng)配置項(xiàng) -Dcsp.sentinel.statistic.max.rt=xxx 來(lái)配置。
異常比例
異常比例(DEGRADE_GRADE_EXCEPTION_RATIO):每秒請(qǐng)求量 > 5 ,當(dāng)資源的每秒異常總數(shù)占通過(guò)量的比值超過(guò)閾值(DegradeRule 中的 count)之后,資源進(jìn)入降級(jí)狀態(tài),即在接下的時(shí)間窗口(DegradeRule 中的 timeWindow,以 s 為單位)之內(nèi),對(duì)這個(gè)方法的調(diào)用都會(huì)自動(dòng)地返回。異常比率的閾值范圍是 [0.0, 1.0],代表 0% - 100%。
異常數(shù)
異常數(shù) (DEGRADE_GRADE_EXCEPTION_COUNT):當(dāng)資源近 1 分鐘的異常數(shù)目超過(guò)閾值之后會(huì)進(jìn)行熔斷。注意由于統(tǒng)計(jì)時(shí)間窗口是分鐘級(jí)別的,若 timeWindow 小于 60s,則結(jié)束熔斷狀態(tài)后仍可能再進(jìn)入熔斷狀態(tài)。
慢調(diào)用比例
熔斷策略慢調(diào)用比例是以慢調(diào)用數(shù)量的比例作為閾值,首先需要設(shè)置最大 RT(即最大的響應(yīng)時(shí)間,用于鑒定是否是慢調(diào)用),請(qǐng)求的響應(yīng)時(shí)間大于該值則統(tǒng)計(jì)為慢調(diào)用。當(dāng)單位統(tǒng)計(jì)時(shí)長(zhǎng)(statIntervalMs)內(nèi)請(qǐng)求數(shù)大于設(shè)置的最小請(qǐng)求數(shù),并且慢調(diào)用的比例大于比例閾值,則接下來(lái)的請(qǐng)求會(huì)自動(dòng)熔斷,熔斷時(shí)間為設(shè)置的熔斷時(shí)長(zhǎng)。經(jīng)過(guò)熔斷時(shí)長(zhǎng)后熔斷器會(huì)進(jìn)入探測(cè)恢復(fù)狀態(tài)(HALF-OPEN 狀態(tài)),若在HALF-OPEN狀態(tài)下有一個(gè)請(qǐng)求響應(yīng)時(shí)間小于 最大RT 則結(jié)束熔斷,否則繼續(xù)熔斷。
熔斷實(shí)戰(zhàn)示例
導(dǎo)入依賴
<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,"服務(wù)暫時(shí)不可用","請(qǐng)您稍后再試")); } }
修改Controller
在SentinelResource中添加相關(guān)屬性值
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ù)通過(guò)名字來(lái)進(jìn)行限流 @GetMapping("/{id}") public User getUser(@PathVariable("id") Long id){ //發(fā)起遠(yuǎn)程調(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); } }
因?yàn)樵谶@里,寫了一個(gè)Error方法,并且在SentinelResource中添加了fallback="Error"所以fallback返回的將是Error的內(nèi)容。
測(cè)試結(jié)果:
寫在最后:
SpringCloudAlibaba是一款優(yōu)秀的微服務(wù)架構(gòu),在市面上有著廣泛的應(yīng)用。這篇文章介紹了SpringCloudAlibaba的一些基本使用,適合初學(xué)者,希望能夠給大家?guī)?lái)幫助。筆者小,中,大廠均有面試經(jīng)驗(yàn),目前正在從事全棧開(kāi)發(fā)工作,堅(jiān)持每日分享java全棧開(kāi)發(fā)知識(shí)與相關(guān)的面試真題,希望能夠給大家?guī)?lái)幫助,同大家共同進(jìn)步
- SpringCloudAlibaba微服務(wù)調(diào)用組件OpenFeign的方法
- Alibaba?SpringCloud集成Nacos、openFeign實(shí)現(xiàn)負(fù)載均衡的解決方案
- 淺談SpringCloud?Alibaba和SpringCloud的區(qū)別
- 聊聊SpringCloud和SpringCloudAlibaba的區(qū)別
- SpringCloudAlibaba整合Feign實(shí)現(xiàn)遠(yuǎn)程HTTP調(diào)用的簡(jiǎn)單示例
- SpringCloudAlibaba分布式組件詳解
- SpringCloud Alibaba項(xiàng)目實(shí)戰(zhàn)之nacos-server服務(wù)搭建過(guò)程
- SpringCloud Alibaba 基本開(kāi)發(fā)框架搭建過(guò)程
相關(guān)文章
Python如何使用@property @x.setter及@x.deleter
這篇文章主要介紹了Python如何使用@property @x.setter及@x.deleter,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05解決SpringAop內(nèi)部調(diào)用時(shí)不經(jīng)過(guò)代理類的問(wèn)題
這篇文章主要介紹了解決SpringAop內(nèi)部調(diào)用時(shí)不經(jīng)過(guò)代理類的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01Spring Boot 中application.yml與bootstrap.yml的區(qū)別
其實(shí)yml和properties文件是一樣的原理,且一個(gè)項(xiàng)目上要么yml或者properties,二選一的存在。這篇文章給大家介紹了Spring Boot 中application.yml與bootstrap.yml的區(qū)別,感興趣的朋友一起看看吧2018-04-04springboot中PostMapping正常接收json參數(shù)后返回404問(wèn)題
這篇文章主要介紹了springboot中PostMapping正常接收json參數(shù)后返回404問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05解析MapStruct轉(zhuǎn)換javaBean時(shí)出現(xiàn)的詭異事件
在項(xiàng)目中用到了MapStruct,對(duì)其可以轉(zhuǎn)換JavaBean特別好奇,今天小編給大家分享一個(gè)demo給大家講解MapStruct轉(zhuǎn)換javaBean時(shí)出現(xiàn)的詭異事件,感興趣的朋友一起看看吧2021-09-09java 實(shí)現(xiàn)讀取txt文本數(shù)據(jù)并以數(shù)組形式一行一行取值
今天小編就為大家分享一篇java 實(shí)現(xiàn)讀取txt文本數(shù)據(jù)并以數(shù)組形式一行一行取值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07