2. 微服务核心组件选型:我的实战经验与避坑指南

好,咱们接着聊。上一章我们把OA系统拆成了几个微服务,但服务拆开了,怎么互相找到对方?配置改了怎么同步?请求从哪进?这章我就结合自己踩过的坑,聊聊这三个核心组件的选型。

2.1 服务注册与发现:Nacos vs Eureka

服务注册与发现,说白了就是让A服务能自动找到B服务的地址。没有它,你就得手动配IP和端口,那运维起来简直要命。

我个人习惯,新项目首选Nacos。为什么?

  • 功能更全:Nacos不光做注册中心,还能当配置中心。一个组件干两件事,省心。
  • 支持CP+AP:Eureka只保证AP(可用性+分区容错),不保证CP(一致性)。Nacos可以切换,关键场景下我更放心。
  • 健康检查更灵活:Eureka是靠心跳续约,Nacos支持TCP、HTTP、MySQL等多种方式。

Eureka什么时候用?

嗯,如果你维护的是老项目,或者团队对Spring Cloud Netflix那一套特别熟,Eureka也不是不能用。但你要知道,Eureka 2.0已经停止开发了,说白了就是被放弃了。

避坑指南:我曾经在一个金融项目中用过Eureka,结果遇到网络分区,服务列表一直不更新,导致调用报错。后来换成Nacos,配合健康检查,问题就解决了。

选型对比表

特性 Nacos Eureka
一致性 支持CP/AP切换 仅AP
配置中心 内置 需额外集成
健康检查 多种方式 心跳为主
社区活跃度 高(阿里维护) 低(已停更)

代码示例:Nacos客户端配置

spring:
  application:
    name: oa-user-service
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.1.100:8848
        namespace: dev
      config:
        server-addr: 192.168.1.100:8848
        file-extension: yaml

你看,配置就这么简单。服务启动后,自动注册到Nacos,其他服务通过服务名就能调用。

2.2 配置中心:Apollo vs Nacos

配置中心,说白了就是集中管理所有服务的配置。改了配置不用重启服务,这才是微服务该有的样子。

我建议,如果配置变更频繁、需要灰度发布,选Apollo。如果追求轻量、和Nacos注册中心一起用,选Nacos Config。

Apollo的优势

  • 配置管理界面强大:支持配置的版本管理、灰度发布、权限控制。
  • 实时生效:改了配置,客户端秒级感知。
  • 支持多环境:开发、测试、生产环境隔离得很清楚。

Nacos Config的优势

  • 部署简单:和Nacos注册中心共用一套服务,少维护一个组件。
  • 学习成本低:配置方式和Spring Cloud Config很像,上手快。
个人经验:我在一个电商项目中用过Apollo,当时有几百个配置项,需要按业务线分组管理。Apollo的命名空间和权限控制帮了大忙。但如果你只是几十个配置,Nacos完全够用。

选型建议

  • OA系统配置不多,且已经用了Nacos做注册中心 → 直接用Nacos Config
  • 配置复杂、需要精细化管理 → 上Apollo

2.3 API网关:Gateway vs Kong

API网关是系统的入口,所有外部请求都先经过它。它负责路由、鉴权、限流、日志等。

我个人习惯,Java技术栈首选Spring Cloud Gateway。非Java技术栈或者需要高性能网关,选Kong。

Spring Cloud Gateway

  • 和Spring生态无缝集成:写个过滤器就能实现鉴权、限流。
  • 响应式编程:基于WebFlux,性能不错。
  • 配置灵活:支持路由规则动态配置。

Kong

  • 高性能:基于OpenResty(Nginx + Lua),处理能力很强。
  • 插件丰富:认证、限流、日志等插件开箱即用。
  • 独立部署:不依赖Java环境,运维更简单。

代码示例:Gateway路由配置

spring:
  cloud:
    gateway:
      routes:
        - id: oa-user-service
          uri: lb://oa-user-service
          predicates:
            - Path=/api/user/**
          filters:
            - StripPrefix=1
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 10
                redis-rate-limiter.burstCapacity: 20

你看,路由到用户服务,还加了限流。配置起来很直观。

避坑指南:我曾经在Gateway中写了一个复杂的鉴权过滤器,结果因为阻塞操作导致性能下降。后来改成异步方式,问题才解决。记住,Gateway里不要做耗时操作。

选型对比表

特性 Spring Cloud Gateway Kong
技术栈 Java(WebFlux) OpenResty(Lua)
性能 中等
扩展性 通过过滤器 通过插件
运维复杂度 低(集成在Spring中) 中(需独立部署)

好了,这一章的核心选型就聊到这。你想想看,选对了组件,后面开发会省很多事。下一章我们聊聊服务间的通信和容错,那又是另一番天地了。