Nestjs结合Nacos实现配置中心和注册中心

nacos是什么

nacos是专为注册中心和配置中心而设计。它可以帮助您轻松构建云原生应用程序和微服务平台。当然其他的中间件也有很多,比如Zookeeper和Consul。

  1. 数据存储方式不同:Nacos采用基于数据库的方式,而Zookeeper和Consul使用内存数据结构。
  2. 功能区别:Nacos支持动态DNS和多数据中心。Zookeeper和Consul只支持服务发现和配置管理。
  3. 部署方式不同:Nacos可以通过Docker容器和Kubernetes等容器编排工具直接部署在云原生平台上,而Zookeeper和Consul需要手动安装和配置。
  4. 性能和可扩展性不同: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在一致性上也是遵从主从复制的,在可用性上通过集群来保障,在分区容忍性上可以快速根据网络环境做分区来满足服务可用。

相关推荐
康小汪5 小时前
AI 写 Vue 总写成同一个味道:给它装 Skills,装的不是知识是边界
前端·vue.js·人工智能·ai编程·最佳实践
智能运维指南6 小时前
研制过程“两张皮“怎么破:研制一体化支撑平台的定位、能力边界与落地前提
java·前端·人工智能·嘉为蓝鲸
白山编程大哥7 小时前
Java 后端如何优雅地把 List 集合返回给前端
java·前端·list
Flynt8 小时前
我把热榜那篇"禁用 axios"逐条实测了一遍:结论大体对,坑在它没讲的地方
前端·javascript·axios
Csvn9 小时前
bundle优化
前端
北冥有鱼9 小时前
发版后动态路由点击报 `Failed to fetch dynamically imported module`」问题上的完整排查与修复过程
前端·vue.js
静默回滚9 小时前
视频压到 25 MB 以内,码率要算、音轨要扣、余量要留
前端
用户37203749260189 小时前
把 10MB 中文语义模型塞进浏览器:STSB 做到教师模型的 93%,但线上 top1 只有 42%
前端
光锥智能9 小时前
海康机器人举行2026移动机器人新品发布会:箱式存拣升级,「明智」系列发布
java·前端·机器人
计算机魔术师9 小时前
Anthropic 上市文件最吓人的一幕,不是亏损 807 亿
前端