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有更高的性能和可扩展性。

为什么需要配置中心

通常在后端开发中一旦服务上线如果遇到修改数据库配置、日志配置、环境配置会面临一个问题,我们需要重新打包发版上线,一套流程下来是很麻烦的。

通过配置中心的动态配置,我们可以在可视化页面直接调整即可。

image.png

为什么需要注册中心

在分布式微服务中,我们会用nacos来做服务的注册中心来方便管理,注册中心简而言之就是我们能知道服务的具体状态信息。

一旦某个节点宕机,nacos会自动注销当前实例,在集群的服务中选择健康的实例运行。

另外,保存了服务的信息,比如ip、端口、集群信息、配置数据、是否启动、健康状态等。

我们可以很简单的理解为服务注册和服务发现。

nacos注册的微服务为什么要集群

为了保证高可用性和可靠性。在单节点的情况下,如果该节点失效了,那么该微服务的注册信息将无法被其他微服务发现和调用,从而导致整个系统的不可用。

在集群中,某个节点不可用时nacos会负载均衡到对应的可用的节点。同时,通过集群的方式可以提高注册中心的性能和扩展性,满足高并发和大规模的微服务注册和发现需求。

image.png

安装nacos

在nacos安装,我们只要下载官网的zip文件后,执行bin下面的startup文件,默认会运行在8848端口,账号和密码为nacos。

image.png

在Nestjs集成nacos

pnpm install nacos-config nacos-naming
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的主入口,我们在每个微服务中可以注入这个方法。

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的服务是否被注册

image.png

然后我们可以从控制台中看到定义logger后,此服务以5s的心跳包发送给nacos server。NacosNamingClient用于初始化服务注册,在NacosConfigClient我们可以获取配置中心的动态配置。

如果你的服务需要集群,那么我们可以client.registerInstance实例化。namespace是我们的作用域,用来区分其他服务,每个微服务我们都需要定义一个namespace。在我们运行后,我们可以在nacos页面中找到

image.png

一般我们会区分不同的环境, 比如Group定义的开发环境名和生产环境名。

image.png

接下来我们试试动态配置, 这里使用的是json的配置格式,我们同样可以选择yaml和Properties。

image.png

这样我们就收到了消息,同时我们可以挂载在一个全局对象上方便更新。

image.png

总结

在springCloud中,nacos是高度集成的,在Nestjs我们也可以非常快速的集成,nacos提供了两个非常重要的功能:注册中心和配置中心,注册中心我们可以简单理解为服务注册和服务发现。

同时nacos在一致性上也是遵从主从复制的,在可用性上通过集群来保障,在分区容忍性上可以快速根据网络环境做分区来满足服务可用。

猜你喜欢

转载自juejin.im/post/7264922511883780108