第三章 技术选型与框架: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服务。到时候咱们动手写代码,把理论落到实处。