nacos是什么
nacos是专为注册中心和配置中心而设计。它可以帮助您轻松构建云原生应用程序和微服务平台。当然其他的中间件也有很多,比如Zookeeper和Consul。
- 数据存储方式不同:Nacos采用基于数据库的方式,而Zookeeper和Consul使用内存数据结构。
- 功能区别:Nacos支持动态DNS和多数据中心。Zookeeper和Consul只支持服务发现和配置管理。
- 部署方式不同:Nacos可以通过Docker容器和Kubernetes等容器编排工具直接部署在云原生平台上,而Zookeeper和Consul需要手动安装和配置。
- 性能和可扩展性不同:Nacos相对于Zookeeper和Consul有更高的性能和可扩展性。
为什么需要配置中心
通常在后端开发中一旦服务上线如果遇到修改数据库配置、日志配置、环境配置会面临一个问题,我们需要重新打包发版上线,一套流程下来是很麻烦的。
通过配置中心的动态配置,我们可以在可视化页面直接调整即可。
为什么需要注册中心
在分布式微服务中,我们会用nacos来做服务的注册中心来方便管理,注册中心简而言之就是我们能知道服务的具体状态信息。
一旦某个节点宕机,nacos会自动注销当前实例,在集群的服务中选择健康的实例运行。
另外,保存了服务的信息,比如ip、端口、集群信息、配置数据、是否启动、健康状态等。
我们可以很简单的理解为服务注册和服务发现。
nacos注册的微服务为什么要集群
为了保证高可用性和可靠性。在单节点的情况下,如果该节点失效了,那么该微服务的注册信息将无法被其他微服务发现和调用,从而导致整个系统的不可用。
在集群中,某个节点不可用时nacos会负载均衡到对应的可用的节点。同时,通过集群的方式可以提高注册中心的性能和扩展性,满足高并发和大规模的微服务注册和发现需求。
安装nacos
在nacos安装,我们只要下载官网的zip文件后,执行bin下面的startup文件,默认会运行在8848端口,账号和密码为nacos。
在Nestjs集成nacos
js
pnpm install nacos-config nacos-naming
js
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { startNacos } from './nacos';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
startNacos();
await app.listen(3000);
}
bootstrap();
bootstrap是nest的主入口,我们在每个微服务中可以注入这个方法。
js
import { NacosConfigClient } from 'nacos-config';
import { NacosNamingClient } from 'nacos-naming';
const logger = console;
const serviceName = 'nest-user';
const ip = 'localhost';
const port = 3000;
const serverAddr = 'localhost:8848';
const namespace = '3c166fe6-b9c1-45d8-af04-0ade57db8265';
const group =
process.env.NODE_ENV === 'development' ? 'NEST_USER_DEV' : 'NEST_USER_PRO';
let config = {};
export const setConfig = (cf) => {
config = cf;
cf && console.log(`${serviceName}接受到nacos的消息`, JSON.parse(cf));
};
export const getConfig = () => {
return config;
};
export const startNacos = async () => {
const client = new NacosNamingClient({
logger,
serverList: serverAddr,
namespace,
});
await client.ready();
await client.registerInstance(
serviceName,
{
ip,
port,
},
group,
);
client.subscribe({ serviceName, groupName: group }, (hosts) => {
console.log('subscribe======', hosts);
});
watchNacos();
};
export const deregisterNacos = async (client) => {
await client.deregisterInstance(serviceName, {
ip,
port,
});
};
const watchNacos = async () => {
const configClient = new NacosConfigClient({
serverAddr,
namespace,
});
configClient.subscribe(
{
dataId: serviceName,
group,
},
async (content) => {
setConfig(content);
},
);
configClient.on('error', (err) => {
console.log('error =====', err);
});
};
注意我们要先启动nacos,然后运行nest项目。然后查看nacos的服务是否被注册
然后我们可以从控制台中看到定义logger后,此服务以5s的心跳包发送给nacos server。NacosNamingClient用于初始化服务注册,在NacosConfigClient我们可以获取配置中心的动态配置。
如果你的服务需要集群,那么我们可以client.registerInstance
实例化。namespace是我们的作用域,用来区分其他服务,每个微服务我们都需要定义一个namespace。在我们运行后,我们可以在nacos页面中找到
一般我们会区分不同的环境, 比如Group定义的开发环境名和生产环境名。
接下来我们试试动态配置, 这里使用的是json的配置格式,我们同样可以选择yaml和Properties。
这样我们就收到了消息,同时我们可以挂载在一个全局对象上方便更新。
总结
在springCloud中,nacos是高度集成的,在Nestjs我们也可以非常快速的集成,nacos提供了两个非常重要的功能:注册中心和配置中心,注册中心我们可以简单理解为服务注册和服务发现。
同时nacos在一致性上也是遵从主从复制的,在可用性上通过集群来保障,在分区容忍性上可以快速根据网络环境做分区来满足服务可用。