nacos 實戰(史上最全)


文章很長,建議收藏起來慢慢讀!瘋狂創客圈總目錄 語雀版 | 總目錄 碼雲版| 總目錄 博客園版 為您奉上珍貴的學習資源 :


推薦:入大廠 、做架構、大力提升Java 內功 的 精彩博文

入大廠 、做架構、大力提升Java 內功 必備的精彩博文 2021 秋招漲薪1W + 必備的精彩博文
1:Redis 分布式鎖 (圖解-秒懂-史上最全) 2:Zookeeper 分布式鎖 (圖解-秒懂-史上最全)
3: Redis與MySQL雙寫一致性如何保證? (面試必備) 4: 面試必備:秒殺超賣 解決方案 (史上最全)
5:面試必備之:Reactor模式 6: 10分鍾看懂, Java NIO 底層原理
7:TCP/IP(圖解+秒懂+史上最全) 8:Feign原理 (圖解)
9:DNS圖解(秒懂 + 史上最全 + 高薪必備) 10:CDN圖解(秒懂 + 史上最全 + 高薪必備)
11: 分布式事務( 圖解 + 史上最全 + 吐血推薦 ) 12:限流:計數器、漏桶、令牌桶
三大算法的原理與實戰(圖解+史上最全)
13:架構必看:12306搶票系統億級流量架構
(圖解+秒懂+史上最全)
14:seata AT模式實戰(圖解+秒懂+史上最全)
15:seata 源碼解讀(圖解+秒懂+史上最全) 16:seata TCC模式實戰(圖解+秒懂+史上最全)

Java 面試題 30個專題 , 史上最全 , 面試必刷 阿里、京東、美團... 隨意挑、橫着走!!!
1: JVM面試題(史上最強、持續更新、吐血推薦) 2:Java基礎面試題(史上最全、持續更新、吐血推薦
3:架構設計面試題 (史上最全、持續更新、吐血推薦) 4:設計模式面試題 (史上最全、持續更新、吐血推薦)
17、分布式事務面試題 (史上最全、持續更新、吐血推薦) 一致性協議 (史上最全)
29、多線程面試題(史上最全) 30、HR面經,過五關斬六將后,小心陰溝翻船!
9.網絡協議面試題(史上最全、持續更新、吐血推薦) 更多專題, 請參見【 瘋狂創客圈 高並發 總目錄

SpringCloud 微服務 精彩博文
nacos 實戰(史上最全) sentinel (史上最全+入門教程)
SpringCloud gateway (史上最全) 更多專題, 請參見【 瘋狂創客圈 高並發 總目錄

1、Nacos 優勢

問題,既然有了Eureka ,為啥還要用Nacos?

而 Nacos 作為微服務核心的服務注冊與發現中心,讓大家在 Eureka 和 Consule 之外有了新的選擇,開箱即用,上手簡潔,暫時也沒發現有太大的坑。

1.1與eureka對比

1 eureka 2.0閉源碼了。

2 從官網來看nacos 的注冊的實例數是大於eureka的,

3 因為nacos使用的raft協議,nacos集群的一致性要遠大於eureka集群.

分布式一致性協議 Raft,自 2013 年論文發表,之后就受到了技術領域的熱捧,與其他的分布式一致性算法比,Raft 相對比較簡單並且易於實現,這也是 Raft 能異軍突起的主要因素。

img

Raft 的數據一致性策略

Raft 協議強依賴 Leader 節點來確保集群數據一致性。即 client 發送過來的數據均先到達 Leader 節點,Leader 接收到數據后,先將數據標記為 uncommitted 狀態,隨后 Leader 開始向所有 Follower 復制數據並等待響應,在獲得集群中大於 N/2 個 Follower 的已成功接收數據完畢的響應后,Leader 將數據的狀態標記為 committed,隨后向 client 發送數據已接收確認,在向 client 發送出已數據接收后,再向所有 Follower 節點發送通知表明該數據狀態為committed。

1.2與springcloud config 對比

三大優勢:

  • springcloud config大部分場景結合git 使用, 動態變更還需要依賴Spring Cloud Bus 消息總線來通過所有的客戶端變化.

  • springcloud config不提供可視化界面

  • nacos config使用長連接更新配置, 一旦配置有變動后,通知Provider的過程非常的迅速, 從速度上秒殺springcloud原來的config幾條街,

2、Spring Cloud Alibaba 套件

目前 Spring Cloud Alibaba 主要有三個組件:

  • Nacos:一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平台。

  • Sentinel:把流量作為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。

  • AliCloud OSS: 阿里雲對象存儲服務(Object Storage Service,簡稱
    OSS),是阿里雲提供的海量、安全、低成本、高可靠的雲存儲服務。您可以在任何應用、任何時間、任何地點存儲和訪問任意類型的數據。

Spring Cloud Alibaba 套件和Spring Cloud Netflix套件類比

仔細看看各組件的功能描述,Spring Cloud Alibaba 套件和Spring Cloud Netflix套件大致的對應關系:

  • Nacos = Eureka/Consule + Config + Admin
  • Sentinel = Hystrix + Dashboard + Turbine
  • Dubbo = Ribbon + Feign
  • RocketMQ = RabbitMQ
  • Schedulerx = Quartz
  • AliCloud OSS、AliCloud SLS 這三個應該是獨有的
    鏈路跟蹤(Sleuth、Zipkin)不知道會不會在 Sentinel 里
    以上只是猜測,待我從坑里爬出來之后再回來更新。也歡迎大家一起交流探討~
    這里我就先試試 Nacos。

3、Nacos 的架構和安裝

3.1、Nacos 的架構

image

這是 Nacos 的架構圖,可以看到它確實是融合了服務注冊發現中心、配置中心、服務管理等功能,類似於 Eureka/Consule + Config + Admin 的合體。

另外通過官方文檔發現,Nacos 除了可以和 Spring Cloud 集成,還可以和 Spring、SpringBoot 進行集成。

不過我們只關注於 Spring Cloud,別的就略過了,直接上手實戰吧。

3.2、Nacos Server 的下載和安裝

在使用 Nacos 之前,需要先下載 Nacos 並啟動 Nacos Server。

安裝的參考教程:

https://www.cnblogs.com/crazymakercircle/p/11992539.html

4、Nacos Server 的運行

4.1兩種模式

Nacos Server 有兩種運行模式:

  • standalone
  • cluster

4.2、standalone 模式

此模式一般用於 demo 和測試,不用改任何配置,直接敲以下命令執行

sh bin/startup.sh -m standalone

Windows 的話就是

cmd bin/startup.cmd -m standalone

然后從 http://cdh1:8848/nacos/index.html 進入控制台就能看到如下界面了

image

默認賬號和密碼為:nacos nacos

4.3、cluster 模式

測試環境,可以先用 standalone 模式擼起來,享受 coding 的快感,但是,生產環境可以使用 cluster 模式。

cluster 模式需要依賴 MySQL,然后改兩個配置文件:

conf/cluster.conf
conf/application.properties

大致如下:

1: cluster.conf,填入要運行 Nacos Server 機器的 ip

192.168.100.155
192.168.100.156

  1. 修改NACOS_PATH/conf/application.properties,加入 MySQL 配置
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root

創建一個名為nacos_config的 database,將NACOS_PATH/conf/nacos-mysql.sql中的表結構導入剛才創建的庫中,這幾張表的用途就自己研究吧

4.4 Nacos Server 的配置數據是存在哪里呢?

問題來了: Nacos Server 的配置數據是存在哪里呢?

我們沒有對 Nacos Server 做任何配置,那么數據只有兩個位置可以存儲:

  • 內存
  • 本地數據庫

如果我們現在重啟剛剛在運行的 Nacos Server,會發現剛才加的 nacos.properties 配置還在,說明不是內存存儲的。

這時候我們打開NACOS_PATH/data,會發現里邊有個derby-data目錄,我們的配置數據現在就存儲在這個庫中。

Derby 是 Java 編寫的數據庫,屬於 Apache 的一個開源項目

如果將數據源改為我們熟悉的 MySQL 呢?當然可以。

注意:不支持 MySQL 8.0 版本

這里有兩個坑:

Nacos Server 的數據源是用 Derby 還是 MySQL 完全是由其運行模式決定的:

standalone 的話僅會使用 Derby,即使在 application.properties 里邊配置 MySQL 也照樣無視;
cluster 模式會自動使用 MySQL,這時候如果沒有 MySQL 的配置,是會報錯的。

官方提供的 cluster.conf 示例如下

#it is ip
#example
10.10.109.214
11.16.128.34
11.16.128.36

以上配置結束后,運行 Nacos Server 就能看到效果了。

5 實戰1:使用Nacos作為注冊中心

實戰的工程

實戰的工程的目錄結構如下:

在這里插入圖片描述

5.1如何使用Nacos Client組件

首先引入 Spring Cloud Alibaba 的 BOM

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.4.RELEASE</version>
    <relativePath/>
</parent>
<properties>
    <spring-cloud.version>Finchley.SR2</spring-cloud.version>
    <spring-cloud-alibaba.version>0.2.0.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

這里版本號有坑,文檔上說和 Spring Boot 2.0.x 版本兼容,但是實測 2.0.6.RELEASE 報錯

java.lang.NoClassDefFoundError: org/springframework/core/env/EnvironmentCapable

5.2、演示的模塊結構

服務注冊中心和服務發現的服務端都是由 Nacos Server 來提供的,我們只需要提供 Service 向其注冊就好了。

這里模擬提供兩個 service:provider 和 consumer

alibaba
├── service-provider-demo
│   ├── pom.xml
│   └── src
└── sevice-consumer-demo
│   ├── pom.xml
│   └── src
└── pom.xml

5.3、provider 微服務

step1:在 provider 和 consumer 的 pom 添加以下依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

step2:啟動類

使用 Spring Cloud 的原生注解 @EnableDiscoveryClient 開啟服務注冊與發現

package com.crazymaker.cloud.nacos.demo.starter;

import com.crazymaker.springcloud.standard.context.SpringContextUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.Environment;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.List;

@EnableSwagger2
@SpringBootApplication
@EnableDiscoveryClient
@Slf4j
public class ServiceProviderApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext =   SpringApplication.run(ServiceProviderApplication.class, args);

        Environment env = applicationContext.getEnvironment();
        String port = env.getProperty("server.port");
        String path = env.getProperty("server.servlet.context-path");
        System.out.println("\n--------------------------------------\n\t" +
                "Application is running! Access URLs:\n\t" +
                "Local: \t\thttp://localhost:" + port + path+ "/index.html\n\t" +
               "swagger-ui: \thttp://localhost:" + port + path + "/swagger-ui.html\n\t" +
                "----------------------------------------------------------");

    }
}

step3:服務提供者的 Rest 服務接口

service-provider-demo 提供 一個非常簡單的 Rest 服務接口以供訪問

package com.crazymaker.cloud.nacos.demo.controller;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/echo")
public class EchoController {
    //回顯服務
    @RequestMapping(value = "/{string}", method = RequestMethod.GET)
    public String echo(@PathVariable String string) {
        return "echo: " + string;
    }
}

step4:配置文件

spring:
  application:
    name: service-provider-demo
  cloud:
    nacos:
      discovery:
        server-addr: ${NACOS_SERVER:cdh1:8848}
server:
  port: 18080

step5:啟動之后,通過swagger UI訪問:

在這里插入圖片描述

5.4、Consumer 微服務演示RPC遠程調用

在 NacosConsumerApplication 中集成 RestTemplate 和 Ribbon

@LoadBalanced
@Bean
public RestTemplate restTemplate() {
  return new RestTemplate();
}

消費者的controller 類

package com.crazymaker.cloud.nacos.demo.consumer.controller;

import com.crazymaker.cloud.nacos.demo.consumer.client.EchoClient;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
@RequestMapping("/echo")
@Api(tags = "服務- 消費者")
public class EchoConsumerController {


    //注入 @FeignClient 注解配置 所配置的 EchoClient 客戶端Feign實例
    @Resource
    EchoClient echoClient;


    //回顯服務
    @ApiOperation(value = "消費回顯服務接口")
    @RequestMapping(value = "/{string}", method = RequestMethod.GET)
    public String echoRemoteEcho(@PathVariable String string) {
        return "provider echo is:" + echoClient.echo(string);
    }
}


消費者配置文件

spring:
  application:
    name: sevice-consumer-demo
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
server:
  port: 18081

通過swagger UI訪問消費者:

在這里插入圖片描述

訪問遠程的echo API:

在這里插入圖片描述

在這里插入圖片描述

5.5涉及到的演示地址:

服務提供者 service-provider-demo:

http://localhost:18080/provider/swagger-ui.html#/Echo_%E6%BC%94%E7%A4%BA

服務消費者:

[http://localhost:18081/consumer/swagger-ui.html#/服務- 消費者/echoRemoteEchoUsingGET](http://localhost:18081/consumer/swagger-ui.html#/服務- 消費者/echoRemoteEchoUsingGET)

注冊中心Nacos:

http://cdh1:8848/nacos/index.html#/serviceManagement?dataId=&group=&appName=&namespace=

5.6、Nacos Console

這時候查看 Nacos Console 也能看到已注冊的服務列表及其詳情

在這里插入圖片描述

6、實戰2:使用Nacos作為配置中心

6.1、基本概念

1. Profile

Java項目一般都會有多個Profile配置,用於區分開發環境,測試環境,准生產環境,生成環境等,每個環境對應一個properties文件(或是yml/yaml文件),然后通過設置 spring.profiles.active 的值來決定使用哪個配置文件。

例子:

spring:
  application:
    name: sharding-jdbc-provider
  jpa:
    hibernate:
      ddl-auto: none
      dialect: org.hibernate.dialect.MySQL5InnoDBDialect
      show-sql: true
  profiles:
     active: sharding-db-table    # 分庫分表配置文件
    #active: atomiclong-id    # 自定義主鍵的配置文件
    #active: replica-query    # 讀寫分離配置文件

Nacos Config的作用就把這些文件的內容都移到一個統一的配置中心,即方便維護又支持實時修改后動態刷新應用。

2. Data ID

當使用Nacos Config后,Profile的配置就存儲到Data ID下,即一個Profile對應一個Data ID

Data ID的拼接格式:${prefix} - ${spring.profiles.active} . ${file-extension}

  • prefix 默認為 spring.application.name 的值,也可以通過配置項 spring.cloud.nacos.config.prefix 來配置

  • spring.profiles.active 取 spring.profiles.active 的值,即為當前環境對應的 profile

  • file-extension 為配置內容的數據格式,可以通過配置項 spring.cloud.nacos.config.file-extension 來配置

3. Group

Group 默認為 DEFAULT_GROUP,可以通過 spring.cloud.nacos.config.group 來配置,當配置項太多或者有重名時,可以通過分組來方便管理

最后就和原來使用springcloud一樣通過@RefreshScope 和@Value注解即可

6.2 通過Nacos的console 去增加配置

這回首先要在nacos中配置相關的配置,打開Nacos配置界面,依次創建2個Data ID

  • nacos-config-demo-dev.yaml 開發環境的配置
  • nacos-config-demo-test.yaml 測試環境的配置

1、nacos-config-demo-dev.yaml

內容如下圖:

在這里插入圖片描述

2、nacos-config-demo-sit.yaml

內容如下圖:

在這里插入圖片描述

6.3 使用Nacos Config Client組件

問題2:微服務Provider實例上,如何使用Nacos Config Client組件的有哪些步驟?

1 加載nacos config 的客戶端依賴:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>${nacos.version}</version>
</dependency>

啟動類

package com.crazymaker.cloud.nacos.demo.consumer.starter;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.Environment;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@EnableSwagger2
@EnableDiscoveryClient
@Slf4j
@SpringBootApplication(
        scanBasePackages =
                {
                        "com.crazymaker.cloud.nacos.demo",
                        "com.crazymaker.springcloud.standard"
                },
        exclude = {SecurityAutoConfiguration.class,
                //排除db的自動配置
                DataSourceAutoConfiguration.class,
                DataSourceTransactionManagerAutoConfiguration.class,
                HibernateJpaAutoConfiguration.class,
                //排除redis的自動配置
                RedisAutoConfiguration.class,
                RedisRepositoriesAutoConfiguration.class})
//啟動Feign
@EnableFeignClients(basePackages =
        {"com.crazymaker.cloud.nacos.demo.consumer.client"})
public class ConfigDomeProviderApplication
{
    public static void main(String[] args)
    {
        ConfigurableApplicationContext applicationContext = null;
        try
        {
            applicationContext = SpringApplication.run(ConfigDomeProviderApplication.class, args);
            System.out.println("Server startup done.");
        } catch (Exception e)
        {
            log.error("服務啟動報錯", e);
            return;
        }

        Environment env = applicationContext.getEnvironment();
        String port = env.getProperty("server.port");
        String path = env.getProperty("server.servlet.context-path");
        System.out.println("\n----------------------------------------------------------\n\t" +
                "Application is running! Access URLs:\n\t" +
                "Local: \t\thttp://localhost:" + port + path + "/index.html\n\t" +
                "swagger-ui: \thttp://localhost:" + port + path + "/swagger-ui.html\n\t" +
                "----------------------------------------------------------");

    }
}

控制類:

package com.crazymaker.cloud.nacos.demo.config.controller;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
@RequestMapping("/config")
@Api(tags = "Nacos 配置中心演示")
public class ConfigGetController {


    @Value("${foo.bar:empty}")
    private String bar;


    @Value("${spring.datasource.username:empty}")
    private String dbusername;

    //獲取配置的內容
    @ApiOperation(value = "獲取配置的內容")
    @RequestMapping(value = "/bar", method = RequestMethod.GET)
    public String getBar() {
        return "bar is :"+bar;
    }
    //獲取配置的內容
    @ApiOperation(value = "獲取配置的db username")
    @RequestMapping(value = "/dbusername", method = RequestMethod.GET)
    public String getDbusername() {
        return "db username is :"+bar;
    }
}

2 bootstrap配置文件

然后是在配置文件(bootstrap.yml)中加入以下的內容:

spring:
  application:
    name: nacos-config-demo-provider
  profiles:
    active:  dev
  cloud:
    nacos:
      discovery:
        server-addr: ${NACOS_SERVER:cdh1:8848}
      config:
        server-addr: ${NACOS_SERVER:cdh1:8848}
        prefix: nacos-config-demo
        group: DEFAULT_GROUP
        file-extension: yaml
server:
  port: 18083
  servlet:
    context-path: /config

6.4 測試結果

啟動程序,通過swagger ui訪問:

http://localhost:18083/config/swagger-ui.html#

在這里插入圖片描述

執行結果如下:

在這里插入圖片描述

6.4 可以端如何與服務端的配置文件相互對應

  • config.prefix 來對應主配置文件

  • 使用spring.cloud.nacos.config.ext-config 選項來對應更多的文件

    eg:

spring:
  application:
    name: nacos-config-demo-provider
  profiles:
    active: dev
  cloud:
    nacos:
      discovery:
        server-addr: ${NACOS_SERVER:cdh1:8848}
      config:
        server-addr: ${NACOS_SERVER:cdh1:8848}
        prefix: nacos-config-demo
        group: DEFAULT_GROUP
        file-extension: yaml
        ext-config:
          - data-id: crazymaker-db-dev.yml
            group: DEFAULT_GROUP
            refresh: true
          - data-id: crazymaker-redis-dev.yml
            group: DEFAULT_GROUP
            refresh: true
          - data-id: crazymaker-common-dev.yml
            group: DEFAULT_GROUP
            refresh: true
          - data-id: some.properties
            group: DEFAULT_GROUP
            refresh: true

啟動程序,發現可以獲取到其他data-id的配置 ,大家可以自行配置。

7、配置的隔離

在實際的應用中,存在着以下幾種環境隔離的要求:

1、開發環境、測試環境、准生產環境和生產環境需要隔離

2、不同項目需要隔離

3、同一項目,不同的模塊需要隔離

可以通過三種方式來進行配置隔離:Nacos的服務器、namespace命名空間、group分組,在bootstrap.yml文件中可以通過配置Nacos的server-addr、namespace和group來區分不同的配置信息。

  • Nacos的服務器 spring.cloud.nacos.config.server-addr
  • Nacos的命名空間 spring.cloud.nacos.config.namespace,注意,這里使用命名空間的ID不是名稱
  • Nacos的分組 spring.cloud.nacos.config.group

8 nacos集群搭建

如果我們要搭建集群的話,那么肯定是不能用內嵌的數據庫,不然數據無法共享。所以,集群搭建的時候我們需要將Nacos對接Mysql進行數據存儲。

集群模式跟我們平時進行擴容是一樣的,可以通過Nginx轉發到多個節點,最前面掛一個域名即可,如下圖:在這里插入圖片描述

IP規划

通常如果我們只是為了體驗的話,直接在本地起動3個實例就可以了,沒必要真的去搞三台服務器,下面我們就以在本地的方式來搭建集群。 將Nacos的解壓包復制分成3份,分別是:

nacos
nacos1
nacos2

進入nacos的conf目錄,編輯application.properties文件,增加數據庫配置

# 指定數據源為Mysql
spring.datasource.platform=mysql

# 數據庫實例數量
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456

復制代碼同樣的步驟進入nacos1和nacos2操作一遍,唯一需要修改的就是application.properties文件中的server.port,默認nacos的server.port=8848,

我們在本地啟動三個實例,那么端口肯定會沖突,所以其他2個實例的端口我們需要進行修改,比如nacos1修改成8847,nacos2修改成8846。
數據庫配置信息好了后,我們需要將對應的數據庫和表進行初始化,數據庫腳本在conf目錄下的nacos-mysql.sql中,執行即可。

最后一步需要配置一份集群節點信息,配置文件在conf目錄下的cluster.conf.example文件,我們進行重命名成cluster.conf。 然后編輯cluster.conf文件,增加3個節點的信息,格式為IP:PORT,三個目錄都一致即可。

127.0.0.1:8848
127.0.0.1:8847
127.0.0.1:8846

啟動的話直接到bin目錄下,執行./startup.sh就可以了,默認就是集群模式,不需要加任何參數。

集群的使用

上面的集群,雖然可用, 但仍不是真正的集群, 我們一般不會這么用。nacos集群的使用一般有4種方式:

  • http://ip1:port/openAPI 直連ip模式,不同的節點,則需要修改ip才可以使用。

  • http://VIP:port/openAPI VIP模式高可用,客戶端vip即可,VIP下面掛server真實ip,部署比較麻煩,需要部署vip(keepalive)。

  • http://nacos.com:port/openAPI 域名模式,可讀性好,而且換ip方便,在host文件配置本地域名即可。

  • http://反向代理:port/openAPI 反向代理模式

這里介紹一下反向代理模式。

關於Nginx的安裝和配置,本文就不進行講解了,不會的可以自己去嘗試下,反向代理模式 核心配置如下:

upstream nacos_server {
  server 127.0.0.1:8848;
  server 127.0.0.1:8847;
  server 127.0.0.1:8846;
}

server {
listen 8648;
   server_name localhost;
  #charset koi8-r;
  #access_log logs/host.access.log main;
  location / {
     proxy_pass http://nacos_server;
     index index.html index.htm;
   }
}

 

整體來說,nacos的集群搭建方式還是挺簡單的,沒什么特別要注意的,最好是能通過域名的方式來進行訪問,另外數據庫這塊如果上生產環境,也需要考慮高可用問題,至少也得有個主從。

8648 的nginx 提供的 nacos 服務接口,可以自定義。 我們訪問

http://localhost:8648/nacos/#/clusterManagement?dataId=&group=&appName=&namespace=&serverId=

,就可以看到:

img

我們可以簡單測試一下,殺掉 一個的 nacos ,看服務是否正常。 后面,我們對微服務提供nacos服務的時候,只要配置這個nginx 端口就好了!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM