第三章 技术选型与框架:Spring Boot基础、Spring Cloud组件选型、服务注册与发现(Nacos)、配置中心(Apollo)

好,咱们进入第三章。这一章我打算聊聊技术选型。说白了,就是决定用哪些框架和中间件来搭起CRM系统的骨架。

很多新手容易犯一个毛病:看到新技术就往上堆。我早期带团队时也吃过这个亏,项目搞得又重又复杂。后来我学乖了——选型不是选最火的,而是选最合适的。

3.1 Spring Boot基础:微服务的起点

Spring Boot,现在几乎是Java微服务的标配了。为什么?因为它把Spring那一套繁琐的配置给简化了。

我个人习惯,每个微服务模块都从Spring Boot起步。你想想看,以前用Spring搭一个Web项目,要配XML、配web.xml、配数据源……没半天搞不定。现在呢?一个@SpringBootApplication注解,加几行配置,完事。

核心要点:Spring Boot不是新技术,而是对Spring的封装。它帮你做了80%的默认配置,你只需要关注那20%的业务定制。

举个例子,CRM系统中的用户模块,我通常会这样起步:

@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}

嗯,这里要注意:@EnableDiscoveryClient是让服务注册到Nacos用的。后面会细讲。

3.2 Spring Cloud组件选型:别贪多

Spring Cloud全家桶里组件很多。但CRM系统不是大厂那种超大规模,选多了反而累赘。

我建议这样选:

组件 用途 我的建议
Nacos 服务注册与发现 必选,替代Eureka
Apollo 配置中心 必选,比Spring Cloud Config好用
OpenFeign 服务间调用 必选,声明式HTTP客户端
Gateway API网关 必选,替代Zuul
Sentinel 流量控制 可选,高并发场景才需要

为什么不用Eureka?我遇到过Eureka在频繁网络抖动时出现脑裂问题。Nacos在这方面稳定得多。

3.3 服务注册与发现:Nacos实战

服务注册与发现,说白了就是让各个微服务能互相找到对方。没有它,服务间调用就得写死IP和端口——那还叫什么微服务?

Nacos的安装很简单。下载压缩包,解压,启动:

sh startup.sh -m standalone

然后访问 http://localhost:8848/nacos,默认账号密码都是nacos。

在Spring Boot中集成Nacos,需要加依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

配置文件里这样写:

spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

避坑指南:我曾经把Nacos部署在公网服务器上,结果发现服务注册总是超时。后来排查发现是防火墙没开8848端口。嗯,这种低级错误,犯一次就记住了。

启动服务后,去Nacos控制台看看。在「服务管理」里能看到注册上来的服务。如果看不到,检查一下网络和配置。

3.4 配置中心:Apollo的妙用

配置中心解决什么问题?你想想看,CRM系统有几十个微服务,每个服务都有配置文件。如果某个数据库连接串要改,难道要逐个服务修改、重启?

Apollo就是干这个的。它让你能动态修改配置,实时生效,不需要重启服务。

我为什么选Apollo而不是Spring Cloud Config?

  • Apollo有可视化界面,操作直观
  • 支持配置的灰度发布
  • 配置修改有审计日志
  • 性能好,客户端有缓存

集成Apollo也很简单。先在Apollo上创建项目,拿到AppId。然后在代码里加依赖:

<dependency>
    <groupId>com.ctrip.framework.apollo</groupId>
    <artifactId>apollo-client</artifactId>
    <version>1.9.1</version>
</dependency>

配置文件中指定Apollo地址:

app.id: user-service
apollo:
  meta: http://localhost:8080
  bootstrap:
    enabled: true
    namespaces: application

然后在代码里使用@Value注解获取配置:

@Value("${db.url}")
private String dbUrl;

当你在Apollo后台修改db.url的值,应用会实时感知到变化。

注意:Apollo的配置热更新只对@Value注解的字段有效。如果你在@Bean方法里读取配置,需要加@RefreshScope注解。我刚开始用的时候就踩过这个坑,配置改了但Bean没刷新,排查了半天。

3.5 小结:选型不是终点

技术选型只是第一步。真正重要的是,你理解这些组件在CRM系统中扮演什么角色。

Nacos负责让服务互相找到,Apollo负责让配置灵活可控,Spring Boot负责让开发更高效。这三者配合起来,CRM系统的微服务架构就有了稳固的基础。

下一章,我会讲如何用这些组件搭建一个完整的CRM服务。到时候咱们动手写代码,把理论落到实处。