Spring Cloud2020版本最佳實踐方案

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

版本關系

使用nacos作為注冊中心和配置中心
下載nacos
下載地址:https://github.com/alibaba/nacos
導入數(shù)據(jù)庫
創(chuàng)建mysql數(shù)據(jù)庫nacos,導入 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
配置啟動模式
將nacos設為單機模式啟動,編輯 bin/startup.cmd 將MODE 修改為:
set?MODE="standalone"
啟動運行
登陸頁面:http://localhost:8848/nacos/,登陸用戶nacos,登陸密碼為nacos
工程案例
工程案例源碼:https://github.com/java-aodeng/springcloud2020-demo-1
工程案例包括2個,一個服務提供者provider 、服務消費者consumer
在父pom文件引入相關的依賴,如下:
<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>
服務提供者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
啟動入口添加注解:
@SpringBootApplication
@EnableDiscoveryClient
public?class?ProviderApplication?{
????public?static?void?main(String[]?args)?{
????????SpringApplication.run(ProviderApplication.class,args);
????}
}
寫個接口:
@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;
????}
}
服務消費者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
在工程的啟動入口開啟FeignClient的功能
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public?class?ConsumerApplication?{
????public?static?void?main(String[]?args)?{
????????SpringApplication.run(ConsumerApplication.class,args);
????}
}
寫一個FeignClient,去調用provider服務的接口:
@FeignClient(value?=?"provider")
public?interface?ProviderClient?{
????@GetMapping("getInfo")
????String?getInfo(@RequestParam(value?=?"name",defaultValue?=?"nacosConfig",required?=?false)String?name);
}
Copy
寫一個接口,讓consumer去調用provider服務的接口:
@RestController
public?class?DemoController?{
????@Autowired
????ProviderClient?providerClient;
????@GetMapping("getInfoByFeign")
????public?String?getInfoByFeign(){
????????return?providerClient.getInfo("consumer?feign");
????}
}
啟動兩個工程,在nacos服務列表頁面出現(xiàn),consumer,provider2個服務表示都已經(jīng)注冊成功
服務調用
在瀏覽器上輸入http://localhost:8763/getInfoByFeign,瀏覽器返回響應
my?name?is?consumer?feign,my?port?is?8761
可見瀏覽器的請求成功調用了consumer服務的接口,consumer服務也成功地通過feign成功的調用了provider服務的接口。
使用sc loadbanlancer作為負載均衡
使用spring cloud loadbanlancer作為負載均衡器。通過修改provider的端口,再在本地啟動一個新的provider服務,那么本地有2個provider 服務,端口分別為8761 和8762。在瀏覽器上多次調用http://localhost:8763/getInfoByFeign,瀏覽器會交替顯示:
my?name?is?consumer?feign,my?port?is?8761
my?name?is?consumer?feign,my?port?is?8762
注冊中心provider服務也會顯示兩個示例
使用nacos作為配置中心
父工程添加nacos配置版本,另一個是用來解決最新版本導致的問題:
<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>
服務提供者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文件)文件配置以下內容:
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的地址,配置的擴展名是ymal(目前僅支持yml和properties)。注意是沒有配置server.port的,sever.port的屬性在nacos中配置。上面的配置是和Nacos中的dataId 的格式是對應的,nacos的完整格式如下:
${prefix}-${spring.profile.active}.${file-extension}
prefix 默認為 spring.application.name 的值,也可以通過配置項 spring.cloud.nacos.config.prefix來配置。 spring.profile.active 即為當前環(huán)境對應的 profile,詳情可以參考 Spring Boot文檔。注意:當 spring.profile.active 為空時,對應的連接符 - 也將不存在,dataId 的拼接格式變成 {file-extension} file-exetension 為配置內容的數(shù)據(jù)格式,可以通過配置項 spring.cloud.nacos.config.file-extension 來配置。目前只支持 properties 和 yaml 類型。啟動nacos,登陸localhost:8848/nacos,創(chuàng)建一個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
推薦閱讀:
不是你需要中臺,而是一名合格的架構師(附各大廠中臺建設PPT)
企業(yè)10大管理流程圖,數(shù)字化轉型從業(yè)者必備!
【中臺實踐】華為大數(shù)據(jù)中臺架構分享.pdf
