日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Nacos簡介

作者:兩篇空白 更新時間: 2024-03-21 編程語言

一、Nacos的概述

Nacos 是 Dynamic Naming and Configuration Service的首字母簡稱,是一個更易于構建云原生應用的動態服務發現、配置管理和服務管理平臺,是阿里巴巴的新開源項目 。

Nacos主要提供三種功能:服務注冊與發現、動態配置服務、動態DNS服務。

二、Nacos的安裝和啟動

1.下載

Nacos下載地址:Tags · alibaba/nacos · GitHub

2.安裝

將下載好的Nacos安裝包上傳到到linux服務上,使用xshell進行安裝包上傳。

[root@localhost ~]# rz                                                     #上傳命令
[root@localhost ~]# mv  nacos-server-1.4.1.tar.gz   /usr/local             #移動安裝包

[root@localhost local]# tar -zxvf nacos-server-1.4.1.tar.gz                #解壓安裝包

[root@localhost local]# rm -rf nacos-server-1.4.1.tar.gz                   #刪除安裝包

3.啟動

[root@localhost local]# cd nacos/bin/
[root@localhost bin]# ./startup.sh -m standalone            #非集群模式啟動

[root@localhost bin]# ./startup.sh -m standalone
/usr/local/jdk1.8.0_191/bin/java  -Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true -Dnacos.member.list= -Djava.ext.dirs=/usr/local/jdk1.8.0_191/jre/lib/ext:/usr/local/jdk1.8.0_191/lib/ext -Xloggc:/usr/local/nacos/logs/nacos_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -Dloader.path=/usr/local/nacos/plugins/health,/usr/local/nacos/plugins/cmdb -Dnacos.home=/usr/local/nacos -jar /usr/local/nacos/target/nacos-server.jar  --spring.config.additional-location=file:/usr/local/nacos/conf/ --logging.config=/usr/local/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288
nacos is starting with standalone
nacos is starting,you can check the /usr/local/nacos/logs/start.out

4.測試

瀏覽器訪問:http://192.168.238.132:8848/nacos,默認用戶名/密碼為: nacos/nacos

注意:此網址為自己安裝nacos虛擬機的ip地址;

????????? 如果Linux開啟了防火墻的話需要把8848端口給放行,這樣才能通過外網訪問該端口。

//開放防火墻
systemctl start firewalld

//關閉防火墻 
systemctl stop firewalld

//開放nacos端口
//命令含義:
// --zone #作用域
// --add-port=8848/tcp  #添加端口,格式為:端口/通訊協議
// --permanent  #永久生效,沒有此參數重啟后失效
firewall-cmd --zone=public --add-port=8848/tcp --permanent

# 重啟防火墻
firewall-cmd --reload

# 查看防火墻啟動端口情況
firewall-cmd --list-all
# 如果顯示了該8848端口則為啟動成功。

?

5.關閉

[root@localhost bin]# ./shutdown.sh
The nacosServer(8166) is running...
Send shutdown request to nacosServer(8166) OK

三、Nacos注冊中心入門

1.什么是Nacos注冊中心

注冊中心主要有三部分組成:

?????????Nacos-Server:注冊中心

????????????????提供服務的注冊和發現。

?????????Nacos-Provider:服務提供方

????????????????把自身的服務實例注冊到 Nacos Server 中

?????????Nacos-Consumer:服務調用方

????????????????通過 Nacos Server 獲取服務列表,消費服務。

2.代碼案例

案例結構:

父工程pom.xml

        <dependencies>
            <!--Spring Boot-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.3.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud Netflix-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR9</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud 阿里巴巴-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.6.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>

springcloud_common模塊

pom.xml

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

    <artifactId>springcloud_common</artifactId>

</project>

pojo層

public class User {
    private Integer id;
    private String name;
    private Integer age;

    public User() {
    }

    public User(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

nacos_provider模塊

pom.xml

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.wrs</groupId>
            <artifactId>springcloud_common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--nacos客戶端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

application.yml

server:
  port: 9090

啟動器

@SpringBootApplication
@EnableDiscoveryClient   //向注冊中心注冊該服務,并可以獲取其他服務的調用地址
public class NacosProviderApp {
    public static void main(String[] args) {
        SpringApplication.run(NacosProviderApp.class);
    }
}

service層

public interface UserService {
    User getUserById(Integer id);
}
@Service
public class UserServiceImpl implements UserService {

    @Override
    public User getUserById(Integer id) {
        return new User(id,"張三",18);
    }
}

controller控制層

@RestController
@RequestMapping("/provider")
public class ProviderController {
    @Autowired
    private UserService userService;
    @RequestMapping("/getUserById/{id}")
    public User getUserById(@PathVariable Integer id){
        return userService.getUserById(id);
    }
}

nacos_consumer模塊

pom.xml

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.wrs</groupId>
            <artifactId>springcloud_common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--nacos客戶端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

application.yml

server:
  port: 80
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.238.132:8848 #nacos服務的地址
  application:
    name: nacos-provider #向注冊中心注冊的名字

啟動器

@SpringBootApplication
@EnableDiscoveryClient//向注冊中心注冊該服務,并可以獲取其他服務的調用地址
public class ProviderApp {

    public static void main(String[] args) {
        SpringApplication.run(ProviderApp.class);
    }
}

config配置層

@Configuration
public class ConfigBean {
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

controller控制層

@RestController
@RequestMapping(value = "/consumer")
public class ConsumerController {
	
	@Autowired
	private RestTemplate restTemplate;

	@Autowired
	private DiscoveryClient discoveryClient; //發現服務的工具類

	@RequestMapping(value="/getUserById/{id}")
	public User getUserById(@PathVariable Integer id){
		//獲取nacos中注冊的所有服務信息
		List<String> serviceList = discoveryClient.getServices();
		for (String service : serviceList) {
			System.out.println(service);
		}
		//獲取nacos中注冊的指定服務信息
		ServiceInstance instance = discoveryClient.getInstances("nacos-provider").get(0);
		String serviceUrl = instance.getHost() + ":" + instance.getPort();

		String url = "http://"+serviceUrl+"/provider/getUserById/"+id;
		return restTemplate.getForObject(url, User.class);
	}
}

測試:

通過兩個模塊的啟動,進行注冊,注冊到服務中心,如下圖:

3. 為什么要使用注冊中心?

因為不使用注冊中心:1.地址硬編碼

??????????????????????????????????? 2.不能負載均衡

四、配置中心

1.配置中心入門

微服務架構下關于配置文件的一些問題:

  • 配置文件相對分散。在一個微服務架構下,配置文件會隨著微服務的增多變的越來越多,而且分散在各個微服務中,不好統一配置和管理。

  • 配置文件無法區分環境。微服務項目可能會有多個環境,例如:測試環境、預發布環境、生產環境。每一個環境所使用的配置理論上都是不同的,一旦需要修改,就需要我們去各個微服務下手動維護,這比較困難。

  • 配置文件無法實時更新。我們修改了配置文件之后,必須重新啟動微服務才能使配置生效,這對一個正在運行的項目來說是非常不友好的。

基于上面這些問題,我們就需要配置中心的加入來解決這些問題, 配置中心的思路是:

  1. 首先把項目中各種配置全部都放到一個集中的地方進行統一管理。

  2. 當各個服務需要獲取配置的時候,就來配置中心的接口拉取自己的配置。

  3. 當配置中心中的各種參數有更新的時候,也能通知到各個服務實時的過來同步最新的信息,使之動態更新。

nacos配置中心的作用:

??? 系統配置的集中管理(編輯、存儲、分發)、動態更新不重啟回滾配置(變更管理、歷史版本管理、變更審計)等所有與配置相關的活動。

創建nacos_config模塊

添加依賴pom.xml

    <dependencies>
        <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-config</artifactId>
        </dependency>
    </dependencies>

bootstrap.yml

????????添加一個比application.yml文件優先級更高的配置文件 bootstrap.yml

????????bootstrap/application的應用場景:

  • bootstrap.yml 比 application.yml 優先加載,應用于系統級別參數配置,一般不會變動;
  • application.yml 應用于 SpringBoot 項目的自動化配置;
spring:
  cloud:
    nacos:
      config:
        server-addr: 192.168.238.132:8848 #配置中心得地址
        file-extension: yaml #配置文件擴展名只支持properties和yaml
        prefix: nacos-config #文件名,默認是spring.application.name
    

添加配置:

  • 在 Nacos 中,dataId(配置文件的命名的規則) 的完整格式如下:

    ${spring.cloud.nacos.config.prefix}.${spring.cloud.nacos.config.file-extension}

  • 說明:

    • spring.cloud.nacos.config.prefix:默認是當前服務的服務名稱

    • spring.cloud.nacos.config.file-extension:配置文件的格式(后綴),目前只支持yaml和properties

  • 在nacos中創建配置文件
    • ?Data ID:prefix.file-extension
    • ?配置格式:yaml或properties

?controller控制器:

在配置內容中添加:

 datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/health?characterEncoding=UTF-8
    username: root
    password: 1111
    type: com.alibaba.druid.pool.DruidDataSource

可利用controller層進行讀取,將所添加的內容顯示到頁面上

@RefreshScope? 作用:在修改配置文件后則重新生成bean,能夠實時更新配置內容

@RestController
@RefreshScope   //修改配置文件后則重新生成bean
public class ConfigController {
    @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;
    @Value("${spring.datasource.url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String username;
    @Value("${spring.datasource.password}")
    private String password;
    @Value("${spring.datasource.type}")
    private String type;

    @GetMapping("/config/info")
    public String getConfigInfo(){
        System.out.println(this);
        String configInfo=driverClassName+"<br>"+url+"<br>"+username+"<br>"
                +password+"<br>"+type;
        return configInfo;
    }

}

啟動器

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

動態實時更新配置原理:

當啟動時加載配置文件

修改配置文件后nacos監聽到MD5有變化則推送消息給客戶端(實際上就是調用客戶端),客戶端收到消息后會拉去最新配置

MD5相當于UUID,每次配置文件修改后,都會生成一個新版本,生成一個新的MD5,然后通知客戶端,給客戶端發送信息,客戶端拉去更新后的配置信息

nacos會在本地緩存一份配置文件,當需要時能夠直接從本地獲取使用,如果配置文件有改動,則會從新獲取一份,緩存到本地

一般會緩存到以下目錄中

?可以通過瀏覽器訪問:http://127.0.0.1/config/info? 查看配置信息

為什么要用配置中心:

因為配置中心可以:1. 集中管理配置文件
?? ?? ?????????????????????????? 2.動態更新配置文件

2.配置中心隔離

1.配置管理模型

對于Nacos配置管理,通過Namespace、group、Data ID能夠定位到一個配置集。

Namespace Group DataId介紹:

  • Namespace: 代表不同的環境的配置隔離, 如: 開發、測試, 生產等

  • Group: 可以代表某個項目, 如XX醫療項目, XX電商項目

  • DataId: 每個項目下往往有若干個工程, 每個配置集(DataId)是一個工程的主配置文件

獲取配置集需要指定:

??????? 1.nacos服務地址,必須指定

??????? 2.namespace,如不指定默認public

??????? 3.group,如不指定默認為DEFAULT_GROUP

namespace隔離

命名空間(Namespace)是用于隔離多個環境的(如開發、測試、生產),而每個應用在不同環境的同一個配置(如數據庫數據源)的值是不一樣的。因此,我們應針對企業項目實際研發流程、環境進行規劃。如某軟件公司擁有開發、測試、生產三套環境,那么我們應該針對這三個環境分別建立三個namespace。

新建namespace

?建立好namespace后,在配置管理與服務管理模塊下所有頁面,都會包含用于切換namespace的選項卡,如下圖:

克隆配置文件

點擊左下角“克隆”按鈕,將會彈出克隆對話框,此功能可用于將配置遷移到其他Namespace。

?選擇中一個要克隆到的目標空間,也可以對克隆的配置文件進行Data ID,Group 名稱修改,不修改則是默認被克隆的配置文件的Data ID,Group的名稱,點擊“開始克隆”,

?點擊克隆后,則是將被克隆的配置文件的內容全部克隆過來。

在bootstrap.yml中添加namesspace屬性,例如:“namespace: dev”,依舊可以進行動態配置

spring:
  cloud:
    nacos:
      config:
        server-addr: 192.168.238.132:8848 #配置中心得地址
        file-extension: yaml #配置文件擴展名只支持properties和yaml
        prefix: nacos-config #文件名,默認是spring.application.name
        namespace: dev #開發環境

Group隔離

1.新建配置文件并修改Group名

2.不同的配置分組下可以有相同的配置 ,相當于一個大文件夾(dev)有兩個小文件夾(group)

?bootstrap.yml

spring:
  cloud:
    nacos:
      config:
        server-addr: 192.168.238.132:8848 #配置中心得地址
        file-extension: yaml #配置文件擴展名只支持properties和yaml
        prefix: nacos-config #文件名,默認是spring.application.name
        namespace: dev #開發環境
        group: NACOS_GROUP #項目名

服務隔離

nacos_provider模塊中application.yml

server:
  port: 9090
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.238.132:8848 #nacos服務的地址
        namespace: dev
        group: NACOS_GROUP
  application:
    name: nacos-provider #向注冊中心注冊的名字

在dev環境下能夠看到nacos-provider,group為NACOS_GROUP

?在public環境下能夠看到nacos-consumer,group為DEFAULT_GROUP

?進行調用時,找不到數據,前端報500錯誤,后端報“下標越界異常”說明了服務的隔離性 ,只有它們兩個在同一環境下,才能正常的調用

五、Nacos集群和持久化

Nacos默認有自帶嵌入式數據庫derby,但是如果做集群模式的話,就不能使用自己的數據庫不然每個節點一個數據庫,那么數據就不統一了,需要使用外部的mysql

1.持久化

切換數據庫

修改usr/local/nacos/conf/application.properties文件,增加支持mysql數據源配置(目前只支持mysql,版本要求:5.6.5+)

可以在linux圖形化界面中,使用文本編譯器打開

也可以使linux命令打開

[root@localhost bin]# cd /usr/local/nacos
[root@localhost nacos]# cd conf
[root@localhost conf]# vim application.properties

?進到application.properties文件的編輯頁面,找到下圖中所圈的內容,將注釋“#”刪掉

?并將第三個框中的內容進行修改,修改為自己的mysql數據庫所在的ip地址,用戶名和密碼也要修改為自己的mysql數據庫的用戶和密碼,如下圖所示:

?修改完成后,保存并退出,重啟nacos;

初始化數據庫

?找到nacos-mysql.sql文件,將nacos-mysql.sql文件導入到數據庫中;

新建配置文件:將Data ID、Group以及配置內容和配置格式填好并保持:

?打開nacos數據庫,查看config_info表,就能看到剛新創建的配置文件的數據了

2.集群

集群搭建

1.在usr/local/nacos中找到conf/cluster.conf.example ,將其改名為 conf/cluster.conf ,并將內容改為如下:

這里ip地址之所以一樣,是因為在同一臺服務器linux上部署了三個nacos,是為了節省空間,真實的部署是分別部署在三臺服務器上,ip地址各不相同;

# ip:port
192.168.238.132:8848
192.168.238.132:8849
192.168.238.132:8850

也可以通過linux命令找并修改:

[root@localhost ~]# cd /usr/local/nacos/conf
[root@localhost conf]# cp cluster.conf.example cluster.conf
[root@localhost conf]# vim cluster.conf

2.創建一個nacos_cluster文件夾,復制三份Nacos,并進行命名

[root@localhost ~]# cd /usr/local
[root@localhost local]# mkdir nacos_cluster
[root@localhost local]# cp -r nacos nacos_cluster/nacos_8848
[root@localhost local]# cp -r nacos nacos_cluster/nacos_8849
[root@localhost local]# cp -r nacos nacos_cluster/nacos_8850

3.分別進到上邊復制并重新命名的三個文件夾中將conf/appplication.properties中的端口號分別改為,因為有一個是端口是8845,是默認的,所以不用修改:

[root@localhost ~]# vim /usr/local/nacos_cluster/nacos_8849/conf/application.properties:
server.port=8849

[root@localhost ~]# vim /usr/local/nacos_cluster/nacos_8850/conf/application.properties:
server.port=8850

4.分別啟動三個nacos

[root@localhost upload]# cd /usr/local/nacos_cluster/nacos_8848/bin
[root@localhost bin]# ./startup.sh
[root@localhost bin]# cd /usr/local/nacos_cluster/nacos_8849/bin
[root@localhost bin]# ./startup.sh
[root@localhost bin]# cd /usr/local/nacos_cluster/nacos_8850/bin
[root@localhost bin]# ./startup.sh

5.分別在瀏覽器上訪問三個nacos

http://192.168.238.132:8848/nacos
http://192.168.238.132:8849/nacos
http://192.168.238.132:8850/nacos

6.啟動一個服務,注冊進去,進行測試,可以看到能夠在三個nacos服務中顯示出來,這里只截取一個圖進行顯示

7.隨機選擇一個nacos查看“節點列表”:

?8.點開“節點元數據”,可以根據里面的內容判斷哪個是“老大”;

老大的作用:是進行數據的同步,當老大死了,也就是掛了,就會推出來一個新的老大,是根據“投票機制”選出老大

?

?配置代理服務

?1.安裝nginx的依賴庫(c語言環境)

[root@localhost ~]# yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel

2.下載nginx

[root@localhost ~]# cd /usr/upload
[root@localhost upload]# wget -c https://nginx.org/download/nginx-1.12.0.tar.gz

3.解壓安裝包

[root@localhost upload]# tar -zxvf nginx-1.12.0.tar.gz

4. 配置安裝路徑

[root@localhost upload]# cd nginx-1.12.0

[root@localhost nginx-1.12.0]# ./configure --prefix=/usr/local/nginx

5.編譯并安裝

[root@localhost nginx-1.12.0]# make && make install

6.配置nginx代理nacos

首先找到nginx.conf文件,并打開進行修改

[root@localhost nginx-1.12.0]# cd /usr/local/nginx/conf
[root@localhost conf]# vim nginx.conf

7.將圖中圈中的地方替換為:

location / {
    proxy_pass http://nacos;
  }

8.在圖中圈中的上方添加以下內容:

upstream nacos {
  server 192.168.238.132:8848;
  server 192.168.238.132:8849;
  server 192.168.238.132:8850;
}

9.修改后為下圖所示:

?10.nginx的命令

[root@localhost conf]# cd ..
[root@localhost nginx]# cd sbin/
[root@localhost sbin]# ./nginx             #啟動
[root@localhost sbin]# ./nginx -s stop     #關閉
[root@localhost sbin]# ./nginx -s reload   #重啟

11.啟動nginx后,同時也要保持nacos集群的啟動,這時啟動一個服務進行測試

要啟動的服務需要對application.yml進行改動,將端口號去掉

server:
  port: 9090
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.238.132 #nacos服務的地址
  application:
    name: nacos-provider #向注冊中心注冊的名字

在服務啟動后,隨機訪問一個nacos:http://192.168.238.132/nacos/ 可以看到網址中的端口號已經沒有了,測試結果如下:


?

?六、Nacos開機啟動

這里的開機啟動是指:當打開安裝的有nacos的linx系統時,nacos它會自動啟動,不用人為啟動,它啟動的是單機啟動,不是集群啟動,主要是方便日常的使用。

1.添加nacos.service文件

[root@localhost ~]# vim /lib/systemd/system/nacos.service

2.在文件中添加以下內容:

[Unit]
Description=nacos
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/nacos/bin/startup.sh -m standalone
ExecReload=/usr/local/nacos/bin/shutdown.sh
ExecStop=/usr/local/nacos/bin/shutdown.sh
PrivateTmp=true

[Install]
WantedBy=multi-user.target

3.修改nacos的starup.sh文件

[root@localhost ~]# vim /usr/local/nacos/bin/startup.sh

?將下面內容直接復制到里面

[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/local/jdk1.8.0_191 
#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/opt/taobao/java
#[ ! -e "$JAVA_HOME/bin/java" ] && unset JAVA_HOME

4.設置開機自起

[root@localhost ~]# systemctl start nacos.service  #啟動nacos服務
[root@localhost ~]# systemctl daemon-reload        #重新加載服務配置
[root@localhost ~]# systemctl enable nacos.service #設置為開機啟動

如有錯誤請私聊或評論指正!!!

原文鏈接:https://blog.csdn.net/weixin_53390559/article/details/126323688

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新