Spring Cloud2020版本最佳實(shí)踐方案
來源:https://ilovey.live/2021/09/26/springcloud2020/
Spring Cloud 從H版本之后命名方式改為2020.x.x,話說為毛最新版本不是2021命名,來自強(qiáng)迫癥的難受
使用組件列表:
注冊(cè)中心:nacos,替代方案eureka、consul、zookeeper 配置中心: nacos ,替代方案sc config、consul config 調(diào)用:feign,替代方案:resttempate 熔斷:sentinel、,替代方案:Resilience4j 熔斷監(jiān)控:sentinel dashboard 負(fù)載均衡:sc loadbalancer 網(wǎng)關(guān):spring cloud gateway 鏈路:spring cloud sleuth+zipkin,替代方案:skywalking等
總體架構(gòu)圖

版本關(guān)系

使用nacos作為注冊(cè)中心和配置中心
下載nacos
下載地址:https://github.com/alibaba/nacos
導(dǎo)入數(shù)據(jù)庫
創(chuàng)建mysql數(shù)據(jù)庫nacos,導(dǎo)入 conf/nacos-mysql.sql
配置數(shù)據(jù)庫
修改 conf/application.properties
#***************?Config?Module?Related?Configurations?***************#
###?If?use?MySQL?as?datasource:
spring.datasource.platform=mysql
###?Count?of?DB:
db.num=1
###?Connect?URL?of?DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123456
配置啟動(dòng)模式
將nacos設(shè)為單機(jī)模式啟動(dòng),編輯 bin/startup.cmd 將MODE 修改為:
set?MODE="standalone"
啟動(dòng)運(yùn)行
登陸頁面:http://localhost:8848/nacos/,登陸用戶nacos,登陸密碼為nacos
工程案例
工程案例源碼:https://github.com/java-aodeng/springcloud2020-demo-1
工程案例包括2個(gè),一個(gè)服務(wù)提供者provider 、服務(wù)消費(fèi)者consumer
在父pom文件引入相關(guān)的依賴,如下:
<properties>
????<java.version>1.8java.version>
????<spring-boot.version>2.4.4spring-boot.version>
????<spring-cloud.version>2020.0.2spring-cloud.version>
????<spring-cloud-alibaba.version>2021.1spring-cloud-alibaba.version>
properties>
<dependencyManagement>
????<dependencies>
????????
????????<dependency>
????????????<groupId>org.springframework.bootgroupId>
????????????<artifactId>spring-boot-dependenciesartifactId>
????????????<version>${spring-boot.version}version>
????????????<type>pomtype>
????????????<scope>importscope>
????????dependency>
????????
????????<dependency>
????????????<groupId>org.springframework.cloudgroupId>
????????????<artifactId>spring-cloud-dependenciesartifactId>
????????????<version>${spring-cloud.version}version>
????????????<type>pomtype>
????????????<scope>importscope>
????????dependency>
????????
????????<dependency>
????????????<groupId>com.alibaba.cloudgroupId>
????????????<artifactId>spring-cloud-alibaba-dependenciesartifactId>
????????????<version>${spring-cloud-alibaba.version}version>
????????????<type>pomtype>
????????????<scope>importscope>
????????dependency>
????dependencies>
dependencyManagement>
服務(wù)提供者provider
在pom文件引入以下依賴:
<dependency>
????<groupId>org.springframework.bootgroupId>
????<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
????<groupId>com.alibaba.cloudgroupId>
????<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
配置文件:
server:
??port:?8762
spring:
??application:
????name:?provider
??cloud:
????nacos:
??????discovery:
????????server-addr:?127.0.0.1:8848
啟動(dòng)入口添加注解:
@SpringBootApplication
@EnableDiscoveryClient
public?class?ProviderApplication?{
????public?static?void?main(String[]?args)?{
????????SpringApplication.run(ProviderApplication.class,args);
????}
}
寫個(gè)接口:
@RestController
public?class?DemoController?{
????@Value("${server.port}")
????String?port;
????@GetMapping("getInfo")
????public?String?getInfo(@RequestParam(value?=?"name",defaultValue?=?"nacosConfig",required?=?false)String?name){
????????return?"my?name?is?"+name+",my?port?is?"+port;
????}
}
服務(wù)消費(fèi)者consumer
在pom文件引入以下依賴:
<dependency>
????<groupId>org.springframework.bootgroupId>
????<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
????<groupId>com.alibaba.cloudgroupId>
????<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
????<groupId>org.springframework.cloudgroupId>
????<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
<dependency>
????<groupId>org.springframework.cloudgroupId>
????<artifactId>spring-cloud-starter-loadbalancerartifactId>
dependency>
配置文件
server:
??port:?8763
spring:
??application:
????name:?consumer
??cloud:
????nacos:
??????discovery:
????????server-addr:?127.0.0.1:8848
在工程的啟動(dòng)入口開啟FeignClient的功能
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public?class?ConsumerApplication?{
????public?static?void?main(String[]?args)?{
????????SpringApplication.run(ConsumerApplication.class,args);
????}
}
寫一個(gè)FeignClient,去調(diào)用provider服務(wù)的接口:
@FeignClient(value?=?"provider")
public?interface?ProviderClient?{
????@GetMapping("getInfo")
????String?getInfo(@RequestParam(value?=?"name",defaultValue?=?"nacosConfig",required?=?false)String?name);
}
Copy
寫一個(gè)接口,讓consumer去調(diào)用provider服務(wù)的接口:
@RestController
public?class?DemoController?{
????@Autowired
????ProviderClient?providerClient;
????@GetMapping("getInfoByFeign")
????public?String?getInfoByFeign(){
????????return?providerClient.getInfo("consumer?feign");
????}
}
啟動(dòng)兩個(gè)工程,在nacos服務(wù)列表頁面出現(xiàn),consumer,provider2個(gè)服務(wù)表示都已經(jīng)注冊(cè)成功
服務(wù)調(diào)用
在瀏覽器上輸入http://localhost:8763/getInfoByFeign,瀏覽器返回響應(yīng)
my?name?is?consumer?feign,my?port?is?8761
可見瀏覽器的請(qǐng)求成功調(diào)用了consumer服務(wù)的接口,consumer服務(wù)也成功地通過feign成功的調(diào)用了provider服務(wù)的接口。
使用sc loadbanlancer作為負(fù)載均衡
使用spring cloud loadbanlancer作為負(fù)載均衡器。通過修改provider的端口,再在本地啟動(dòng)一個(gè)新的provider服務(wù),那么本地有2個(gè)provider 服務(wù),端口分別為8761 和8762。在瀏覽器上多次調(diào)用http://localhost:8763/getInfoByFeign,瀏覽器會(huì)交替顯示:
my?name?is?consumer?feign,my?port?is?8761
my?name?is?consumer?feign,my?port?is?8762
注冊(cè)中心provider服務(wù)也會(huì)顯示兩個(gè)示例
使用nacos作為配置中心
父工程添加nacos配置版本,另一個(gè)是用來解決最新版本導(dǎo)致的問題:
<alibaba.nacos.version>2.0.3alibaba.nacos.version>
<spring-cloud.bootstrap.version>3.0.4spring-cloud.bootstrap.version>
?
<dependency>
????<groupId>com.alibaba.cloudgroupId>
????<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
????<version>${spring-cloud-alibaba.version}version>
dependency>
<dependency>
????<groupId>org.springframework.cloudgroupId>
????<artifactId>spring-cloud-starter-bootstrapartifactId>
????<version>${spring-cloud.bootstrap.version}version>
dependency>
服務(wù)提供者provider添加依賴:
<dependency>
????<groupId>com.alibaba.cloudgroupId>
????<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
<dependency>
????<groupId>org.springframework.cloudgroupId>
????<artifactId>spring-cloud-starter-bootstrapartifactId>
dependency>
在bootstrap.yml(一定是bootstrap.yml文件,不是application.yml文件)文件配置以下內(nèi)容:
server:
??port:?8762
spring:
??application:
????name:?provider
??cloud:
????nacos:
??????config:
????????enabled:?true
????????server-addr:?127.0.0.1:8848
????????file-extension:?yml
????????prefix:?provider
??profiles:
????active:?dev
在上面的配置中,配置了nacos config server的地址,配置的擴(kuò)展名是ymal(目前僅支持yml和properties)。注意是沒有配置server.port的,sever.port的屬性在nacos中配置。上面的配置是和Nacos中的dataId 的格式是對(duì)應(yīng)的,nacos的完整格式如下:
${prefix}-${spring.profile.active}.${file-extension}
prefix 默認(rèn)為 spring.application.name 的值,也可以通過配置項(xiàng) spring.cloud.nacos.config.prefix來配置。 spring.profile.active 即為當(dāng)前環(huán)境對(duì)應(yīng)的 profile,詳情可以參考 Spring Boot文檔。注意:當(dāng) spring.profile.active 為空時(shí),對(duì)應(yīng)的連接符 - 也將不存在,dataId 的拼接格式變成 {file-extension} file-exetension 為配置內(nèi)容的數(shù)據(jù)格式,可以通過配置項(xiàng) spring.cloud.nacos.config.file-extension 來配置。目前只支持 properties 和 yaml 類型。啟動(dòng)nacos,登陸localhost:8848/nacos,創(chuàng)建一個(gè)data id ,完整的配置如圖所示:

源碼下載:
https://github.com/java-aodeng/springcloud2020-demo-1
參考資料:
https://www.fangzhipeng.com/spring-cloud.html https://spring.io/projects/spring-cloud https://www.springcloud.cc/ https://blog.csdn.net/llllllllll4er5ty/article/details/104425284
1.?Guava RateLimiter 實(shí)現(xiàn) API 限流,這才是正確的姿勢(shì)!
2.?圖解索引
最近面試BAT,整理一份面試資料《Java面試BATJ通關(guān)手冊(cè)》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。
獲取方式:點(diǎn)“在看”,關(guān)注公眾號(hào)并回復(fù)?Java?領(lǐng)取,更多內(nèi)容陸續(xù)奉上。
文章有幫助的話,在看,轉(zhuǎn)發(fā)吧。
謝謝支持喲 (*^__^*)

