一、Nacos简介

Nacos(Naming and Configuration Service)致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现服务配置、服务元数据及流量管理。

  • 详情查看Nacos官方文档

二、Nacos安装

1、Nacos依赖

Nacos基于java开发的,运行依赖于java环境。

  • 依赖64 bit JDK 1.8+,前往官网下载JDK

2、Nacos安装

  • 下载编译后压缩包,最新稳定版本
unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz cd nacos/bin

三、Nacos部署

1、单实例部署

单实例部署不适合生产环境,单点故障是致命的。

  • Linux单实例非集群模式启动命令
startup.sh -m standalone
  • Linux单实例非集群模式关闭命令
shutdown.sh
  • 访问nacos管理页面,初始化用户名密码均为nacos

2、集群部署

1、集群架构

  • 高可用Nginx集群
  • Nacos集群(至少三个实例)
  • 高可用数据库集群(取代Nacos内嵌数据库)

2、本地虚拟机模拟集群部署

本地环境准备
系统版本机器IP部署应用应用版本
CentOS 7.6192.168.15.146Nginx1.18.0
CentOS 7.6192.168.15.145Nacos1.2.1
CentOS 7.6192.168.15.147Nacos1.2.1
CentOS 7.6192.168.15.148Nacos1.2.1
CentOS 7.6192.168.15.141MySQL5.7.24

在本地PC机上利用VMware workstation虚拟出如上表所示的几台机器,其中Nginx和MySQL都是采用的单实例,仅做练习使用。

搭建步骤
初始化nacos必须的数据库表并配置
  • 找到Nacos安装目录下提供的数据库脚本文件

  • 在MySQL实例创建nacos_config库并导入脚本

  • 修改修改Nacos配置文件,指向MySQL实例,替换其内嵌数据库

#*************** 切换Nacos内嵌数据库平台为MySQL ***************#spring.datasource.platform=mysqldb.num=1db.url.0=jdbc:mysql://192.168.15.141:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTCdb.user=rootdb.password=123456

说明:三台nacos实例都需要切换MySQL平台,均需执行以上操作

nacos集群配置
  • 复制cluster.conf文件

  • Nacos集群配置,修改cluster.conf文件
[root@localhost conf]# vim ./cluster.conf#it is ip#example192.168.15.145192.168.15.147192.168.15.148

说明:三台nacos实例都需要做以上集群配置,至此关于nacos的配置结束了,可以尝试以集群模式启动三个nacos实例了

  • 以集群模式分别启动三个nacos实例


  • 尝试访问nacos管理页,测试三个实例是否正常

说明:如果三个实例以集群模式正常启动,那么分别访问三个实例的管理页就是展示以上登录页了。如果不能访问,则可能防火墙未开放nacos服务的端口,可执行如下命令。

[root@localhost bin]# firewall-cmd --add-port=8848/tcp --permanentsuccess[root@localhost bin]# firewall-cmd --reloadsuccess[root@localhost bin]# firewall-cmd --list-allpublic (active)  target: default  icmp-block-inversion: no  interfaces: ens33  sources:   services: ssh dhcpv6-client  ports: 27017/tcp 8848/tcp  protocols:   masquerade: no  forward-ports:   source-ports:   icmp-blocks:   rich rules:     [root@localhost bin]# 
Nginx配置
  • Nginx安装参考,Nginx源码安装
  • 修改Nginx配置文件nginx.conf
worker_processes  1;events {    worker_connections  1024;}http {    include       mime.types;    default_type  application/octet-stream;    sendfile        on;    keepalive_timeout  65;    #nacos集群负载均衡    upstream nacos-cluster {        server 192.168.15.145:8848;        server 192.168.15.147:8848;        server 192.168.15.148:8848;    }    server {        listen       80;        server_name  192.168.15.146;                         location / {            #root   html;            #index  index.html index.htm;            proxy_pass http://nacos-cluster;        }                error_page   500 502 503 504  /50x.html;        location = /50x.html {            root   html;        }    }}
  • 启动Nginx
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
微服务配置
  • 微服务父pom配置
<?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">    <modelVersion>4.0.0</modelVersion>    <groupId>com.atguigu.springcloud</groupId>    <artifactId>cloud2020</artifactId>    <version>1.0-SNAPSHOT</version>    <packaging>pom</packaging>    <!-- 模块 -->    <modules>        <module>cloud-alibaba-nacos-config-client-3377</module>    </modules>    <!-- 统一管理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>5.1.47</mysql.version>        <druid.version>1.1.16</druid.version>        <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>    </properties>    <!-- 统一依赖管理 -->    <dependencyManagement>        <dependencies>            <!-- spring boot 2.2.2 -->            <dependency>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot</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>            <!-- mysql连接器 -->            <dependency>                <groupId>mysql</groupId>                <artifactId>mysql-connector-java</artifactId>                <version>${mysql.version}</version>            </dependency>            <!--druid 数据源-->            <dependency>                <groupId>com.alibaba</groupId>                <artifactId>druid</artifactId>                <version>${druid.version}</version>            </dependency>            <!-- mybatis 整合 spring -->            <dependency>                <groupId>org.mybatis.spring.boot</groupId>                <artifactId>mybatis-spring-boot-starter</artifactId>                <version>${mybatis.spring.boot.version}</version>            </dependency>            <!-- junit -->            <dependency>                <groupId>junit</groupId>                <artifactId>junit</artifactId>                <version>${junit.version}</version>            </dependency>            <!-- log4j -->            <dependency>                <groupId>log4j</groupId>                <artifactId>log4j</artifactId>                <version>${log4j.version}</version>            </dependency>            <!-- lombok -->            <dependency>                <groupId>org.projectlombok</groupId>                <artifactId>lombok</artifactId>                <version>${lombok.version}</version>            </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>
  • 微服务pom依赖
<?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>cloud-alibaba-nacos-config-client-3377</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 -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <!-- actuator -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-actuator</artifactId>        </dependency>        <!-- test -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>        <!-- devtools -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-devtools</artifactId>            <scope>runtime</scope>            <optional>true</optional>        </dependency>        <!-- lombok -->        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>            <optional>true</optional>        </dependency>    </dependencies></project>
  • 微服务bootstrap.yml配置
server:  port: 3377spring:  application:    name: nacos-config-client  cloud:    nacos:      discovery:        #server-addr: my.nacos.com:8848        #nacos集群配置(Nginx)        server-addr: 192.168.15.146:80      config:        #server-addr: my.nacos.com:8848        #nacos集群配置(Nginx)        server-addr: 192.168.15.146:80        #指定yaml格式的配置        file-extension: yaml        #指定分组        group: DEV_GROUP        #指定命名空间ID        namespace: my_nacos_namespace
  • 微服务启动类配置
package com.atguigu.springcloud;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication@EnableDiscoveryClientpublic class NacosConfigClientMain3377 {    public static void main(String[] args) {        SpringApplication.run(NacosConfigClientMain3377.class, args);    }}
  • 微服务Controller读取nacos配置
package com.atguigu.springcloud.controller;import lombok.extern.slf4j.Slf4j;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@Slf4j@RefreshScope //支持Nacos的动态刷新功能public class ConfigClientController {    @Value("${config.info}")    private String configInfo;    @GetMapping("/config/info")    public String getConfigInfo() {        return configInfo;    }}
  • 在nacos管理页上维护一个配置


  • 本地启动微服务并访问