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在一致性上也是遵从主从复制的,在可用性上通过集群来保障,在分区容忍性上可以快速根据网络环境做分区来满足服务可用。

相关推荐
我这一生如履薄冰~10 分钟前
css属性pointer-events: none
前端·css
brzhang16 分钟前
A2UI:但 Google 把它写成协议后,模型和交互的最后一公里被彻底补全
前端·后端·架构
coderHing[专注前端]25 分钟前
告别 try/catch 地狱:用三元组重新定义 JavaScript 错误处理
开发语言·前端·javascript·react.js·前端框架·ecmascript
UIUV41 分钟前
JavaScript中this指向机制与异步回调解决方案详解
前端·javascript·代码规范
momo10041 分钟前
IndexedDB 实战:封装一个通用工具类,搞定所有本地存储需求
前端·javascript
liuniansilence41 分钟前
🚀 高并发场景下的救星:BullMQ如何实现智能流量削峰填谷
前端·分布式·消息队列
再花41 分钟前
在Angular中实现基于nz-calendar的日历甘特图
前端·angular.js
GISer_Jing1 小时前
今天看了京东零售JDS的保温直播,秋招,好像真的结束了,接下来就是论文+工作了!!!加油干论文,学&分享技术
前端·零售
Mapmost1 小时前
【高斯泼溅】如何将“歪头”的3DGS模型精准“钉”在地图上,杜绝后续误差?
前端
废春啊2 小时前
前端工程化
运维·服务器·前端