很开心,换掉 Nacos 后服务器内存省下很多!


前言

如题,最近打算在项目中引入 Grafana + Prometheus 作为数据监控,用来监控服务接口调用次数以及重点接口耗时等情况,这个后续做完会出一篇教程。

我们还是先看看替换之后的结果(旧的截图忘记截了),可以看到目前所有中间件加两个项目模块启动后内存占用是 2.5g,这个是什么概念呢,在之前用 Nacos 时总的内存占用达到了 3.6 g,也就是说只换掉了一个 Nacos 就节省了 1g 的内存,这 1g 内存你去部署个博客都绰绰有余了:

而且还有一个可怕的一点是,之前我的中间件如 Redis,Mysql,Nacos 都是 Docker 方式部署,比较方便,并且呢对容器的内存大小作了限制,容器如果运行内存超过限制就被扼杀掉,保证系统不会崩掉。说重点,之前通过 docker stats 查看容器占用情况,Nacos 是一直稳定在 1g 左右的(限制最大为 1.5g),所以现在来看,Consul 几乎是不占内存的 ??,神奇,相见恨晚呐。

我现在只有一台服务器,配置是 2c 4g 的,和公司分的 8c 16g 根本没法比,但是我只需要部署的模块只有两个,一个聚合服务,一个网关服务。所以需求其实不高。但是我发现了一个问题,就是 Nacos 的占用实在是太高了,然后我们继续来看下面 Nacos 的特点和功能。

Nacos

优点

  1. 多功能集成:Nacos 集成了服务发现、配置管理和动态 DNS 服务,功能非常全面。
  2. 简单易用:Nacos 提供简单的 API 和用户界面,易于使用和管理。
  3. 健康检查:支持多种健康检查方式,包括 HTTP、TCP 和自定义脚本。
  4. 动态配置管理:支持分布式配置管理,支持配置的实时推送和灰度发布。
  5. 多种数据存储支持:支持 MySQL、嵌入式数据库等多种存储方式,便于灵活选择。

缺点

  1. 成熟度:相对于 Consul,Nacos 的成熟度和社区支持可能稍逊一筹。
  2. 性能和扩展性:在高并发、大规模场景下,Nacos 的性能和扩展性可能需要进一步优化。
  3. 依赖性:Nacos 依赖于 MySQL 等外部存储,增加了系统复杂性。

我们可以看到 Nacos 的一个很大的缺点就是性能比较低,或者说比较重,当然我不是说 Nacos 不好,对于新手来说,一套 Spring Cloud Alibaba 系列下的中间件都是非常兼容的,对于初学微服务来说非常的好使。

然而,Consul 由于是更加面向国际的开源项目,它的功能也非常全面,且弊端很小,所以我就考虑了使用 Consul 来替换 Nacos,毕竟它也兼容 Spring Cloud。下面还是先介绍一下 Consul。

Consul

Consul 是 HashiCorp 提供的一款开源工具,主要用于服务发现和配置管理,具有强大的分布式特性和高可用性。

优点

  1. 成熟稳定:Consul 经过多年的发展,已经非常成熟和稳定,广泛应用于生产环境。
  2. 高可用和分布式:Consul 采用 Raft 协议,保证了分布式系统的一致性和高可用性。
  3. 多数据中心支持:支持多数据中心的服务发现和配置管理,适用于复杂的分布式系统。
  4. 丰富的健康检查:支持多种健康检查方式,包括 HTTP、TCP 和自定义脚本。
  5. 强大的生态系统:Consul 具有丰富的插件和工具生态,易于与其他系统集成。

缺点

  1. 学习曲线:Consul 的配置和管理相对复杂,学习曲线较陡。
  2. 功能单一:Consul 主要专注于服务发现和配置管理,功能相对单一。
  3. 存储依赖:Consul 依赖于其内置的存储系统(基于 Raft 协议),在某些情况下可能不如外部存储灵活。

一看到缺点,我们会想到学习曲线抖?你是说一个换掉 Nacos 的 pom 依赖,再改一下配置文件的 Consul 开放端口算难度高?好吧,其实要复杂点,你再配置个 ACL,再配置用户认证,那确实会难度陡增,然而,Nacos 不也一样,如果你要用复杂的功能。而且对于我们这种小项目,最重要的就是功能和业务展示,也不会说遇到各种乱七八糟的错误,所以换掉 Nacos 对于我们来说非常的划算。如果之后做项目,我同样选择 Consul。

关于如何部署 Consul

  1. 参考官方文档,选择一种方式部署即可。参考:Install Consul | Consul | HashiCorp Developer
  2. Pom 依赖
    <dependency>
        <groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-consul-discovery</artifactId>
    </dependency>
  3. 项目中的配置文件,你可以参考下面这种:
    spring
      cloud:
        consul:
          host: localhost
          port: 8500
          discovery: # 指定注册对外暴露的服务名称
            service-name: ${spring.application.name}

这篇文档并不是专门的配置教程,而且也不难,主要是希望你在选择中间件时多考虑自己的需要,合适最好!

接下来,我将着手引入 Prometheus 和 Grafana,尽情期待!


文章作者: KTpro
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 KTpro !
  目录