SpringCloudAlibaba之Nacos

Nacos简介

Nacos(Dynamic Naming and Configuration Service)一个更易于构建云原生应用的动态服务发现,配置管理和服务管理平台。

替代Eureka做服务注册中心
替代Config做服务配置中心

下载:https://github.com/alibaba/nacos/releases

官方文档

  1. https://nacos.io/zh-cn/index.html
  2. https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring_cloud_alibaba_nacos_discovery

Nacos支持三种部署模式

  1. 单机模式 - 用于测试和单机试用。
  2. 集群模式 - 用于生产环境,确保高可用。
  3. 多集群模式 - 用于多数据中心场景。

注册中心对比

Nacos Eureka Consul CoreDNS Zookeeper
一致性协议 CP+AP AP CP CP
健康检查 TCP/HTTP/MYSQL/Client Beat Client Beat TCP/HTTP/gRPC/Cmd Keep Alive
负载均衡策略 权重/metadata/Selector Ribbon Fabio RoundRobin
雪崩保护
自动注销实例 支持 支持 不支持 不支持 支持
访问协议 HTTP/DNS HTTP HTTP/DNS DNS TCP
监听支持 支持 支持 支持 不支持 支持
多数据中心 支持 支持 支持 不支持 不支持
跨注册中心同步 支持 不支持 支持 不支持 不支持
SpringCloud集成 支持 支持 支持 不支持 不支持
Dubbo集成 支持 不支持 不支持 不支持 支持
K8S集成 支持 不支持 支持 支持 不支持

Nacos服务端

nacos下载

地址:https://github.com/alibaba/nacos/releases

nacos单机

1、环境准备

Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:

  • 64 bit JDK 1.8+
  • Maven 3.2.x+

2、下载源码或者安装包

# 下载稳定版
wget https://github.com/alibaba/nacos/releases/download/1.3.0/nacos-server-1.3.0.tar.gz

3、解压到指定目录

tar -xvf nacos-server-1.3.0.tar -C /root/deploy/

4、启动服务器

cd /root/deploy/nacos/bin
# 启动命令(standalone代表着单机模式运行,非集群模式)
sh startup.sh -m standalone

注意防火墙开放8848端口

# 查看已经开放的端口
firewall-cmd --list-ports
# 开启端口
firewall-cmd --zone=public --add-port=8848/tcp --permanent
# 重启防火墙
firewall-cmd --reload

运行成功后直接访问http://localhost:8848/nacos
账号:nacos
密码:nacos

5、关闭服务器

cd /root/deploy/nacos/bin
sh shutdown.sh

6、持久化配置

在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力。

1、创建数据库

创建数据库:nacos_config
字符集: utf-8
排序规则: utf8_general_ci

2、初始化数据库

在nacos/conf目录下有个nacos-mysql.sql文件,将sql导入mysql中

3、修改配置文件

修改nacos/conf/application.properties配置文件,添加数据源mysql数据源配置(目前只支持mysql),
添加mysql数据源的url、用户名和密码。

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=nacos
db.password=nacos

4、配置mysql8.0数据库

1、在nacos目录下新建目录plugins/mysql
mkdir -p plugins/mysql
2、放入mysql8.0的驱动包,启动nacos
alert nacos1

Nacos集群

默认Nacos使用嵌入式数据库derby实现数据存储,如果启动多个默认配置下的Nacos节点,数据存储存在一致性问题。为了解决这个问题,nacos采用集中式存储的方式支持集群化部署,目前只支持Mysql存储。

官方文档:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html

官方架构图

1. 预备环境准备

  1. 64 bit OS Linux/Unix/Mac,推荐使用Linux系统。
  2. 64 bit JDK 1.8+。
  3. Maven 3.2.x+。
  4. 3个或3个以上Nacos节点才能构成集群。

2. 下载源码或者安装包

# 下载稳定版
wget https://github.com/alibaba/nacos/releases/download/1.3.0/nacos-server-1.3.0.tar.gz
tar -xvf nacos-server-1.3.0.tar.gz
cd nacos/bin

3. 配置集群配置文件

在nacos的解压目录nacos/的conf目录下,有配置文件cluster.conf,请每行配置成ip:port。(请配置3个或3个以上节点)

# ip:port
200.8.9.16:8848
200.8.9.17:8848
200.8.9.18:8848

4. 确定数据源

  1. 初始化 MySQL 数据库

在nacos/conf目录下有个nacos-mysql.sql文件,将sql导入mysql中

  1. 修改配置

修改nacos/conf/application.properties配置文件,添加数据源mysql数据源配置(目前只支持mysql),
添加mysql数据源的url、用户名和密码。

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=nacos
db.password=nacos
  1. 配置Nginx:
http {

   upstream cluster {
       server 200.8.9.16:8848;
       server 200.8.9.17:8848;
       server 200.8.9.18:8848;
   }

   

   server {
       listen 80;
       location / {
           proxy_pass http://cluster;
       }
   }
}
  1. 启动Nacos:
sh startup.sh
  1. 启动nginx

  2. 测试

访问192.168.159.121:1111
如果可以进入nacos的web界面,就证明安装成功了

Nacos客户端

Nacos作为注册中心

  1. pom中添加依赖
<!-- spring cloud Alibaba 注册中心 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  1. yaml中添加配置
spring:
  cloud:
      nacos:
          discovery:
              #nacos服务中心地址
              server-addr: 192.168.0.103:8848
  1. 添加注解
    在启动类上添加@EnableDiscoveryClient注解,注册到Nacos中心。
    alert "nacos客户端注解"

在springcloud E版本的时候,对服务注册进行了优化,在依赖了spring-cloud-starter-alibaba-nacos-discovery之后,不用添加@EnableDiscoveryClient注解,默认会将服务注册到注册中心。

  1. 查看服务

启动应用,打开nacos控制台,我们可以在服务列表中发现我们的服务。
alert "nacos服务列表"

  1. 服务的端点检查
    spring-cloud-starter-alibaba-nacos-discovery 在实现的时候提供了一个 EndPoint, EndPoint 的访问地址为 http://ip:port/actuator/nacos-discovery。 EndPoint 的信息主要提供了两类:
1、subscribe: 显示了当前有哪些服务订阅者
2、NacosDiscoveryProperties: 显示了当前服务实例关于 Nacos 的基础配置

通过浏览器访问 http://localhost:8080/actuator/nacos-discovery 结果如下:
alert '服务的端点检查'

Nacos作为配置中心

Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后才能保证项目的正常启动。

服务端配置

客户端读取按照命名规则的配置文件。

  1. Data Id的配置规则
${prefix}.${file-extension}
${prefix}-${spring.profiles.active}.${file-extension}

prefix 默认当前服务的服务名称
spring.profiles.active 环境配置
file-extension 就是当前文件的格式(后缀),目前只支持yaml和properties

  1. nacos配置和springboot配置对应关系

  1. NameSpace、Group、Data Id三者关系

类似包、类、方法之间的关系

Nacos默认命名空间是public,Namespace主要用来实现隔离

Group默认是DEFAULT_GROUP,Group可以将不同的配置进行分组。

Service就是微服务,一个service可以包含多个Cluster(集群),nacos默认Cluster是DEFAULT,cluster是对指定的微服务的一个虚拟划分。比方说为了容灾,将服务分别部署在广州机房和成都机房。这时广州机房所有的服务是一个集群,成都机房所有的服务是一个集群。

客户端配置

Spring Boot 配置文件的加载顺序,依次为 bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml ,其中 bootstrap.properties 配置为最高优先级。

  1. pom中添加依赖
<!-- spring cloud Alibaba 配置中心 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  1. yml中添加配置
    将配置文件的名字改为bootstrap.yml,指定配置中心的地址
spring:
  cloud:
      nacos:
          config:
              #nacos配置中心地址
              server-addr: 192.168.0.103:8848
              #指定配置文件的格式为yaml
              file-extension: yaml
              #指定命名空间
              namespace: fbf8c164-4646-454a-b58b-3131b939fbcc
              #指定分组
              group: DEV_GROUP
  profiles:
    active: dev            
  1. 配置的动态更新
    默认开启了动态更新,配置
    spring.cloud.nacos.config.enabled = false来关闭动态刷新。

测试:

@RestController
public class TestController {
	@Autowired
	private ConfigurableApplicationContext applicationContext;

	/**
	 * 配置的动态更新测试
	 * @return
	 */
	@GetMapping(value = "/test")
	public String test() {
		return "port:" +applicationContext.getEnvironment().getProperty("server.port");
	}
}

打开浏览器,访问http://localhost:8080/test,可观察修改值前后的变化

posted @ 2020-11-17 22:13  柳小白  阅读(407)  评论(0编辑  收藏  举报