1 SpringCloud Alibaba入門簡介
1、Alibaba出現的原因
Spring Cloud Netflix項目進入維護模式
新元件功能将以其他替代的方式實作:
2、概述
官網:
https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
3、作用
4、操作
Sentinel:把流量作為切入點,從流量控制、熔斷降級、系統負載保護等多個次元保護服務的穩定性。
Nacos:一個更易于建構雲原生應用的動态服務發現、配置管理和服務管理平台。
RocketMQ:一款開源的分布式消息系統,基于高可用分布式叢集技術,提供低延時的、高可靠的消息釋出與訂閱服務。
Dubbo:Apache Dubbo™ 是一款高性能 Java RPC 架構。
Seata:阿裡巴巴開源産品,一個易于使用的高性能微服務分布式事務解決方案。
Alibaba Cloud ACM:一款在分布式架構環境中對應用配置進行集中管理和推送的應用配置中心産品。
Alibaba Cloud OSS: 阿裡雲對象存儲服務(Object Storage Service,簡稱 OSS),是阿裡雲提供的海量、安全、低成本、高可靠的雲存儲服務。您可以在任何應用、任何時間、任何地點存儲和通路任意類型的資料。
Alibaba Cloud SchedulerX: 阿裡中間件團隊開發的一款分布式任務排程産品,提供秒級、精準、高可靠、高可用的定時(基于 Cron 表達式)任務排程服務。
Alibaba Cloud SMS: 覆寫全球的短信服務,友好、高效、智能的互聯化通訊能力,幫助企業迅速搭建客戶觸達通道。
5、SpringCloud alibaba學習資料擷取
網址:
https://spring.io/projects/spring-cloud-alibaba#overview
API:
https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html
2 SpringCloud Alibaba Nacos服務注冊和配置中心
1 介紹
1、概述
Nacos(Nacos:Dynamic Naming and Configuration Service)的前四個字母分别為Naming和Configuration的前兩個字母,最後的s為Service。
一個更易于建構雲原生應用的動态服務發現,配置管理和服務管理中心,Nacos就是注冊中心+配置中心的組合,等價于Nacos = Eureka+Config+Bus。
2、下載下傳位址
https://github.com/alibaba/Nacos
https://nacos.io/zh-cn/index.html
3、各種注冊中心比較
2 安裝并運作Nacos
1、本地Java8+Maven環境已經OK,進入下面的官網下載下傳
https://github.com/alibaba/nacos/releases/tag/1.1.4
2、解壓安裝包,直接運作bin目錄下的startup.cmd
修改bin目錄下的startup.cmd檔案,将
set MODE="cluster"
一行改成
set MODE="standalone"
,然後直接運作startup.cmd。
3、指令運作成功後直接通路下面的網址,輸入預設的賬号和密碼nacos
http://localhost:8848/nacos
進入下面的界面:
3 Nacos作為服務注冊中心示範
1、基于Nacos的服務提供者
項目名:cloudalibaba-provider-payment9001/9002。
項目結構:
1、添加pom
(1)父pom
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
(2)本子產品pom
<dependencies>
<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.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
</dependencies>
2、添加yml
server:
port: 9003 #9001端口被占用
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos位址
management:
endpoints:
web:
exposure:
include: '*'
3、主啟動類
@EnableDiscoveryClient //可以注冊進nacos
@SpringBootApplication
public class PaymentMain9001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain9001.class,args);
}
}
4、業務類-controller
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id) {
return "nacos registry, serverPort: " + serverPort + "\t id" + id;
}
}
5、以同樣方式建立cloudalibaba-provider-payment9002。
6、測試
依次啟動cloudalibaba-provider-payment9001/9012,浏覽器輸入下面的網址:
http://localhost:9011/payment/nacos/1
可以正常通路cloudalibaba-provider-payment9001中的服務。
2、基于Nacos的服務消費者
項目名稱:cloudalibaba-consumer-nacos-order83
項目結構:
1、添加pom
<dependencies>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.xiaolun.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
nacos支援負載均衡的原因:
2、添加yml檔案
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
service-url:
nacos-user-service: http://nacos-payment-provider
3、主啟動
@EnableDiscoveryClient
@SpringBootApplication
public class OrderNacosMain83
{
public static void main(String[] args)
{
SpringApplication.run(OrderNacosMain83.class,args);
}
}
4、業務類
(1)config
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
(2)controller
@RestController
@Slf4j
public class OrderNacosController
{
@Resource
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String serverURL;
@GetMapping(value = "/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Long id)
{
return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
}
}
5、測試
依次啟動cloudalibaba-provider-payment9001/9012,cloudalibaba-consumer-nacos-order83,在nacos的可視化界面中,可以看到:
輸入下面網址:
http://localhost:83/consumer/payment/nacos/13
實作cloudalibaba-consumer-nacos-order83通路cloudalibaba-provider-payment9001/9002,輪詢負載。
3、服務中心對比
Nacos支援AP和CP模式的切換:
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
4、Nacos作為服務配置中心示範
1、建立cloudalibaba-config-nacos-client3377
項目結構:
1、添加pom
<dependencies>
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--web + actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--一般基礎配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2、添加yml
(1)application.yml
spring:
profiles:
active: dev
(2)bootstrap.yml
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #服務注冊中心位址
config:
server-addr: localhost:8848 #配置中心位址
file-extension: yaml #指定yaml格式的配置
#${spring.application.name}-${spring.profile.active}-&{spring.cloud.nacos.config.file-extension}
3、主啟動類
@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClientMain3377 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class, args);
}
}
4、業務類-controller
@RestController
@RefreshScope //支援nacos的動态重新整理功能
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}
5、在Nacos中添加配置資訊DataId
(1)Nacos中的DataId的組成格式與SpringBoot配置檔案中的比對規則
官網:
https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
公式:
${spring.application.name}-${spring.profile.active}-&{spring.cloud.nacos.config.file-extension}
#prefix預設為spring.application.name的值
#spring.profile.active既為目前環境對應的profile,可以通過配置項spring.profile.active 來配置
#file-exetension為配置内容的資料格式,可以通過配置項spring.cloud.nacos.config.file-extension配置
(2)在預設的Group中建立Data Id
在下面的配置内容中增加下面的内容:
config:
info: nacos config center,version = 1
6、測試
啟動前需要在nacos用戶端-配置管理-配置管理欄目下有沒有對應的yaml配置檔案,然後再啟動cloud-config-nacos-client3377,輸入下面的網址調用接口檢視配置資訊:
http://localhost:3377/config/info
在浏覽器界面顯示:
然後,修改下Nacos中的yaml配置檔案,再次調用檢視配置的接口,就會發現配置已經重新整理-自帶動态重新整理。
2、分類配置
1、遇到的問題
2、Namespace+Group+Data ID三者關系
預設新增的所有配置都在public空間。
3、DataID方案
(1)指定spring.profile.active和配置檔案的DataID來使不同環境下讀取不同的配置。
接下來我們建立dev/test配置DataID,此時就有這樣的布局:預設空間+預設分組+建立dev和test兩個DataID。
(2)測試
通過spring.profile.active屬性來進行多環境下配置檔案的讀取:
輸入網址:
http://localhost:3377/config/info
能夠讀取nacos-config-client-test.yaml檔案中的配置。
4、Group方案
通過Group來實作環境區分。
(1)建立Group
在config下增加一條group的配置即可,比如這裡配置為TEST_GROUP。
(2)bootstrap+application檔案中要開啟對應配置
5、Namespace方案
(1)建立dev/test的Namespace
當然,我們也可以在每一個微服務之間互相隔離配置,每一個微服務都建立自己的命名空間,隻加載自己命名空間下的所有配置。
(2)回到服務管理-服務清單檢視
(3)在dev命名空間添加如下的配置
(4)bootstrap+application檔案中要開啟對應配置
需要在bootstarp.yml檔案中配置使用到了命名空間下的配置。
5、Nacos叢集和持久化配置(重要)
1、架構說明
1、官網架構圖
https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
了解:
2、說明
官網:
https://nacos.io/zh-cn/docs/deployment.html
2、持久化切換配置
Nacos預設自帶的是嵌入式資料庫derby,我們需要将資料從derby到mysql進行切換配置,步驟如下:
1、D:\03Enviroment\18Nacos\nacos\conf目錄下找到sql腳本nacos-mysql.sql,然後放到Navicat中執行腳本。
首先,建立資料庫nacos_config,然後建立查詢即可。
2、D:\03Enviroment\18Nacos\nacos\conf目錄下找到application.properties,添加資料庫配置
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?serverTimezone=GMT%2B8&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123
3、啟動nacos
我使用的指令為:
D:\03Enviroment\18Nacos\nacos\bin>startup.cmd -m standalone
#單單執行這個會報錯
startup.cm
啟動nacos,可以看到是個全新的空記錄界面,在裡面新添加一個DataID,在資料庫中會有相應的顯示。
3、Linux版Nacos+MySQL生産環境配置
需求:1個nginx+3個nacos注冊中心+1個mysql。
1、nacos的下載下傳安裝。
安裝到的叢集位置如下:
192.168.10.101/myncos/nacos
2、Linux伺服器上mysql資料庫配置
(1)啟動mysql服務,然後使用下面的指令建立資料庫
CREATE DATABASE IF NOT EXISTS nacos_config;
(2)運作mysql的腳本檔案nacos-mysql.sql
> source /mynacos/nacos/conf/nacos-mysql.sql
3、nacos配置
(1)配置/mynacos/nacos/conf/application.properties,将下面的内容粘貼
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123
(2)nacos的叢集配置mynacos/nacos/conf/cluster.conf
因為是叢集配置,是以,不能寫127.0.0.1。
(3)編輯Nacos的啟動腳本/mynacos/nacos/bin/startup.sh,使它能夠接受不同的啟動端
修改内容如下:
添加下面的内容:
-Dserver.port=${SERVER_PORT}
使用下面的方式啟動:
./startup.sh -p 3333
執行下面的指令檢視啟動的nacos叢集數:
ps -ef|grep nacos|grep -v grep|wc -l
我們下面的目錄檢視啟動情況:
vim /mynacos/nacos/logs/start.out
4、配置Nginx,由它作為負載均衡器
(1)修改nginx配置檔案/usr/local/nginx/conf/nginx.conf
upstream cluster{
server 127.0.0.1:3333;
server 127.0.0.1:4444;
server 127.0.0.1:5555;
}
server {
listen 1111;
server_name localhost;
location / {
proxy_pass http://cluster;
}
(2)按照指代檔案啟動
5、測試
(1)通過nginx通路nacos
//192.168.10.101為虛拟ip,最後添加nacos,不然會報錯。注意,隻能啟動一個該視窗,不然會報錯。
https://192.168.10.101:1111/nacos
(2)在nacos界面中建立一個配置
(3)微服務cloudalibaba-provider-payment9012啟動注冊進nacos叢集
修改yml配置檔案:
啟動該服務,我們可以在網頁中看着該服務已經注冊到nacos中了:
6、總結
ps://192.168.10.101:1111/nacos
(2)在nacos界面中建立一個配置
<img src="https://gitee.com/whlgdxlkl/my-picture-bed/raw/master/uploadPicture/20200831112438.png" alt="image-20200824112256836" style="zoom:50%;" />
<img src="https://gitee.com/whlgdxlkl/my-picture-bed/raw/master/uploadPicture/20200831112439.png" alt="image-20200824112321527" style="zoom:67%;" />
(3)微服務cloudalibaba-provider-payment9012啟動注冊進nacos叢集
修改yml配置檔案:
<img src="https://gitee.com/whlgdxlkl/my-picture-bed/raw/master/uploadPicture/20200831112440.png" alt="image-20200824112434167" style="zoom:67%;" />
```yaml
server-addr: 192.168.10.101:1111
啟動該服務,我們可以在網頁中看着該服務已經注冊到nacos中了:
6、總結