SpringCloud Alibaba01-Nacos

全家桶介紹: //spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_start_a_provider_application

整個父POM

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="//maven.apache.org/POM/4.0.0" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.huangzhen.springcloud</groupId>
    <artifactId>springcloud2020</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>cloudalibaba-provider-payment9001</module>
        <module>cloudalibaba-provider-payment9002</module>
        <module>cloudalibaba-consumer-order83</module>
        <module>cloudalibaba-config-nacos-client3377</module>
        <module>cloudalibaba-sentinel-service8401</module>
        <module>cloudalibaba-provider-payment9003</module>
        <module>cloudalibaba-provider-payment9004</module>
        <module>cloudalibaba-consumer-nacos-order84</module>
        <module>seata-order-service2001</module>
        <module>seata-account-service2003</module>
        <module>seata-storage-service2002</module>
    </modules>
    <packaging>pom</packaging>

    <!-- 統一管理jar包版本 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <junit.version>4.12</junit.version>
        <log4j.version>1.2.17</log4j.version>
        <lombok.version>1.16.18</lombok.version>
        <mysql.version>8.0.19</mysql.version>
        <druid.version>1.1.16</druid.version>
        <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
    </properties>

    <!-- 子模塊繼承之後,提供作用:鎖定版本+子modlue不用寫groupId和version  -->
    <dependencyManagement>
        <dependencies>
            <!--spring boot 2.2.2-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud Hoxton.SR1-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud alibaba 2.1.0.RELEASE-->
            <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>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>${druid.version}</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis.spring.boot.version}</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
                <optional>true</optional>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                    <addResources>true</addResources>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

1.Nacos:服務註冊與配置中心

Nacos:Dynamic Naming and Configuration Service

Nacos = Eureka + Bus + Config

即Nacos是註冊中心+配置中心。

官網: //nacos.io/zh-cn

1.1 邏輯架構及其組件介紹

nacos-logic.jpg

  • 服務管理:實現服務CRUD,域名CRUD,服務健康狀態檢查,服務權重管理等功能
  • 配置管理:實現配置管CRUD,版本管理,灰度管理,監聽管理,推送軌跡,聚合數據等功能
  • 元數據管理:提供元數據CURD 和打標能力
  • 插件機制:實現三個模塊可分可合能力,實現擴展點SPI機制
  • 事件機制:實現異步化事件通知,sdk數據變化異步通知等邏輯
  • 日誌模塊:管理日誌分類,日誌級別,日誌可移植性(尤其避免衝突),日誌格式,異常碼+幫助文檔
  • 回調機制:sdk通知數據,通過統一的模式回調用戶處理。接口和數據結構需要具備可擴展性
  • 尋址模式:解決ip,域名,nameserver、廣播等多種尋址模式,需要可擴展
  • 推送通道:解決server與存儲、server間、server與sdk間推送性能問題
  • 容量管理:管理每個租戶,分組下的容量,防止存儲被寫爆,影響服務可用性
  • 流量管理:按照租戶,分組等多個維度對請求頻率,長鏈接個數,報文大小,請求流控進行控制
  • 緩存機制:容災目錄,本地緩存,server緩存機制。容災目錄使用需要工具
  • 啟動模式:按照單機模式,配置模式,服務模式,dns模式,或者all模式,啟動不同的程序+UI
  • 一致性協議:解決不同數據,不同一致性要求情況下,不同一致性機制
  • 存儲模塊:解決數據持久化、非持久化存儲,解決數據分片問題
  • Nameserver:解決namespace到clusterid的路由問題,解決用戶環境與nacos物理環境映射問題
  • CMDB:解決元數據存儲,與三方cmdb系統對接問題,解決應用,人,資源關係
  • Metrics:暴露標準metrics數據,方便與三方監控系統打通
  • Trace:暴露標準trace,方便與SLA系統打通,日誌白平化,推送軌跡等能力,並且可以和計量計費系統打通
  • 接入管理:相當於阿里雲開通服務,分配身份、容量、權限過程
  • 用戶管理:解決用戶管理,登錄,sso等問題
  • 權限管理:解決身份識別,訪問控制,角色管理等問題
  • 審計系統:擴展接口方便與不同公司審計系統打通
  • 通知系統:核心數據變更,或者操作,方便通過SMS系統打通,通知到對應人數據變更
  • OpenAPI:暴露標準Rest風格HTTP接口,簡單易用,方便多語言集成
  • Console:易用控制台,做服務管理、配置管理等操作
  • SDK:多語言sdk
  • Agent:dns-f類似模式,或者與mesh等方案集成
  • CLI:命令行對產品進行輕量化管理,像git一樣好用

1.2 數據模型

Nacos 數據模型 Key 由三元組唯一確定, Namespace默認是空串,公共命名空間(public),分組默認DEFAULT_GROUP

1.3 安裝與運行Nacos

1.3.1 下載

//github.com/alibaba/nacos/releases/tag/1.1.4

1.3.2 運行

解壓安裝包,直接運行bin目錄下的startup.cmd

命令運行成功後直接訪問//localhost:8848/nacos

默認賬戶和密碼都是nacos

1.4 Nacos作為服務註冊中心

1.4.1 服務提供者

1.新建模塊:cloudalibaba-provider-payment9001

2.POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="//maven.apache.org/POM/4.0.0"
         xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud2020</artifactId>
        <groupId>com.huangzhen.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloudalibaba-provider-payment9001</artifactId>

    <dependencies>
        <!--SpringCloud ailibaba nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- SpringBoot整合Web組件 -->
        <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>
        <!--日常通用jar包配置-->
        <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>
</project>

3.yaml

server:
  port: 9001

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #配置Nacos地址

management:
  endpoints:
    web:
      exposure:
        include: '*'

4.主啟動類

@SpringBootApplication
@EnableDiscoveryClient //發現服務
public class ProviderMain9001 {
    public static void main(String[] args){
        SpringApplication.run(ProviderMain9001.class, args);
    }
}

5.測試Controller

@RestController
@Slf4j
public class PaymentController {
    
    @Value("${server.port}")
    private String port;
    
    @GetMapping("/payment/nacos/{id}")
    public String paymentInfo(@PathVariable("id") Integer id) {
        return "這裡是服務提供者:  " + port + "      \t 編號:" + id + "\t很高興為您服務!";
    }
}

6.為了負載均衡的演示,參照9001,新建9002.

1.4.2 服務消費者

1.新建模塊:cloudalibaba-consumer-nacos-order83

2.POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="//maven.apache.org/POM/4.0.0"
         xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud2020</artifactId>
        <groupId>com.huangzhen.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloudalibaba-consumer-order83</artifactId>

    <dependencies>
        <!--SpringCloud ailibaba nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- 引入自己定義的api通用包,可以使用Payment支付Entity -->
        <dependency>
            <groupId>com.huangzhen.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!-- SpringBoot整合Web組件 -->
        <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>
        <!--日常通用jar包配置-->
        <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>
</project>

3.yaml

server:
  port: 83


spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848


#消費者將要去訪問的微服務名稱(註冊成功進nacos的微服務提供者)
service-url:
  nacos-user-service: //nacos-payment-provider

4.主啟動類

@SpringBootApplication
@EnableDiscoveryClient
public class OrderMain83 {
    public static void main(String[] args) {
        SpringApplication.run(OrderMain83.class, args);
    }
}

5.config:配置負載均衡

@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced //必須加
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

6.Controller

@RestController
public class OrderController {

    @Value("${service-url.nacos-user-service}")//從yaml中取
    private String serverURL;

    @Resource
    private RestTemplate restTemplate;


    @GetMapping("/consumer/payment/nacos/{id}")
    public String paymentInfo(@PathVariable("id") Integer id) {
        return restTemplate.getForObject(serverURL + "/payment/nacos/" + id, String.class);
    }
}

7.測試:

啟動nacos,9001,9002,83

//localhost:83/consumer/payment/nacos/31

1.5 服務註冊中心對比

CAP: 一致性(Consistency)可用性(Availability)分區容錯性(Partition tolerance)

CAP原則指的是,這三個要素最多只能同時實現兩點,不可能三者兼顧。

Nacos:支持AP和CP模式的切換。

1.6 Nacos作為服務配置中心

1.新建模塊

cloudalibaba-config-nacos-client3377

2.POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="//maven.apache.org/POM/4.0.0"
         xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud2020</artifactId>
        <groupId>com.huangzhen.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloudalibaba-config-nacos-client3377</artifactId>


    <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>
</project>

3.yml

3.1 bootstrap.yml

# nacos配置
server:
  port: 3377

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服務註冊中心地址
      config:
        server-addr: localhost:8848 #Nacos作為配置中心地址
        file-extension: yaml #指定yaml格式的配置

3.2 application.yml

spring:
  profiles:
    active: dev # 表示開發環境

4.主啟動類

@SpringBootApplication
@EnableDiscoveryClient
public class NacosClientMain3377 {
    public static void main(String[] args) {
        SpringApplication.run(NacosClientMain3377.class, args);
    }
}

5.Controller

@RestController
@RefreshScope //動態刷新配置文件
public class ClientController {

    @Value("${config.info}")
    private String config_info;


    @GetMapping("/config/info")
    public String getConfig_info() {
        return config_info;
    }
}

6.Nacos配置規則

nacos控制台中Data ID配置規則:

${prefix}-${spring.profile.active}.${file-exetension}

${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來配置

注意, boostrap.yml中配置的 文件名為yaml時,Nacos的配置文件名也必須為yaml

7.在Nacos中添加配置

這裡是已經配置好的,安裝此去新建即可。

8.測試

  • 啟動前需要在nacos客戶端-配置管理-配置管理欄目下有對應的yaml配置文件
  • 運行cloud-config-nacos-client3377的主啟動類
  • //localhost:3377/config/info

會看到nacos中的配置文件的信息會顯示在頁面上。

9.自帶動態刷新

修改下Nacos中的yaml配置文件,再次調用查看配置的接口,就會發現配置已經刷新。

不需要向Config和Bus中還要分發和廣播。

1.7 配置中心詳解

按照Namespace + Group + DataID設計配置,以適應多環境多項目管理。

類似Java裏面的package名和類名,最外層的namespace是可以用於區分部署環境的,Group和DataID邏輯上區分兩個目標對象。

三者情況:

默認情況:

  • Namespace=public
  • Group=DEFAULT_GROUP
  • Cluster=DEFAULT

Namespace:主要用來實現環境之間的隔離。

Group:可以把不同的微服務劃分到同一個分組裏面。

Service:就是微服務,一個Service可以包含多個Cluster(集群),Nacos默認Cluster是DEFAULT,Cluster是對指定微服務的一個虛擬劃分。

Instance:微服務的實例。

1.8 三種配置案例

1.8.1 DataID方案

指定spring.profile.active和配置文件的DataID來使不同環境下讀取不同的配置:

  • 默認空間+默認分組+新建dev和test兩個DataID

  • 通過spring.profile.active屬性就能進行多環境下配置文件的讀取

  • spring:
      profiles:
        active: dev # 表示開發環境
        #active: test # 表示測試環境
    

1.8.2 Group方案

  • 在創建配置時候,新建Group

  • 在bootstrap.yml中新加Group

  •       config:
            server-addr: localhost:8848 #Nacos作為配置中心地址
            file-extension: yaml #指定yaml格式的配置
            group: H1_GROUP
    

1.8.3 Namespace方案

  • 新建dev的Namespace

  • 回服務列表查看

  • 新加三條配置

  • 在bootstrap.yml中添加namespace

  •   cloud:
        nacos:
          discovery:
            server-addr: localhost:8848 #Nacos服務註冊中心地址
          config:
            server-addr: localhost:8848 #Nacos作為配置中心地址
            file-extension: yaml #指定yaml格式的配置
            group: TEST_GROUP
            namespace: a8ddac2c-68f8-4b3c-8c65-b31e0327ebbc  #此為命名空間ID
    

1.9 Nacos集群

1.9.1 Nacos持久化說明

1.Nacos默認自帶的是嵌入式數據庫derby

2.derby到mysql切換配置步驟想·

  • nacos-server-1.1.4\nacos\conf目錄下找到sql腳本:nacos-mysql.sql,提前新建庫nacos_config

  • nacos-server-1.1.4\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=123456
    #這就代表後續我們新建的各種配置列表都會存入你設定的mysql數據庫中,而不是存入自帶的derby
    
  • 再次啟動nacos,會發現前面的配置都消失了。

1.9.2 集群配置

1個Nginx+3個Nacos+1個MySQL(實際應該是MySQL集群,至少為一主一從)

為了減少端口的開放步驟,我提前將防火牆關閉。

1.通過Yum安裝Nginx

  • 在/etc/yum.repo.d目錄下面創建一個nginx的yum源,然後就可以直接用yum install nginx安裝

  • cd /etc/yum.repo.d #切換到yum安裝源文件目錄

  • vim nginx.repo #創建一個安裝包源,把以下內容複製進去,保存退出

[nginx-stable]
name=nginx stable repo
baseurl=//nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=//nginx.org/keys/nginx_signing.key
[nginx-mainline]
name=nginx mainline repo
baseurl=//nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=//nginx.org/keys/nginx_signing.key
  • yum repolist #查看是否成功加載了此數據源

  • yum install nginx
    systemctl enable nginx  #設置nginx為開機啟動
    systemctl start nginx  #啟動nginx服務
    

2.配置MySQL5.7

安裝MySQL5.7教程: //blog.csdn.net/WYA1993/article/details/88890883

  • 新建庫nacos_config,將sql腳本:nacos-mysql.sql執行。
  • 修改application.properties配置,與window下操作一樣

3.安裝和配置Nacos

  • 通過WinSCP將nacos-server-1.1.4.tar.gz複製到/Software/mynacos中

  • tar -zxvf nacos-server-1.1.4.tar.gz解壓縮

  • 選定啟動方式

  • 修改cluster.conf ——-在nacos/config 目錄下

    • cp cluster.conf.example cluster.conf

    • vim cluster.conf ,修改成如下:

    • 這個ip不寫127.0.0.1 必須是Linux命令hostname -i能識別的IP

  • 修改startup.sh,使其能夠接受不同的啟動端—–在nacos/bin目錄下

4.配置Nginx

  • 由於是通過Yum安裝的Nginx,Nginx的配置文件位於/etc/nginx

  • vim 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 //cluster;
            }
       }
    
  • 重啟Nginx:systemctl restart nginx

5.測試

  • 啟動三個nacos

    • ./startup.sh -p 3333/4444/5555 這裡是三條命令(簡寫,別直接複製執行)
  • 由於Nginx是開機自動啟動,這裡不再啟動。

  • 訪問192.168.11.114:1111/nacos 這裡192.168.11.114是我自己的ip地址

  • 顯示如下則成功

  • 上面配置是我添加的,再到數據庫中查看是否存在。

  • 顯示如下則成功

  • 圖沒截完整,先縮小後放大,可以看到我在nacos上配置的一條記錄。