SpringCloudAlibaba-Nacos

本文编写自2021年4月8日,当前最新版本为 2021年3月30日发布的2.0.0版本
本文使用版本为SpringCloudAlibaba2.0.0

欢迎来到 Nacos 的世界!
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

SpringCloudAlibaba官网:https://spring.io/projects/spring-cloud-alibaba/
Nacos 官网:https://nacos.io/zh-cn/docs/what-is-nacos.html
Nacos GitHub:https://github.com/alibaba/spring-cloud-alibaba

一些概念性东西等,源于官方文档,可以直接阅读官方文档。

概述

什么是 Nacos

服务(Service)是 Nacos 世界的一等公民。Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理:
Kubernetes Service
gRPC & Dubbo RPC Service
Spring Cloud RESTful Service

在SpringCloud环境中,Nacos的功能覆盖了服务注册中心、服务配置中心、服务总线
相当于Nacos = Eureka + Config + Bus

Nacos的主要特性

  • 服务发现和服务健康监测
    Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDKOpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODOHTTP&API查找和发现服务。
    Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。

  • 动态配置服务
    动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
    动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
    配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
    Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

  • 动态 DNS 服务
    动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。
    Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表.

  • 服务及其元数据管理
    Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

  • 更多的特性列表 …

Nacos大图

  • 特性大图:要从功能特性,非功能特性,全面介绍我们要解的问题域的特性诉求
  • 架构大图:通过清晰架构,让您快速进入 Nacos 世界
  • 业务大图:利用当前特性可以支持的业务场景,及其最佳实践
  • 生态大图:系统梳理 Nacos 和主流技术生态的关系
  • 优势大图:展示 Nacos 核心竞争力
  • 战略大图:要从战略到战术层面讲 Nacos 的宏观优势

下载安装与配置

下载

你可以通过源码和发行包两种方式来获取 Nacos。

从 Github 上下载源码方式

git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U  
ls -al distribution/target/

// 将 $version 更改为您的实际路径
cd distribution/target/nacos-server-$version/nacos/bin

下载编译后压缩包方式

(个人推荐,因为它方便)
您可以从 最新稳定版本 下载 nacos-server-$version.zip 包。

unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
cd nacos/bin

我们现在最新版本是 2.0.0-bugfix (Mar 30th, 2021) 我就使用这个版本了。
image.png

启动服务

Linux/Unix/Mac

启动命令(standalone代表着单机模式运行,非集群模式):

sh startup.sh -m standalone

如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:

bash startup.sh -m standalone

Windows

启动命令(standalone代表着单机模式运行,非集群模式):

cmd startup.cmd -m standalone

比如我为了方便,直接在Windows本机安装的Nacos,就把它下载、解压,然后进入到bin目录中,执行命令启动:

startup.cmd -m standalone

启动效果如下:

启动之后不要关闭此页面!
image.pngimage.png
在控制台最后会有这么一段内容,表示Nacos启动成功,默认使用端口8848

2021-04-08 16:32:58,980 INFO Tomcat started on port(s): 8848 (http) with context
 path '/nacos'

2021-04-08 16:32:58,986 INFO Nacos started successfully in stand alone mode. use
 embedded storage

Nacos自带图形化页面,地址 http://localhost:8848/nacos (根据安装机器对应修改ip)
在浏览器中打开 http://localhost:8848/nacos 可以看到如下页面(默认用户名密码都是nacos):
image.png

简单命令

服务注册

curl -X POST "http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080"
根据参数可以看出,注册一个名字叫做nacos.naming.serviceName、ip是20.18.7.10、端口是8080的服务。
image.png

服务发现

curl -X GET "http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName"
根据参数可以看出,获取一个名字叫做nacos.naming.serviceName的服务信息。
image.png

发布配置

curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"
根据参数可以看出,发布一个id为nacos.cfg.dataId、group为test、内容为HelloWorld的配置。
image.png

获取配置

curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"
根据参数可以看出,获取id为nacos.cfg.dataId、group为test的配置内容。
image.png

关闭服务

Linux/Unix/Mac

sh shutdown.sh

Windows

cmd shutdown.cmd

或者双击shutdown.cmd运行文件。

Nacos使用

Nacos官方使用文档:

此处我们是为了使用SpringCloudAlibaba的,所以讲得是Nacos关于SpringCloud的使用。
SpringCloudAlibaba官方文档:
https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.htm
也可以自己打开Spring官网 https://spring.io/ 自己进入文档,进入方式如下图。
image.png
可以看到Spring Cloud Alibaba Nacos的主要功能:
Spring Cloud Alibaba Nacos Discovery

  • Service Registration/Discovery: Nacos Discovery
  • How to Introduce Nacos Discovery for service registration/discovery
  • An example of using Nacos Discovery for service registration/discovery and call
  • Nacos Server Startup
  • Start a Provider Application
  • Start a Consumer Application
  • Nacos Discovery Endpoint
  • More Information about Nacos Discovery Starter Configurations

Spring Cloud Alibaba Nacos Config

  • How to Introduce Nacos Config for configuration
  • Quickstart
  • Add Configurations with DataId in YAML Format
  • Support Dynamic Configuration Udpates
  • Support configurations at the profile level
  • Support Custom Namespaces
  • Support Custom Groups
  • Support Custom Data Id
  • Nacos Config Endpoint
  • Disable Nacos Config AutoConfiguration
  • More Information about Nacos Config Starter Configurations

引入Nacos Discovery进行服务注册/发现

学习此模块最好先了解Eureka
先自己创建一个maven或是Spring Initializr项目,然后再创建我们所需要的子模块,我们要创建好多个子模块,作为服务的提供者和消费者。具体创建过程项目、子模块过程略。。。

对于依赖管理,我们可以在项目的 pom.xml 中加入如下配置控制SpringCloudAlibaba各组件的版本。
具体获取位置:在我们进入到官方文档后,左侧目录第二项 2. Dependency Management 里面就有。

页面位置链接:https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html#_dependency_management
image.png

最终完整版父项目的 pom.xml 文件添加以下配置,统一管理子模块的依赖坐标版本(如果父pom不写也行,那么每个子模块就都要写一遍了)。

		<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.4.4</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2020.0.2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <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>
        </dependencies>
    </dependencyManagement>

创建一个服务提供者

我这里创建的的服务提供者模块叫做 nacos-provider-9001
然后再在pom.xml文件中引入如下坐标,以使用nacos:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

完整版的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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>SpringCloudAlibabaNacos</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <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>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>
</project>

application.properties 配置文件:

server.port=9001
spring.application.name=nacos-provider
# Nacos服务的地址、端口
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 应当包含的端点ID,或全部包含的"*"。
management.endpoints.web.exposure.include=*

如果您不想使用Nacos进行服务注册和发现,则可以设置 spring.cloud.nacos.discovery 为 false。

启动类 NacosProvider9001Application.java
org.example.springcloudalibaba.NacosProvider9001Application

package org.example.springcloudalibaba;

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

/**
 * @Auth: guohui.wang
 * @Blog: <a>https://blog.csdn.net/wangguohui0726</a>
 * @Date: 2021-04-09 10:33
 * @desc:
 */
@SpringBootApplication
@EnableDiscoveryClient //开启服务注册
public class NacosProvider9001Application {
    public static void main(String[] args) {
        SpringApplication.run(NacosProvider9001Application.class, args);
    }
}

测试Controller ProviderTestProviderController.java:
org.example.springcloudalibaba.controller.ProviderTestProviderController

package org.example.springcloudalibaba.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Auth: guohui.wang
 * @Blog: <a>https://blog.csdn.net/wangguohui0726</a>
 * @Date: 2021-04-09 10:35
 * @desc:
 */
@RestController
public class ProviderTestProviderController {
    @GetMapping(value = "/echo/{string}")
    public String echo(@PathVariable String string) {
        return "Hello Nacos Discovery, " + string;
    }
}

验证:

  1. 访问Nacos服务控制台地址 http://localhost:8848/nacos/ 使用用户名密码登录(都是nacos),选择服务管理-服务列表,可以看到我们注册进来的这个服务。

image.png

  1. 访问 http://localhost:9001/echo/ok 能够展示出来页面

image.png

创建一个服务消费者

创建消费者服务可能不像创建提供者服务那样容易,因为消费者需要调用提供程序的RESTful服务。在此示例中,我们将使用最原始的方式,即,将LoadBalanceClient和RestTemolate显式组合以访问RESTful服务。
为了省事,我们消费者这边就把所有的类(启动类、配置类、Controller层)都写在一起了。(我图个省事,实际开发别这么干,别打死别找我)
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>SpringCloudAlibabaNacos</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>nacos-consumer-9011</artifactId>

    <dependencies>
        <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>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>
</project>

application.properties:

server.port=9011
spring.application.name=nacos-consumer
# Nacos服务的地址、端口
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 应当包含的端点ID,或全部包含的"*"。
management.endpoints.web.exposure.include=*

NacosConsumer9001Application.java:
org.example.springcloudalibaba.NacosConsumer9001Application

package org.example.springcloudalibaba;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @Auth: guohui.wang
 * @Blog: <a>https://blog.csdn.net/wangguohui0726</a>
 * @Date: 2021-04-09 10:33
 * @desc:
 */
@SpringBootApplication
@EnableDiscoveryClient //开启服务注册
public class NacosConsumer9011Application {
    public static void main(String[] args) {
        SpringApplication.run(NacosConsumer9011Application.class, args);
    }

    //Instantiate RestTemplate Instance
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @RestController
    public class NacosController {

        @Autowired
        private LoadBalancerClient loadBalancerClient;
        @Autowired
        private RestTemplate restTemplate;

        @Value("${spring.application.name}")
        private String appName;

        @GetMapping("/echo/app-name")
        public String echoAppName() {
            //Access through the combination of LoadBalanceClient and RestTemplate
            ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-provider");
            String path = String.format("http://%s:%s/echo/%s", serviceInstance.getHost(), serviceInstance.getPort(), appName);
            System.out.println("request path:" + path);
            return restTemplate.getForObject(path, String.class);
        }

    }
}

也可以不在echoAppName()方法中使用loadBalancerClient获取serviceInstance,直接在我们注入的restTemplate上面加上注解@LoadBalanced,在调用的的时候,restTemplate调用的url就不是http:ip+port/接口了,就是http:服务名/接口,这样也可以(具体原因,看Ribbon教程)。

package org.example.springcloudalibaba;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @Auth: guohui.wang
 * @Blog: <a>https://blog.csdn.net/wangguohui0726</a>
 * @Date: 2021-04-09 10:33
 * @desc:
 */
@SpringBootApplication
@EnableDiscoveryClient //开启服务注册
public class NacosConsumer9011Application {
    public static void main(String[] args) {
        SpringApplication.run(NacosConsumer9011Application.class, args);
    }

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

    @RestController
    public class NacosController {

        @Autowired
        private LoadBalancerClient loadBalancerClient;
        @Autowired
        private RestTemplate restTemplate;

        @Value("${spring.application.name}")
        private String appName;

        @GetMapping("/echo/app-name")
        public String echoAppName() {
            //Access through the combination of LoadBalanceClient and RestTemplate
            String providerAppName = "nacos-provider";
            String path = String.format("http://%s/echo/%s", providerAppName, appName);
            System.out.println("request path:" + path);
            return restTemplate.getForObject(path, String.class);
        }

    }
}

验证:

  1. 访问Nacos服务控制台地址 http://localhost:8848/nacos/ 使用用户名密码登录(都是nacos),选择服务管理-服务列表,可以看到我们注册进来的这个服务。

image.png

  1. 在浏览器访问地址** **http://localhost:9011/echo/app-name 可以获得如下结果

image.png
在成功的同时,可能会有人疑惑,我们也没有引入什么远程服务调用的工具的依赖啊,怎么就能够调用了呢?
这是因为:在我们引入的 spring-cloud-starter-alibaba-nacos-discovery 坐标中,内部就包含了ribbon的依赖,所以我们也就可以使用ribbon实现远程服务调用了。
image.png

关于Nacos Discovery的配置

配置钥匙默认值描述
服务器地址spring.cloud.nacos.discovery.server-addrNacos服务器侦听器的IP和端口
服务名称spring.cloud.nacos.discovery.service${spring.application.name}命名当前服务
权重spring.cloud.nacos.discovery.weight1值范围:1到100。值越大,重量越大。
网卡名称spring.cloud.nacos.discovery.network-interface如果未指定IP地址,则注册的IP地址是网卡的IP地址。如果也未指定,默认情况下将使用第一个网卡的IP地址。
注册IP地址spring.cloud.nacos.discovery.ip最高优先级
注册端口spring.cloud.nacos.discovery.port-1默认情况下将自动检测。不需要配置。
命名空间spring.cloud.nacos.discovery.namespace一个典型的场景是隔离针对不同环境的服务注册,例如测试和生产环境之间的资源(配置,服务等)隔离。
快捷键spring.cloud.nacos.discovery.access-key阿里云帐户访问密钥
密钥spring.cloud.nacos.discovery.secret-key阿里云账户密钥
元数据spring.cloud.nacos.discovery.metadata您可以使用地图格式为服务定义一些元数据
日志文件名spring.cloud.nacos.discovery.log-name
集群名称spring.cloud.nacos.discovery.cluster-nameDEFAULTNacos的群集名称
终点spring.cloud.nacos.discovery.endpoint特定服务在特定区域中的域名。您可以使用该域名动态检索服务器地址
是否整合Ribbonribbon.nacos.enabledtrue在大多数情况下设置为true
启用Nacos监听spring.cloud.nacos.discovery.watch.enabledtrue设置为false以关闭监听

Nacos与其他注册中心对比

image.png
image.png

CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。

一个问题:
nacos-discovery 2020.0.0版本,发现里面的ribbon被删除了,@LoadBalanced RestTemplate失效了,这个版本需要怎么做负载均衡?
pring cloud2020版本也移除了ribbin。转而使用自己的loadbalance模块了。参考一下spring cloud common模块的文档。
具体怎么搞,之后研究,研究完了补上来

使用Nacos Config进行配置中心

学习此模块最好先了解 SpringCloud Config

配置案例

创建子模块 nacos-config-9021
pom.xml
(重点关注下这个pom的 spring-cloud-starter-bootstrap 坐标,SpringCloud 2020.X.X版本之后需要额外加入一个依赖 spring-cloud-starter-bootstrap,旧版本的不需要,因为bootstrap.yml文件的识别在旧版本的时候能直接识别,第一个pom是符合我这个最新版本的,第二个pom是通过降为了旧版本的依赖,看版本选择怎么使用吧)
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>SpringCloudAlibabaNacos</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>nacos-config-9021</artifactId>

    <dependencies>
        <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>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--
        SpringCloud 2020.X.X 版本以前如果需要支持 bootstrap.yml文件需要引入spring-cloud-context
        不过,在上面两个nacos坐标里都带了,也就不需要额外引入了
        SpringCloud 2020.X.X 版本以后如果需要支持 bootstrap.yml文件需要引入这个坐标-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
    </dependencies>

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

    <dependencies>
        <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>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
    </dependencies>

bootstrap.yml

server:
  port: 9021
spring:
  profiles:
    active: dev
  application:
    name: nacos-config
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml

application.yml

#没错,就是空的

启动类 NacosConfig9021Application.java
org.example.springcloudalibaba.NacosConfig9021Application

package org.example.springcloudalibaba;

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

/**
 * @Auth: guohui.wang
 * @Blog: <a>https://blog.csdn.net/wangguohui0726</a>
 * @Date: 2021-04-09 15:49
 * @desc:
 */
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfig9021Application {
    public static void main(String[] args) {
        SpringApplication.run(NacosConfig9021Application.class, args);
    }
}

controller层测试类 ConfigTestController.java
org.example.springcloudalibaba.controller.ConfigTestController

package org.example.springcloudalibaba.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;

/**
 * @Auth: guohui.wang
 * @Blog: <a>https://blog.csdn.net/wangguohui0726</a>
 * @Date: 2021-04-09 16:16
 * @desc:
 */
@RestController
@RefreshScope
public class ConfigTestController {
    @Value("${info}")
    public String info;

    @GetMapping("/getInfo")
    public String getInfo() {
        return info;
    }
}

Nacos添加配置:

登录控制台 http://localhost:8848/nacos,用户名密码都是nacos

image.png

  • DataId:nacos-config-dev.yaml
  • GROUP:默认DEFAULT_GROUP
  • 配置格式:YAML
  • 配置内容:info: iamaboy

image.png
Nacos配置规则:
在 Nacos Spring Cloud 中,dataId 的完整格式如下:${prefix}-${spring.profiles.active}.${file-extension}

  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 propertiesyaml 类型。

如果没看懂,对应看下配置文件就知道了。
举例:

  • ${prefix}-${spring.profiles.active}.${file-extension}
    • nacos-config-dev.yaml
  • ${prefix}.${file-extension}
    • nacos-config.yaml
    • nacos-config.properties

验证:

  1. 启动没报错
  2. 通过Nacos控制台能够看懂此服务注册进去了
  3. 浏览器访问 http://localhost:9021/getInfo 能够获取到Nacos配置的配置内容。
  4. 如果在Controller类上面加上了@RefreshScope注解,Nacos中配置修改之后,无需重启,重新访问http://localhost:9021/getInfo可以获取到最新的配置数据的。
  5. 你看,我们配置文件上并没有配置info这项,Nacos上面配置了,而且@Value确确实实获取到了。这就说明我们项目确实从Nacos上面拿数据了。

命名空间、GROUP、DataID

Nacos配置基本的三个概念:命名空间、GROUP、DataId。
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

image.png
做到现在了,我觉得后面这几个配置应该直接都能看懂咋回事,就不截图上代码举例子了

自定义命名空间

如果未指定名称空间,则使用Nacos的“public”名称空间${spring.cloud.nacos.config.namespace}。您还可以通过以下方式指定自定义名称空间:

spring.cloud.nacos.config.namespace=b3404bc0-d7dc-4855-b519-570ed34b62d7

此配置必须在bootstrap文件中。spring.cloud.nacos.config.namespace的值是名称空间的ID,可以从Nacos控制台中检索ID的值。添加配置时,请勿选择其他名称空间。否则,将无法正确检索配置。

自定义组

{spring.cloud.nacos.config.group}未定义配置时,默认情况下使用DEFAULT_GROUP 。如果需要定义自己的组,则可以在以下属性中进行定义:

spring.cloud.nacos.config.group=DEVELOP_GROUP

此配置必须在bootstrap文件中,并且Group的值必须与 spring.cloud.nacos.config.group 的值相同。

自定义DataID

从Spring Cloud Alibaba Nacos Config开始,数据ID可以自定义。有关此部分的详细设计,请参阅Github问题。以下是一个完整的示例:

spring.application.name=opensource-service-provider
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

# config external configuration
# 1. Data Id is in the default group of DEFAULT_GROUP, and dynamic refresh of configurations is not supported.
spring.cloud.nacos.config.ext-config[0].data-id=ext-config-common01.properties

# 2. Data Id is not in the default group, and dynamic refresh of configurations is not supported.
spring.cloud.nacos.config.ext-config[1].data-id=ext-config-common02.properties
spring.cloud.nacos.config.ext-config[1].group=GLOBALE_GROUP

# 3. Data Id is not in the default group and dynamic referesh of configurations is supported.
spring.cloud.nacos.config.ext-config[2].data-id=ext-config-common03.properties
spring.cloud.nacos.config.ext-config[2].group=REFRESH_GROUP
spring.cloud.nacos.config.ext-config[2].refresh=true

我们可以看到:

  • 通过配置支持多个数据ID spring.cloud.nacos.config.ext-config[n].data-id

  • 通过配置来定制数据ID组spring.cloud.nacos.config.ext-config[n].group。如果未指定,则使用DEFAULT_GROUP。

  • 通过配置spring.cloud.nacos.config.ext-config[n].refresh更改配置时数据ID是否支持配置的动态刷新。默认情况下不支持。

  • 当同时配置多个数据ID时,优先级由中的"n"值定义spring.cloud.nacos.config.ext-config[n].data-id。值越大,优先级越高。

  • spring.cloud.nacos.config.ext-config[n].data-id** 的值必须具有文件扩展名,并且可以是属性或yaml / yml。spring.cloud.nacos.config.file-extension**中的设置对自定义数据ID文件扩展名没有任何影响。

**
自定义数据ID的配置允许在多个应用程序之间共享配置,还可以为一个应用程序支持多种配置。
要更清晰地在多个应用程序之间共享数据标识,您还可以使用以下方法:

spring.cloud.nacos.config.shared-dataids=bootstrap-common.properties,all-common.properties
spring.cloud.nacos.config.refreshable-dataids=bootstrap-common.properties
  • spring.cloud.nacos.config.shared-dataids 用于配置多个共享数据ID时,我们同意共享配置之间的以下优先级:优先级是根据配置出现的顺序来确定的。较晚出现的优先级比最先出现的优先级高。
  • 使用 spring.cloud.nacos.config.shared-dataids 时,数据ID必须具有文件扩展名,并且可以是属性或yaml / yml。并且 spring.cloud.nacos.config.file-extension 中的配置****对自定义的Data Id文件扩展名没有任何影响。
  • spring.cloud.nacos.config.refreshable-dataids 指定支持动态刷新的数据ID时,数据ID的相应值还应指定文件扩展名。

Nacos集群和持久化配置

传统我们启动Nacos都是以单机(standalone)的方式进行启动的,同时我们也会发现一个现象,就是我们设置的配置在Nacos重启之后依旧存在,这就说明了它有将配置进行了一个持久化存储(因为内存存储关掉就没了)。这是因为我们的Nacos中其实内部集成了一个小型数据库(Derby)。
但是我们在生产环境的时候,首先不可能只启动一个Nacos服务,这样很容易就产生单点故障。其次,既然单机不大合适,那就上集群环境吧,这时候我们的另一个问题就出来了。Nacos每一台机器的都会把它的配置存储在它本地的Derby数据库上,多台服务之间的数据是不同步的,这对于集群来说可不能行啊。所以,Nacos同时也支持使用外部数据库的方式进行数据的存储。
以下我们开始介绍一下Nacos的集群化部署以及它的持久化配置。

官网集群部署架构图

因此开源的时候推荐用户把所有服务列表放到一个vip下面,然后挂到一个域名下面
http://ip1:port/openAPI 直连ip模式,机器挂则需要修改ip才可以使用。
http://SLB:port/openAPI 挂载SLB模式(内网SLB,不可暴露到公网,以免带来安全风险),直连SLB即可,下面挂server真实ip,可读性不好。
http://nacos.com:port/openAPI 域名 + SLB模式(内网SLB,不可暴露到公网,以免带来安全风险),可读性好,而且换ip方便,推荐模式

SLB:服务器负载均衡(Server Load Balancing)


配置外部MySQL持久化

既然是要使用MySQL进行持久化,那我们必须要有两个重要的要素:MySQL数据库和数据库表结构。
MySQL服务怎么安装这里就不说了,那就说数据库表吧,我们应该从哪获取到这个数据库表相关信息呢?
一键直达:https://github.com/alibaba/nacos/blob/master/distribution/conf/nacos-mysql.sql
但是这个链接我不推荐,谁也不确定以后版本是不是这个文件,万一以后出新的版本了,表结构变了,人家单独又写了一个脚本文件呢,那这个链接不就不对劲儿了,所以我不喜欢直接给链接。下面简单介绍下从哪找到这个文件。

获取MySQL初始化脚本

  1. 首先打开nacos官网(右上角可以切换中英文)
  2. 点击主页的"手册",进入到官方文档中

image.png

  1. 找到并点击左侧目录树 “运维指南-集群部署说明”

image.png

  1. 往下翻,有个 “确定数据源-使用外置数据源-初始化MySQL-sql语句源文件”,这是个超链接,点进去就是官方给提供的sql脚本文件了,我们就可以拿着这个脚本初始化数据库了。

image.png

获取配置文件内容

在上面的获取sql数据源文件的下方就有一个 “application.properties配置文件”,我们可以在这里获取application.properties配置文件。这个和我们Nacos安装目录下面的conf中的这个文件是大致相同的。
单机模式切换数据库:
就在文件后面追加如下配置(用户名密码等配置项的值根据实际情况修改成自己的):

spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=youdontknow

具体配置可以看官方文档的 “运维指南-部署手册”。

然后重启Nacos。

Linux集群部署

我们先搭建一个 “1个Nginx–>3个Nacos–>1个Mysql” 这样的集群。

官网说明了一下配置要求:
image.png
所以我们选择Linux系统和3个Nacos。

搭建集群:

  1. 安装所需相关环境和配置。修改配置文件等文件的时候记得留一份备份。
  2. 创建MySQL表和修改properties文件(配置方式和之前一样)
  3. 修改conf/cluster.conf文件(详细内容下面呢)。
  4. 每台机器的Nacos都来一遍
  5. 修改nginx配置(详细内容下面呢)
  6. 启动!

Nacos的cluster.conf文件

  1. 将cluster.conf.example复制一份修改成cluster.conf进行配置
  2. 向配置文件中写入Nacos集群机器的ip,端口(不能使用127.0.0.1和localhost,必须使用指定ip)。样子如下:

image.png

Nginx的nginx.conf文件

加一个这玩意,里面的三个server对应部署的三个Nacos
image.png

至此,Nacos算是结束了,更多详细内容,推荐查看官网。
笔记代码:https://download.csdn.net/download/wangguohui0726/16754503

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 点我我会动 设计师:白松林 返回首页