Nacos解决的两个核心问题:动态配置管理和服务注册发现。
1、Nacos-配置管理:
1.1什么是配置:
应用程序在启动和运行的时候往往需要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期,比如:数据库连接参数、启动参数等。配置主要有以下几个特点:
-
配置是独立于程序的只读变量:
配置对于程序是只读的,程序通过读取配置来改变自己的行为,但是程序不应该去改变配置。 -
配置伴随应用的整个生命周期:
配置贯穿于应用的整个生命周期,应用在启动时通过配置来初始化,在运行时根据配置调整行为。比如:启动时需要读取服务的端口号、系统在运行过程中需要读取定时策略执行定时任务等。 -
配置可以有多种加载方式:
常见的有程序内部hard code,配置文件,环境变量,启动参数,基于数据库等。 -
配置需要治理:
同一份程序在不同的环境(开发、测试,生产)、不同的集群(如不同的数据中心)经常需要有不同的配置,所以需要有完善的环境,集群配置管理。
1.2什么是配置中心:
在微服务架构中,当系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移(分割),这样配置就分散了,不仅如此,分散中还包含着冗余,如下图:
下图显示了配置中心的功能,配置中心将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置。
2、Nacos简介:
2.1主流配置中对比:
目前市面上面用的比较多的配置中心有:Spring Cloud Config、Apollo、Nacos和Disconf等。由于Disconf不再维护,下面主要对比一下Spring Cloud Config、Apollo和Nacos.
2.2.Nacos简介:
Nacos是阿里的一个开源产品,它是针对微服务架构中的服务发现、配置管理、服务治理的综合性解决方案。官方介绍如下:
官网地址:https://nacos.io
2.3.Nacos特性:
Nacos主要提供以下四大功能:
- 服务发现和服务健康监测:
Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&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 统计数据。
3、Nacos快速入门:
3.1.1预备环境准备:
Nacos依赖Java环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置Maven 环境,请确保是在以下版本环境中安装使用:
1.64bit OS,支持Linux/Unix/Mac/Windows,推荐使用Linux/Unix/Mac.
2.64bit JDk1.8+;
3.Maven3.2.x+;
3.1.2下载源码或者安装包:
你可以通过源码和发行包两种方式来获取Nacos。
- 从Github上下载源码方式:
git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos clean install -U
ls -al distribution/target/
// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin
经过一段时间的构建后,在.nacos\distribution\bin目录下有启动的命令脚本。
- 下载编译后压缩包方式:
下载地址:https://github.com/alibaba/nacos/releases
下载后解压即可。
3.1.3.启动服务器:
Nacos的默认端口号是8848,需要保证默认端口没有被其他进程占用。
进入安装程序的bin目录:点击启动程序的命令脚本文件即可。
启动后的界面:
以上是windows下的启动方式。
- Linux/Unix/Mac启动方式:
启动命令(standalone代表着单机模式运行,非集群模式):sh startup.sh -m standalone
如果使用的ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:bash startup.sh -m standalone
启动成功,可通过浏览器访问http://localhost:8848/nacos,打开如下nacos控制台登录页面:
使用默认用户名:nacos,默认密码:nacos登录即可打开主页面。
3.1.4.关闭服务器:
Linux/Unix/Mac方式:
sh shutdown.sh
Windows方式:
cmd shutdown.cmd
或者双击shutdown.cmd运行文件。
3.1.5.外部mysql数据库支持:
单机模式时nacos默认使用嵌入式数据库实现数据的存储,若想使用外部mysql存储nacos数据,需要进行以下步骤:
- 安装数据库,版本要求:5.6.5+,MySql8以下
- 初始化mysql数据库,新建数据库nacos_config,数据库初始化文件:${nacoshome}/conf/nacos-mysql.sql
- 修改nacos的${nacoshome}/conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的URL、用户名和密码。
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root1
db.password=admin1
3.2.1.Nacos发布配置:
3.2.2.nacos客户端获取配置:
在项目添加依赖:
<dependencies>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.2.0</version>
</dependency>
参考示例:
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;
import java.util.Properties;
import java.util.concurrent.Executor;
public class SimpleDemoMain {
public static void main(String[] args) throws NacosException {
//使用nacos client远程获取服务上的配置信息
//nacos server地址
String serverAddr="172.168.1.44:8848";
String namespace="f851f0b8-928f-4ab7-a668-075b69a007e5";
String dataId="nacos-simple-demo.yaml";
String group="DEFAULT_GROUP";
Properties properties=new Properties();
properties.put("serverAddr",serverAddr);
properties.put("namespace",namespace);
//获取配置
ConfigService configService= NacosFactory.createConfigService(properties);
//String dataId, String group, long timeoutMs
String config=configService.getConfig(dataId,group,5000);
System.out.println(config);
configService.addListener(dataId, group, new Listener() {
public Executor getExecutor() {
return null;
}
//当配置有变化的时候获取通知
public void receiveConfigInfo(String s) {
System.out.println(s);
}
});
while (true){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
4、Nacos配置管理基础应用
4.1.Nacos配置管理模型:
对于Nacos配置管理,通过Namespace、group、Data ID能够定位到一个配置集。
- 命名空间:
用来做不同维度的隔离,比如一个命名空间下是一个单独模块(订单模块,用户模块等),或者一个命名空间下是一组环境(开发,测试,生产等)。 - 配置分组:
包括一组配置集,也就是多个配置集,可以用来做不同环境的配置隔离。 - 配置集:
多种不同类型的配置信息的集合称之为配置集,比如Redis、MySQL等等不同类型的配置信息都写在了一起,就称它们为一个配置集,那么对应系统中,其实一个配置文件通常就是一个配置集 - 配置集 ID:
类似于系统中配置文件的文件名,配置集 ID 在同一个配置分组中是唯一的。
那么在这里,整个划分就是:使用命名空间区分业务模块,使用配置分组来区分不同环境。
最佳实践:
Nacos抽象定义了Namesapce、Group、Data ID的概念,具体这几个概念代表什么,取决于我们把它们看成什么,推荐一种比较容易理解的用法,如下图:
Namespace:代表不同环境,如开发,测试,生成环境。
Group:代表某项目,如XX电商项目。
DataId:每个项目下往往有若干个工程,每个配置集(DataID)是一个工程的主配置文件。
4.2.配置管理:
监听查询:Nacos提供配置订阅者即监听者查询能力,同时提供客户端当前配置的MD5效验值,以便帮助用户更好的检查配置变更是否推送到Client端。
4.3.登录管理:
Nacos当前版本支持简单的登录功能,默认用户名/密码为:nacos/nacos
修改默认用户名/密码方法:
- 生成加密密码:
在项目中引入依赖:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>5.3.1.RELEASE</version>
</dependency>
编写加密类,生成加密后的密码,采用BCrypt加密方法在每次生成密码时会加随机盐,所以生成密码每次可能不一样:
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
public class PasswordEncodeUtil {
public static void main(String[] args) {
String admin=new BCryptPasswordEncoder().encode("admin");
System.out.println(admin);
}
}
将生成的密码添加到对应的数据库中即可:
- 关闭登录功能:
由于部分公司自己开发控制台,不希望被nacos的安全filter拦截。因此支持定制关闭登录功能找到配置文件${nacoshome}/conf/application.properties,替换以下内容即可。
5.Nacos配置管理应用于分布式系统
5.1.分布式应用配置管理:
下图展示了如何通过Nacos集中管理多个服务的配置:
- 用户通过Nacos Server的控制台集中对多个服务的配置进行管理。
- 各服务统一从Nacos Server中获取各自的配置,并监听配置的变化。
6、Nacos服务发现
6.1.服务发现的概念:
服务发现是指使用一个注册中心来记录分布式系统中的全部服务的信息,以便其他服务能够快速的找到这些已注册的服务。我们的代码可以通过读取配置文件的方式读取服务生产房网络位置。如下:
6.2.负载均衡的概念:
负载均衡就是将用户请求(流量)通过一定的策略,分摊在多个服务实例上执行,它是系统处理高并发、缓解网络压力和进行服务端扩容的重要手段之一。分为服务端负载均衡和客户端负载均衡。
- 服务器端负载均衡:
例如Nginx,通过Nginx进行负载均衡,先发送请求,然后通过负载均衡算法,在多个服务器之间选择一个进行访问;即在服务器端再进行负载均衡算法分配。 - 客户端负载均衡:
例如spring cloud中的ribbon,客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这是客户端负载均衡;即在客户端就进行负载均衡算法分配。