Spring Cloud 從H版本之後命名方式改為2020.x.x,話說為毛最新版本不是2021命名,來自強迫症的難受
使用元件清單:
注冊中心:nacos,替代方案eureka、consul、zookeeper
配置中心: nacos ,替代方案sc config、consul config
調用:feign,替代方案:resttempate
熔斷:sentinel、,替代方案:Resilience4j
熔斷監控:sentinel dashboard
負載均衡:sc loadbalancer
網關:spring cloud gateway
鍊路:spring cloud sleuth+zipkin,替代方案:skywalking等
總體架構圖

使用nacos作為注冊中心和配置中心
下載下傳nacos
下載下傳位址:
https://github.com/alibaba/nacos導入資料庫
建立mysql資料庫nacos,導入 conf/nacos-mysql.sql
配置資料庫
修改 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
Spring Boot 基礎就不介紹了,推薦下這個實戰教程:
https://www.javastack.cn/categories/Spring-Boot/在父pom檔案引入相關的依賴,如下:
<properties>
<java.version>1.8</java.version>
<spring-boot.version>2.4.4</spring-boot.version>
<spring-cloud.version>2020.0.2</spring-cloud.version>
<spring-cloud-alibaba.version>2020.0.RC1</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- spring boot 依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring cloud 依賴 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring cloud alibaba 依賴 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
服務提供者provider
在pom檔案引入以下依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</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
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--引入openfeign,必須要引入loadbalancer,否則無法啟動-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</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);
}
寫一個接口,讓consumer去調用provider服務的接口:
@RestController
public class DemoController {
@Autowired
ProviderClient providerClient;
@GetMapping("getInfoByFeign")
public String getInfoByFeign(){
return providerClient.getInfo("consumer feign");
}
}
啟動兩個工程,在nacos服務清單頁面出現,consumer,provider2個服務表示都已經注冊成功
服務調用
推薦一個 Spring Boot 基礎教程及實戰示例:
在浏覽器上輸入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.3</alibaba.nacos.version>
<spring-cloud.bootstrap.version>3.0.4</spring-cloud.bootstrap.version>
<!--Alibaba Nacos 配置-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${spring-cloud-alibaba.version}</version>
</dependency>
<!--引入這個依賴解決SpringCloud2020整合Nacos-Bootstrap配置不生效的問題-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>${spring-cloud.bootstrap.version}</version>
</dependency>
服務提供者provider添加依賴:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</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 即為目前環境對應的 profile,詳情可以參考 Spring Boot文檔。 注意:當 spring.profile.active 為空時,對應的連接配接符 - 也将不存在,dataId 的拼接格式變成 ${prefix}.${file-extension}
file-exetension 為配置内容的資料格式,可以通過配置項 spring.cloud.nacos.config.file-extension 來配置。目前隻支援 properties 和 yaml 類型。 啟動nacos,登陸localhost:8848/nacos,建立一個data id ,完整的配置如圖所示: