Nacos解决的两个核心问题:动态配置管理和服务注册发现。
应用程序在启动和运行的时候往往需要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期,比如:数据库连接参数、启动参数等。配置主要有以下几个特点:
配置是独立于程序的只读变量:
配置对于程序是只读的,程序通过读取配置来改变自己的行为,但是程序不应该去改变配置。
配置伴随应用的整个生命周期:
配置贯穿于应用的整个生命周期,应用在启动时通过配置来初始化,在运行时根据配置调整行为。比如:启动时需要读取服务的端口号、系统在运行过程中需要读取定时策略执行定时任务等。
配置可以有多种加载方式:
常见的有程序内部hard code,配置文件,环境变量,启动参数,基于数据库等。
配置需要治理:
同一份程序在不同的环境(开发、测试,生产)、不同的集群(如不同的数据中心)经常需要有不同的配置,所以需要有完善的环境,集群配置管理。
在微服务架构中,当系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移(分割),这样配置就分散了,不仅如此,分散中还包含着冗余,如下图:
下图显示了配置中心的功能,配置中心将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置。
目前市面上面用的比较多的配置中心有:Spring Cloud Config、Apollo、Nacos和Disconf等。由于Disconf不再维护,下面主要对比一下Spring Cloud Config、Apollo和Nacos.
Nacos是阿里的一个开源产品,它是针对微服务架构中的服务发现、配置管理、服务治理的综合性解决方案。官方介绍如下:
官网地址:https://nacos.io
Nacos主要提供以下四大功能:
Nacos依赖Java环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置Maven 环境,请确保是在以下版本环境中安装使用:
1.64bit OS,支持Linux/Unix/Mac/Windows,推荐使用Linux/Unix/Mac.
2.64bit JDk1.8+;
3.Maven3.2.x+;
你可以通过源码和发行包两种方式来获取Nacos。
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目录下有启动的命令脚本。
Nacos的默认端口号是8848,需要保证默认端口没有被其他进程占用。
进入安装程序的bin目录:点击启动程序的命令脚本文件即可。
启动后的界面:
以上是windows下的启动方式。
sh startup.sh -m standalone
bash startup.sh -m standalone
Linux/Unix/Mac方式:
sh shutdown.sh
Windows方式:
cmd shutdown.cmd
或者双击shutdown.cmd运行文件。
单机模式时nacos默认使用嵌入式数据库实现数据的存储,若想使用外部mysql存储nacos数据,需要进行以下步骤:
spring.datasource.platform=mysqldb.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
在项目添加依赖:
com.alibaba.nacos nacos-client 1.2.0
参考示例:
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 timeoutMsString 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();}}}
}
对于Nacos配置管理,通过Namespace、group、Data ID能够定位到一个配置集。
监听查询:Nacos提供配置订阅者即监听者查询能力,同时提供客户端当前配置的MD5效验值,以便帮助用户更好的检查配置变更是否推送到Client端。
Nacos当前版本支持简单的登录功能,默认用户名/密码为:nacos/nacos
修改默认用户名/密码方法:
org.springframework.security spring-security-core 5.3.1.RELEASE
编写加密类,生成加密后的密码,采用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集中管理多个服务的配置:
服务发现是指使用一个注册中心来记录分布式系统中的全部服务的信息,以便其他服务能够快速的找到这些已注册的服务。我们的代码可以通过读取配置文件的方式读取服务生产房网络位置。如下:
负载均衡就是将用户请求(流量)通过一定的策略,分摊在多个服务实例上执行,它是系统处理高并发、缓解网络压力和进行服务端扩容的重要手段之一。分为服务端负载均衡和客户端负载均衡。
上一篇:Pandas数据操作详解-总结
下一篇:支付宝:直播上演“就业风云”