Spring Cloud筆記-Spring Cloud Alibaba Nacos服務註冊和配置中心(十八)

1.Nacos簡介

Nacos命名的前四個字母分別取自Naming(服務註冊,即服務命名管理)和Configuration(服務配置)的前兩個字母,s取自Service,也就是服務的意思。它是一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺。

簡單一句話:Nacos=註冊中心+配置中心=Eureka+Config+Bus。

Nacos官網地址:https://nacos.io/zh-cn/,可以在這裏下載和查閱官方文檔。

各種服務註冊中心的比較
服務註冊與服務發現框架 CAP模型 控制檯管理 社區活躍度
Eureka AP 支持 低(2.x版本閉源)
Zookeeper CP 不支持
Consul CP 支持
Nacos AP 支持

2.安裝並運行Nacos

1.Windows安裝

通過Nacos下載地址選擇合適的版本(最好選穩定版本)下載zip包,需要本地配置好了Java8和Maven環境,解壓縮後,運行startup.cmd啓動Nacos,瀏覽器訪問http://localhost:8848/nacos查看管理後臺,輸入用戶名密碼(都是nacos)進入。

2.Linux安裝

這裏還是採用Docker的安裝和啓動方式,命令如下。

[root@bogon ~]# docker search nacos # 搜索Nacos鏡像,這裏只列出了第一個,我們等下也要用這個
INDEX       NAME                                          DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/nacos/nacos-server                  This project contains a Docker image meant...   73                   [OK]
[root@bogon ~]# docker pull docker.io/nacos/nacos-server:1.3.0 # 拉取1.3.0版本鏡像,稍等片刻,如果不帶tag時候,默認下載的最新版本
[root@bogon ~]# docker run --env MODE=standalone -d -p 8848:8848 nacos/nacos-server:1.3.0 # 後臺運行Nacos,以單機模式運行
[root@bogon ~]# docker ps # 查看當前運行中的docker容器
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                               NAMES
563aac734e9e        nacos/nacos-server:1.3.0   "bin/docker-startu..."   26 seconds ago      Up 24 seconds       0.0.0.0:8848->8848/tcp              practical_mcnulty
[root@bogon ~]# docker ps -a # 查看所有容器(不管是運行的還是沒運行的)
CONTAINER ID        IMAGE                                  COMMAND                  CREATED              STATUS                      PORTS                                                                                        NAMES
563aac734e9e        nacos/nacos-server:1.3.0               "bin/docker-startu..."   About a minute ago   Up About a minute           0.0.0.0:8848->8848/tcp                                                                       practical_mcnulty
4d6cb9734993        nacos/nacos-server:1.3.0               "bin/docker-startu..."   3 minutes ago        Exited (1) 2 minutes ago                                                                                                 amazing_liskov
e4622b9228e7        rabbitmq:management                    "docker-entrypoint..."   7 days ago           Exited (255) 23 hours ago   4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp   dreamy_cray
262532b32087        consul:1.6.1                           "docker-entrypoint..."   2 weeks ago          Exited (255) 7 days ago     8300-8302/tcp, 8301-8302/udp, 8600/tcp, 8600/udp, 0.0.0.0:8500->8500/tcp                     condescending_bartik
12121ee7ccdf        zookeeper:3.4.9                        "/docker-entrypoin..."   3 weeks ago          Exited (143) 4 hours ago                                                                                                 focused_mclean
3a4738e5d496        elasticsearch:6.8.7                    "/usr/local/bin/do..."   7 weeks ago          Exited (255) 7 weeks ago    0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp                                               xenodochial_banach
5eb892279b83        docker.io/rabbitmq:3.7.26-management   "docker-entrypoint..."   7 weeks ago          Exited (255) 7 weeks ago    4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp   nifty_visvesvaraya
9478537d54f6        redis                                  "docker-entrypoint..."   7 weeks ago          Exited (255) 7 weeks ago    0.0.0.0:6379->6379/tcp                                                                       frosty_easley
0c492ce51767        mysql                                  "docker-entrypoint..."   2 months ago         Up 51 minutes               0.0.0.0:3306->3306/tcp, 33060/tcp                                                            jolly_sammet
73f3714f4798        tomcat:8.5.34                          "catalina.sh run"        2 months ago         Exited (143) 2 months ago                                                                                                myTomcat
[root@bogon ~]# docker start 563aac734e9e # 如果已經有了容器,但是容器是關閉狀態的,只需要使用docker start 容器id啓動即可

安裝完成,啓動成功後,訪問http://192.168.0.123:8848/nacos,輸入用戶名密碼(都是nacos)查看管理後臺。

3.Nacos作爲服務註冊中心演示

這裏,我們需要創建一個服務提供者和一個服務消費者,把他們都註冊進Nacos裏。

基於Nacos的服務提供者

官方文檔:https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_start_a_provider_application

新建cloudalibaba-provider-payment9001模塊,在父pom.xml的dependencyManagement座標的dependencies中加入spring-cloud-alibaba-dependencies座標。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.2.0.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

修改子模塊的pom.xml,加入spring-cloud-starter-alibaba-nacos-discovery座標。

<?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>cloud2020</artifactId>
        <groupId>com.atguigu.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>cloudalibaba-provider-payment9001</artifactId>
    <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>
    </dependencies>
</project>

添加application.yml配置文件。

server:
  port: 9001
spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.0.123:8848 # 指明Nacos的地址
management:
  endpoints:
    web:
      exposure:
        include: '*'

添加主啓動類,帶上@EnableDiscoveryClient用於開啓服務發現功能。

package com.atguigu.springcloud.alibaba;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

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

添加業務類便於測試。

package com.atguigu.springcloud.alibaba.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PaymentController {
    @Value("${server.port}")
    private String serverPort;

    @GetMapping(value = "/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id) {
        return "Hello Nacos Discovery: " + serverPort + "\t id: " + id;
    }
}
 

啓動Nacos,啓動Provider9001模塊訪問http://192.168.0.123:8848/nacos,點擊左側“服務管理”-“服務列表”即可看到Provider9001服務已經註冊進來了。

Nacos自帶負載均衡,爲了演示負載均衡,仿照cloudalibaba-provider-payment9001模塊創建cloudalibaba-provider-payment9002模塊,端口號做相應的修改即可,其他大致相同。

創建完成後,啓動Provider9002,查看Nacos管理後臺,nacos-payment-provider服務名對應的實例數由1變成了2。

基於Nacos的服務消費者

官方文檔:https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_start_a_consumer_application

新建cloudalibaba-consumer-nacos-order83模塊,pom.xml和cloudalibaba-provider-payment9001一樣。添加application.yml。

server:
  port: 83
spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.0.123:8848 # 配置Nacos地址
# 消費者將去訪問的微服務地址,這裏採用服務名稱查找服務(成功註冊進nacos的微服務提供者)
service-url:
  nacos-user-service: http://nacos-payment-provider

主啓動類和cloudalibaba-provider-payment9001一樣,需要帶上@EnableDiscoveryClient註解。添加業務類。

package com.atuguigu.springcloud.alibaba.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

@RestController
@Slf4j
public class OrderNacosController {
    @Resource
    private RestTemplate restTemplate;

    @Value("${service-url.nacos-user-service}")// 讀取application.yml裏的值
    private String serverURL;

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

添加配置類,注意,這裏一定要帶上@LoadBalance註解,因爲我們是通過服務名訪問生產者的,即使只有一個生產者,通過服務名訪問,也要帶上@LoadBalance註解,否則會報錯。

package com.atuguigu.springcloud.alibaba.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

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

啓動兩個生產者和一個消費者,通過瀏覽器訪問http://localhost:83/consumer/payment/nacos/1,根據請求返回值,可以看到負載均衡生效了,實際上,Nacos有負載均衡能力,是因爲它包含了Ribbon的jar包。

服務註冊中心對比

Nacos和其他服務註冊中心特性對比
  Nacos Eureka Consul CoreDNS Zookeeper
一致性檢查 CP+AP AP CP / CP
健康檢查 TCP/HTTP/MySQL/Client Beat Client Beat TCP/HTTP/gRPC/Cmd / Client Beat
負載均衡 權重/DSL/metadata/CMDB Ribbon Fabio RR /
雪崩保護 支持 支持 不支持 不支持 不支持
自動註銷實例 支持 支持 不支持 不支持 支持
訪問協議 HTTP/DNS/UDP HTTP HTTP/DNS DNS TCP
監聽支持 支持 支持 支持 不支持 支持
多數據中心 支持 支持 支持 不支持 不支持
跨註冊中心 支持 不支持 支持 不支持 不支持
Spring Cloud集成 支持 支持 支持 不支持 不支持
Dubbo集成 支持 不支持 不支持 不支持 支持
Kubernetes集成 支持 不支持 支持 支持 不支持

Nacos支持AP和CP的切換,命令如下。

curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'

如果不需要存儲服務界別的信息且服務實例是通過nacos-client註冊的,並且能夠保持心跳上報,那麼就可以選擇AP模式,當前主流服務如Spring Cloud和Dubbo服務,都適用於AP模式,AP模式爲了服務的可用性減弱了一致性,因此AP模式下只支持註冊臨時實例。

如果需要在服務級別編輯或存儲配置信息,必須使用CP,Kubernetes服務和DNS服務都適用於CP模式,CP模式下支持註冊持久化實例,此時以Raft協議爲集羣運行,該模式下注冊實例前必須先註冊服務,如果服務不存在,會報錯。

4.Nacos作爲服務配置中心演示

1.基礎配置

新建cloudalibaba-config-nacos-client3377模塊,修改pom.xml,加入spring-cloud-starter-alibaba-nacos-config和spring-cloud-starter-alibaba-nacos-discovery座標。

<?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>cloud2020</artifactId>
        <groupId>com.atguigu.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>cloudalibaba-config-nacos-client3377</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <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>
    </dependencies>
</project>

添加bootstrap.yml和application.yml配置文件。這裏的bootstrap.yml和application.yml和之前的Spring Cloud Config裏的意思是一樣的,在項目初始化的時候,會先讀取bootstrap.yml,後讀取application.yml,其中bootstrap.yml屬於系統層面,application.yml屬於應用層面。

bootstrap.yml

server:
  port: 3377
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.0.123:8848 # Nacos服務註冊中心地址
      config:
        server-addr: 192.168.0.123:8848 # Nacos作爲配置中心地址
        file-extension: yml #指定yml格式配置

application.yml

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

添加主啓動類,帶上@EnableDiscoveryClient註解。

package com.atguigu.springcloud.alibaba;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

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

添加業務類,用於測試

package com.atguigu.springcloud.alibaba.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope // 通過Spring Cloud原生註解@RefreshScope實現配置自動刷新
public class ConfigClientController {
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo() {
        return configInfo;
    }
}

我們配置bootstrap.yml的目的,就是讓模塊啓動的時候,讀取bootstrap.yml的內容,去Nacos上查找配置文件的,那麼查找配置文件的規則是怎樣的呢?

官方文檔可以看到一個公式:${prefix}-${spring.profile.active}.${file-extension}。下面也對這裏的參數做了解釋:

  • ${prefix}:默認爲spring.application.name的值,也可以通過配置項spring.cloud.nacos.config.prefix來配置
  • ${spring.profile.active}:爲當前環境對應的profile,當spring.profile.active爲空時,對應的連接符-也將不存在,dataId的拼接格式變成${prefix}.${file-extension}
  • ${file-extension}:爲配置內容的數據格式,可以通過配置項spring.cloud.nacos.config.file-extension來配置,目前只支持 properties和yaml類型

根據bootstrap.yml和application.yml可知,這個公式對應的值是:nacos-config-client-dev.yml,有了這個值,就可以在Nacos管理後臺做配置了,這個值對應管理後臺的Data Id。

進入Nacos管理後臺,點擊“配置管理”-“配置列表”,點擊右側的“+”,將剛纔的值輸入到Data Id裏。Group保持DEFAULT_GROUP默認即可,配置格式選擇YAML,在配置內容裏輸入如下內容,也就是要對應測試類Controller中的@Value("${config.info}"),最後點擊“發佈”即可。

config:
  info: "this is nacos-config-client-dev.yml version=1"

啓動nacos-client3377模塊,訪問http://localhost:3377/config/info,可以讀取到剛纔的配置文件,接下來,我們在Nacos上修改配置文件,再次發佈,訪問http://localhost:3377/config/info,發現讀取到的配置信息立刻就變化了。

2.分組配置

在前面,我們往Nacos裏添加配置文件的時候,可以發現有Data Id,Group,命名空間(NameSpace)這些參數,通過這些參數,我們可以把配置文件做分組,便於查找和歸類。

其中NameSpace用於區分部署環境,Group和Data Id在邏輯上區分兩個目標對象。

根據官方文檔的說明,我們可以知道:

  • NameSpace:用於進行租戶粒度的配置隔離。不同的命名空間下,可以存在相同的Group或Data ID的配置。Namespace的常用場景之一是不同環境的配置的區分隔離,例如開發測試環境和生產環境的資源(如配置、服務)隔離等。
  • Group:Nacos中的一組配置集,是組織配置的維度之一。通過一個有意義的字符串對配置集進行分組,從而區分Data ID相同的配置集。當您在Nacos上創建一個配置時,如果未填寫配置分組的名稱,則配置分組的名稱默認採用DEFAULT_GROUP。配置分組的常見場景:不同的應用或組件使用了相同的配置類型,如database_url配置和MQ_topic配置。
  • Data Id:Nacos中的某個配置集的ID。配置集ID是組織劃分配置的維度之一。Data ID通常用於組織劃分系統的配置集。一個系統或者應用可以包含多個配置集,每個配置集都可以被一個有意義的名稱標識。

Data Id配置方案:使用默認的NameSpace和默認的Group,在Nacos管理後臺創建兩個不同Data Id的配置文件,通過修改application.yml裏的spring.profile.active的值,即可實現讀取不同配置文件。

Group配置方案:在Nacos管理後臺創建一個Group,創建幾個配置文件,在Group裏輸入剛纔創建的Group的名稱。要想讀取指定Group下的配置文件,需要在spring.cloud.nacos.config下添加一個group屬性,指定要訪問哪個Group取配置文件。

NameSpace配置方案:在Nacos管理後臺創建一個NameSpace,在它下面創建幾個配置文件,要想讀取自定義NameSpace下的配置文件,需要在spring.cloud.nacos.config下添加一個namespace屬性,值爲命名空間的ID。

如果把Data Id、Group、NameSpace類比成一個Java項目的話,那麼NameSpace可以類比爲一個模塊,Group可以類比爲某個模塊裏的一個包,Data Id可以類比爲一個類。目的就是爲了不同粒度的配置隔離。

5.Nacos集羣和持久化配置(重要)

1.官網說明

Nacos單機部署手冊官方文檔地址:https://nacos.io/zh-cn/docs/deployment.html

Nacos集羣搭建手冊官方文檔地址:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html

在重啓Nacos後,我們可以看到,之前的配置還是存在的,這是因爲Nacos裏內置了Derby數據庫,但是,因爲我們不方便操作Derby數據庫,所以,改用MySQL和Nacos進行整合。

另外,正式環境,不可能只有一臺Nacos服務,需要Nacos服務集羣模式。如果啓動了多個Nacos結點,數據存儲存在一致性問題,爲了解決這個問題,Nacos採用集中式存儲來支持集羣化部署,目前只支持MySQL存儲。

我們先對單機支持MySQL數據庫,具體操作步驟:

  1. 安裝MySQL數據庫,版本:5.6.5+
  2. 使用數據庫初始化文件初始化MySQL數據庫,配置文件的內容不要修改
  3. 修改Nacos的conf/application.properties配置文件,增加MySQL數據源配置支持

2.Nacos持久化配置解釋

docker下載安裝MySQL鏡像,這裏我的Nacos使用的是1.3.0版本,MySQL使用的是8.0.19版本(踩坑了,後面說)。

首先創建nacos_config數據庫,然後在這個數據庫下,使用數據庫初始化文件初始化MySQL數據庫,這個用Navicat連接上MySQL執行即可。

使用如下命令,進入Docker容器中Nacos目錄,並修改application.properties。

[root@bogon ~]# docker ps # 查看當前運行的容器
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                               NAMES
563aac734e9e        nacos/nacos-server:1.3.0   "bin/docker-startu..."   9 minutes ago       Up 9 minutes        0.0.0.0:8848->8848/tcp              practical_mcnulty
0c492ce51767        mysql                      "docker-entrypoint..."   2 months ago        Up 58 minutes       0.0.0.0:3306->3306/tcp, 33060/tcp   jolly_sammet
[root@bogon ~]# docker exec -it practical_mcnulty bash # 進入Nacos裏,這裏的practical_mcnulty是docker ps命令中,Nacos的NAMES字段值,因爲我沒有取別名
[root@563aac734e9e nacos]# cd conf/ # 進入conf目錄下,就能找到application.properties了
[root@563aac734e9e conf]# ll
total 40
-rw-r--r--. 1 root root   2180 Jun  5 18:47 application.properties
-rw-r--r--. 1  501 games 25080 Jun  5 16:33 nacos-logback.xml
-rw-r--r--. 1  501 games  7456 May 15 18:35 schema.sql
[root@563aac734e9e conf]# exit # 使用exit命令退出Docker容器
exit

可以看到如下內容:

# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:""}
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
db.num=${MYSQL_DATABASE_NUM:1}
db.url.0=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.url.1=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=${MYSQL_SERVICE_USER}
db.password=${MYSQL_SERVICE_PASSWORD}
### The auth system to use, currently only 'nacos' is supported:
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}


### The token expiration in seconds:
nacos.core.auth.default.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}

### The default token:
nacos.core.auth.default.token.secret.key=${NACOS_AUTH_TOKEN:SecretKey012345678901234567890123456789012345678901234567890123456789}

### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}

server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D
# default current work dir
server.tomcat.basedir=
## spring security config
### turn off security
nacos.security.ignore.urls=/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**
# metrics for elastic search
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false

nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true

這個裏面有許多${key:value}形式的東西,代表的意思是在Nacos啓動的時候,讀取啓動參數裏的key,如果讀取不到就使用冒號後面的值,我們的啓動參數裏並沒有帶這些值,所以,我們就直接修改配置文件好了。修改後的內容:

# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
spring.datasource.platform=mysql
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
db.num=1
db.url.0=jdbc:mysql://192.168.0.123:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai
db.url.1=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root
### The auth system to use, currently only 'nacos' is supported:
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}


### The token expiration in seconds:
nacos.core.auth.default.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}

### The default token:
nacos.core.auth.default.token.secret.key=${NACOS_AUTH_TOKEN:SecretKey012345678901234567890123456789012345678901234567890123456789}

### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}

server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D
# default current work dir
server.tomcat.basedir=
## spring security config
### turn off security
nacos.security.ignore.urls=/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**
# metrics for elastic search
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false

nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true

重啓Nacos查看效果。然後崩了,訪問http://192.168.0.123:8848/nacos/進不去了,可是查找原因:Nacos還不支持MySQL8。

於是,我到Nacos的GitHub上查看,找到了這個:https://github.com/alibaba/nacos/pull/3060,裏面說已經支持MySQL8數據庫驅動了,再看一眼更新日期:12天前,也就是2020-06-15,回看Docker Hub上的Nacos:1.3.0信息的更新時間:19天前,也就是2020-06-08。好吧,1.3.0版本的還沒有更新MySQL8驅動,白高興了,或許使用latest(更新時間8天前,也就是2020-06-19)就支持了(這個我沒有測試,只是猜測),後續正式版本應該就支持了吧。

好吧,這裏把MySQL版本換成5.7的,繼續走上面的步驟,重啓Nacos查看效果,又崩了,查看日誌,大致意思是沒有找到數據源,仔細對比了一些MySQL連接,找到錯了,創建的數據庫是nacos_config,可是數據庫連接寫成了nacos-config,修改後,重啓,一切正常了。

3.Linux版Nacos+MySQL生產環境配置

Linux的下載安裝啓動,和Windows上類似,去官網下載即可,Linux需要下在*.tar.gz文件,下載後解壓,在bin文件夾下可以看到startup.sh,啓動即可。這裏,我繼續使用Docker進行操作,也是複習一下Docker。

爲了演示集羣搭建,我們需要一個Nginx,三個Nacos,一個MySQL。使用Docker安裝Nginx並啓動。

[root@bogon ~]# docker pull nginx:stable
Trying to pull repository docker.io/library/nginx ...
stable: Pulling from docker.io/library/nginx
8559a31e96f4: Already exists
9a38be3aab21: Pull complete
522e5edd83fa: Pull complete
2ccf5a90baa6: Pull complete
Digest: sha256:159aedcc6acb8147c524ec2d11f02112bc21f9e8eb33e328fb7c04b05fc44e1c
Status: Downloaded newer image for docker.io/nginx:stable
[root@bogon ~]# docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
docker.io/rabbitmq             management          95bc78c8d15d        10 days ago         187 MB
docker.io/nginx                stable              9fc56f7e4c11        2 weeks ago         132 MB
docker.io/mysql                5.7                 9cfcce23593a        2 weeks ago         448 MB
docker.io/nacos/nacos-server   1.3.0               d1f1facebfbc        3 weeks ago         756 MB
docker.io/rabbitmq             3.7.26-management   d2d45254c99b        7 weeks ago         180 MB
docker.io/redis                latest              f9b990972689        8 weeks ago         104 MB
docker.io/mysql                latest              0c27e8e5fcfa        2 months ago        546 MB
docker.io/elasticsearch        6.8.7               9cdc9986c313        4 months ago        880 MB
docker.io/consul               1.6.1               48b314e920d6        9 months ago        116 MB
docker.io/tomcat               8.5.34              ca9e2fccef98        20 months ago       463 MB
docker.io/zookeeper            3.4.9               3b83d9104a4c        3 years ago         129 MB
[root@bogon ~]# docker run -d -p 80:80 nginx:stable
e950da524e2aa17716f435fe5e745978b4ea36e7fd53a6506efcbed2f7946c7a
[root@bogon ~]# docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                               NAMES
e950da524e2a        nginx:stable               "nginx -g 'daemon ..."   3 seconds ago       Up 2 seconds        0.0.0.0:80->80/tcp                  festive_booth
fe0f363d0c89        mysql:5.7                  "docker-entrypoint..."   About an hour ago   Up About an hour    0.0.0.0:3306->3306/tcp, 33060/tcp   hungry_colden
563aac734e9e        nacos/nacos-server:1.3.0   "bin/docker-startu..."   2 hours ago         Up 52 minutes       0.0.0.0:8848->8848/tcp              practical_mcnulty
[root@bogon ~]#

通過瀏覽器訪問http://192.168.0.123:80,如果能看到Welcome to nginx!說明Nginx啓動成功。Nginx先放到一邊過會再做配置,先搭建Nacos集羣。

經歷了2天的折騰,終於把Nacos集羣搞好了,差點放棄,因爲官方文檔更新不及時,我踩坑了……後文會說。

先說一下我的集羣環境,我這裏使用的是nacos/nacos-server:1.3.0的鏡像,在一臺機器上通過Docker鏡像的方式,部署了3臺Nacos,通過端口號作爲區分,虛擬機分配了4G內存(勉強夠用,小了恐怕啓動不起來),下面開始吧。

docker pull nacos/nacos-server:1.3.0 # 拉取nacos/nacos-server:1.3.0鏡像,靜靜等待即可
# 輸入以下命令,搭建集羣
docker run -d \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=3333 \
-e NACOS_SERVERS=192.168.0.123:3333,192.168.0.123:4444,192.168.0.123:5555 \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.0.123 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e NACOS_SERVER_IP=192.168.0.123 \
-p 3333:3333 \
--name nacos3333 \
nacos/nacos-server:1.3.0

docker run -d \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=4444 \
-e NACOS_SERVERS=192.168.0.123:3333,192.168.0.123:4444,192.168.0.123:5555 \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.0.123 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e NACOS_SERVER_IP=192.168.0.123 \
-p 4444:4444 \
--name nacos4444 \
nacos/nacos-server:1.3.0

docker run -d \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=5555 \
-e NACOS_SERVERS=192.168.0.123:3333,192.168.0.123:4444,192.168.0.123:5555 \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.0.123 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e NACOS_SERVER_IP=192.168.0.123 \
-p 5555:5555 \
--name nacos5555 \
nacos/nacos-server:1.3.0

拿一個出來簡單說說配置吧。

docker run -d \ # -d表示是後臺運行
-e MODE=cluster \ # 以集羣模式運行
-e NACOS_APPLICATION_PORT=3333 \ # 這臺Nacos服務的port是3333
-e NACOS_SERVERS=192.168.0.123:3333,192.168.0.123:4444,192.168.0.123:5555 \ # Nacos集羣的所有機器的信息
-e SPRING_DATASOURCE_PLATFORM=mysql \ # 使用外置MySQL存儲配置信息
-e MYSQL_SERVICE_HOST=192.168.0.123 \ # 外置MySQL的IP
-e MYSQL_SERVICE_PORT=3306 \ # 外置MySQL的port
-e MYSQL_SERVICE_USER=root \ # 外置MySQL的用戶名
-e MYSQL_SERVICE_PASSWORD=root \ # 外置MySQL的密碼
-e MYSQL_SERVICE_DB_NAME=nacos_config \ # 外置MySQL的數據庫,也就是Nacos的配置文件要存儲得到哪個數據庫,這個在單機版Nacos使用外置數據庫時候介紹過
-e NACOS_SERVER_IP=192.168.0.123 \ # 這臺Nacos服務的IP
-p 3333:3333 \ # 容器外部端口映射
--name nacos3333 \ # 給容器起個名字吧
nacos/nacos-server:1.3.0 # 運行哪個鏡像

先說下我碰到的坑,從官方文檔找參數,Nacos的port對應的是NACOS_SERVER_PORT,那就照着寫唄,寫上之後,3臺啓動唄,啓動後,使用命令docker logs -f 容器id查看啓動日誌,3臺Nacos看到的都是Nacos started successfully in cluster mode. use external storage,表示啓動成功了,那就訪問訪問唄,結果,提示“無法訪問此網站,拒絕了我們的連接請求”,這就很尷尬,肯定是哪裏還有問題。進入其中某一臺機器,查看conf/naming-raft.log日誌,提示的是no leader is available now!,也就是這個集羣沒有leader,奇了怪了,3臺機器都正常啓動,正常情況下,要選出一個leader呀。

反反覆覆檢查了幾遍參數,並對照着文檔看了下,沒寫錯呀,刪掉容器重建,折騰了5,6次,還是不行,關於報錯,也是沒有查到什麼有幫助的解釋。

這時候,我突然發現了文檔上的一個問題,MYSQL_DATABASE_NUM給的默認值是2,和之前conf/application.properties裏的${MYSQL_DATABASE_NUM:1}默認值是1不符呀?哪裏錯了?翻了翻GitHub,找到了答案:移除數據庫主從鏡像配置。再看官方文檔,裏面還有MYSQL_MASTER_SERVICE_HOST、MYSQL_SLAVE_SERVICE_HOST等字眼。突然意識到了一個問題:文檔很可能沒有更新。

查看bin/docker-startup.sh和conf/application.properties這兩個文件,因爲我們通過-e指定的參數,大多數都用在這裏了,很快我發現了conf/application.properties裏的{NACOS_APPLICATION_PORT:8848},似曾相識啊!和NACOS_SERVER_PORT確實有點像,坑點就在這裏:對於nacos/nacos-server:1.3.0鏡像,自定義Nacos端口號的時候,不要使用NACOS_SERVER_PORT,要使用NACOS_APPLICATION_PORT!因爲conf/application.properties裏寫了。

在看bin/docker-startup.sh的時候,我發現了這麼一段,不懂Bash,但是大致能看懂一些,就是遍歷${NACOS_SERVERS}的值,把它們輸出到$CLUSTER_CONF文件裏。

function print_servers(){
   if [[ ! -d "${PLUGINS_DIR}" ]]; then
    echo "" > "$CLUSTER_CONF"
    for server in ${NACOS_SERVERS}; do
            echo "$server" >> "$CLUSTER_CONF"
    done
   else
    bash $PLUGINS_DIR/plugin.sh
   sleep 30
        fi
}

看看這個配置文件裏寫了什麼,這就有意思了,打開配置文件cluster.conf一看,裏面竟然有4行ip:port值,除了我定義的3333,4444,5555端口之外,還有一個8848端口,這是怎麼冒出來的?又一次驗證了我對端口配置的懷疑,自定義端口可能沒生效,有的服務可能走了默認端口。

抱着試一試的想法,把-e參數裏的NACOS_SERVER_PORT改成了NACOS_APPLICATION_PORT,啓動3臺機器容器,訪問http://192.168.0.123:3333/nacos/http://192.168.0.123:4444/nacos/http://192.168.0.123:5555/nacos/都可以正常訪問了,和剛纔相比,向成功邁進了一步。再點擊“集羣管理”-“結點列表”查看結點,集羣搭建成功了!

現在是2020-06-29,文檔還沒有更新,貼一下吧,踩過的坑……

這種方式搭建Nacos集羣有點麻煩,另外介紹一種簡單點的方式:使用docker-compose運行Nacos集羣,下面開始操作。

使用命令“docker-compose -v”查看本機是否安裝過docker-compose,如果沒有安裝,可以參考這裏進行安裝。

[root@localhost ~]# sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # 下載docker-compose
……
[root@localhost ~]# sudo chmod +x /usr/local/bin/docker-compose # 給docker-compose加運行權限
[root@localhost ~]# docker-compose -v # 驗證docker-compose是否安裝成功
docker-compose version 1.26.0, build d4451659

這裏還要用到git,如果沒有git的還要安裝下git纔行。

[root@localhost ~]# git --version # 驗證是否安裝git
git version 1.8.3.1
[root@localhost ~]# yum install -y git # 如果沒有安裝git,使用這個命令安裝git
……
[root@localhost ~]# git clone https://github.com/nacos-group/nacos-docker.git # 下載nacos-docker

很快,nacos-docker下載完成了,主要關注env和example文件夾。env裏是一些環境變量,example是運行實例的例子,先把相關的命令列出來,在運行(在nacos-docker文件夾下執行命令)之前,需要查看下*.yaml裏到底寫的什麼,是否需要根據自己的情況做修改呢?

[root@localhost ~]# docker-compose -f example/standalone-derby.yaml up # 使用Derby作爲數據源,單機模式啓動
[root@localhost ~]# docker-compose -f example/standalone-mysql-5.7.yaml up # 使用mysql-5.7作爲數據源,單機模式啓動
[root@localhost ~]# docker-compose -f example/standalone-mysql-8.yaml up # 使用mysql-8作爲數據源,單機模式啓動
[root@localhost ~]# docker-compose -f example/cluster-hostname.yaml up # 使用mysql5.7作爲數據源,集羣模式啓動

這裏只說集羣模式了(cluster-hostname.yaml),集羣模式看懂了,單機就不在話下了。

version: "3"
services:
  nacos1:
    hostname: nacos1
    container_name: nacos1 # 容器名稱
    image: nacos/nacos-server:latest # 容器使用的鏡像
    volumes:
      - ./cluster-logs/nacos1:/home/nacos/logs
      - ./init.d/custom.properties:/home/nacos/init.d/custom.properties
    ports: # 端口映射
      - "8848:8848"
      - "9555:9555"
    env_file: # nacos環境變量
      - ../env/nacos-hostname.env
    restart: always # 開機自啓
    depends_on: # 數據源使用的是mysql
      - mysql
  nacos2:
    hostname: nacos2
    image: nacos/nacos-server:latest
    container_name: nacos2
    volumes:
      - ./cluster-logs/nacos2:/home/nacos/logs
      - ./init.d/custom.properties:/home/nacos/init.d/custom.properties
    ports:
      - "8849:8848"
    env_file:
      - ../env/nacos-hostname.env
    restart: always
    depends_on:
      - mysql
  nacos3:
    hostname: nacos3
    image: nacos/nacos-server:latest
    container_name: nacos3
    volumes:
      - ./cluster-logs/nacos3:/home/nacos/logs
      - ./init.d/custom.properties:/home/nacos/init.d/custom.properties
    ports:
      - "8850:8848"
    env_file:
      - ../env/nacos-hostname.env
    restart: always
    depends_on:
      - mysql
  mysql:
    container_name: mysql
    image: nacos/nacos-mysql:5.7 # 使用的mysql版本號
    env_file:
      - ../env/mysql.env # mysql環境變量
    volumes:
      - ./mysql:/var/lib/mysql
    ports: # 端口映射
      - "3306:3306"

如果虛擬機內存足夠大(大於等於4G),那麼可以直接運行上面的命令,否則,需要在nacos-hostname.env裏添加jvm參數後,再使用上面的命令啓動(配置完參數後實測,3臺Nacos+1臺mysql剛剛跑起來已經2.25G內存了,如果不配參數,4G內存接近喫滿)。

#jvm
JVM_XMS=256m
JVM_XMX=256m
JVM_XMN=256m

啓動的時候,報了一個錯:chown: cannot read directory '/var/lib/mysql/': Permission denied,這是因爲CentOS7默認開啓了selinux安全模塊,使用命令:su -c "setenforce 0"臨時關閉selinux模塊再啓動,等待拉取鏡像以及初始化之後,通過瀏覽器就可以訪問了,放一個效果圖。

既然Nacos集羣搭建好了,下面看一下Nginx的配置。

[root@bogon ~]# docker exec -it festive_booth bash # 進入Nginx容器,festive_booth是docker ps命令中nginx的NAMES字段值
root@e950da524e2a:/# cd /etc/nginx/ # 進入/etc/nginx目錄
root@e950da524e2a:/etc/nginx# ls -l # 查看目錄下的文件
total 36
drwxr-xr-x. 1 root root   26 Jun  9 16:58 conf.d
-rw-r--r--. 1 root root 1007 Apr 21 12:43 fastcgi_params
-rw-r--r--. 1 root root 2837 Apr 21 12:43 koi-utf
-rw-r--r--. 1 root root 2223 Apr 21 12:43 koi-win
-rw-r--r--. 1 root root 5231 Apr 21 12:43 mime.types
lrwxrwxrwx. 1 root root   22 Apr 21 12:43 modules -> /usr/lib/nginx/modules
-rw-r--r--. 1 root root  643 Apr 21 12:43 nginx.conf
-rw-r--r--. 1 root root  636 Apr 21 12:43 scgi_params
-rw-r--r--. 1 root root  664 Apr 21 12:43 uwsgi_params
-rw-r--r--. 1 root root 3610 Apr 21 12:43 win-utf
root@e950da524e2a:/etc/nginx# cat nginx.conf # 查看nginx.conf的內容

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

nginx.conf就是nginx的主配置文件,注意最後一行有一個include /etc/nginx/conf.d/*.conf;的語句,它的意思是:加載配置文件的時候,把/etc/nginx/conf.d下的*.conf文件包括進來,我們看看/etc/nginx/conf.d下有什麼文件,發現另一個default.conf。

root@e950da524e2a:/etc/nginx# cd /etc/nginx/conf.d/
root@e950da524e2a:/etc/nginx/conf.d# ls -l
total 4
-rw-r--r--. 1 root root 1114 Jun  9 16:58 default.conf
root@e950da524e2a:/etc/nginx/conf.d# cat default.conf
server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

當我嘗試修改這個配置文件的時候,發現vi和vim命令無法使用,只能採用別的方法:掛載外部配置文件以替代docker容器內的配置文件。

在/usr/下創建一個docker-nginx的文件夾,在裏面添加一個nginx.conf配置文件,主要關注點在upstream結點上,內容如下:

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    upstream cluster {
        server 192.168.0.123:3333;
        server 192.168.0.123:4444;
        server 192.168.0.123:5555;
    }

    server {
        listen       80;
        listen  [::]:80;
        server_name  localhost;
    
        #charset koi8-r;
        #access_log  /var/log/nginx/host.access.log  main;
    
        location / {
            #root   /usr/share/nginx/html;
            #index  index.html index.htm;
            proxy_pass http://cluster;
        }
    
        #error_page  404              /404.html;
    
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
}

使用docker stop 容器id命令,把之前的容器停掉,docker rm 容器id把之前的容器刪除,以掛載外置配置文件方式重新運行一個容器,啓動命令:docker run -d -p 80:80 -v /usr/docker-nginx/nginx.conf:/etc/nginx/nginx.conf nginx:stable。

瀏覽器訪問:http://192.168.0.123/nacos,根據Nginx的負載均衡規則, 可以正常訪問到某臺Nacos,登陸進去即可,一切順利!

最後一步,我們將cloud-alibaba-provider-payment9002服務註冊進Nacos集羣。修改application.yml配置文件的server-addr的值,讓其指向Nginx。

server:
  port: 9002
spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.0.123:80 # 指向Nginx,由Nginx進行轉發(nginx下部署了3臺Nacos集羣)
        # server-addr: 192.168.0.123:8848 # 指明Nacos的地址
management:
  endpoints:
    web:
      exposure:
        include: '*'

Nginx下有3臺Nacos部署的集羣環境,由Nginx進行轉發,啓動Payment9002,訪問http://192.168.0.123/nacos,查看“服務管理”-“服務列表”,可以看到服務成功註冊進來了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章