2、技术选型与架构设计:微服务架构(Spring Cloud)、服务注册与发现(Nacos)、配置中心、API网关(Gateway)、技术栈选型理由
好,咱们开始聊技术选型。
说实话,做券商交易中台,技术选型这一步特别关键。选错了,后面重构的成本高得吓人。我见过不少团队,一开始图省事用了单体架构,结果业务一复杂,改一个功能要重启整个系统,线上事故频发。嗯,咱们不能走那条路。
2.1 为什么必须是微服务架构?
券商交易中台,说白了就是处理订单、风控、清算、账户这些核心业务。它们之间耦合度很高,但又不适合放在一个锅里煮。
我个人习惯,把每个核心业务拆成独立的微服务。比如:
- 订单服务:负责接收、校验、路由订单
- 风控服务:做资金校验、持仓校验、黑白名单
- 清算服务:处理成交后的资金划转、持仓变更
- 账户服务:管理客户资产、交易权限
每个服务独立部署、独立扩展。你想想看,如果双十一行情火爆,订单量暴增,我只需要把订单服务多部署几台机器就行,其他服务不受影响。这就是微服务的核心价值。
核心原则:每个微服务只做一件事,并且做好。
2.2 Spring Cloud:为什么选它?
微服务框架选型,市面上有 Spring Cloud、Dubbo、gRPC 等。我为什么选 Spring Cloud?
- 生态成熟:Spring Cloud 整合了服务发现、负载均衡、熔断、网关等全套组件,开箱即用。
- 社区活跃:遇到问题,Stack Overflow 上基本都有答案。
- Java 技术栈统一:券商系统后端大多是 Java,用 Spring Cloud 可以复用团队已有的 Spring Boot 经验。
我在项目中遇到过一个问题:早期用 Dubbo,虽然 RPC 性能好,但它的服务治理能力偏弱,尤其是配置管理和网关这块,需要自己拼凑。后来切到 Spring Cloud,省了不少事。
2.3 服务注册与发现:Nacos 实战
微服务之间要互相调用,总不能把每个服务的 IP 地址写死在配置文件里吧?那太原始了。服务注册与发现就是解决这个问题的。
我推荐用 Nacos,而不是 Eureka 或 Consul。为什么?
- 支持 CP 和 AP 模式切换:券商系统对数据一致性要求高,我一般用 CP 模式。
- 自带配置中心:省得再搭一套 Apollo 或 Spring Cloud Config。
- 性能好:压测过,单机能扛住几千个服务实例的注册与心跳。
配置示例:
# application.yml
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.1.100:8848
namespace: trading-prod
config:
server-addr: 192.168.1.100:8848
file-extension: yaml
group: TRADING_GROUP
避坑指南:我曾经把 Nacos 的命名空间(namespace)搞混了,导致开发环境和生产环境的服务互相注册,线上出现了诡异的调用失败。后来强制规定:每个环境一个独立的命名空间,并且用配置文件隔离。
2.4 配置中心:统一管理,动态刷新
券商系统的配置项特别多:数据库连接、风控阈值、交易费率、接口开关……如果每次改配置都要重启服务,那运维得疯掉。
Nacos 配置中心支持动态刷新。我习惯把配置按维度拆分:
- 公共配置:所有服务共享的,比如数据库地址、Redis 地址
- 服务专属配置:每个服务自己的,比如订单服务的超时时间
- 灰度配置:只对部分实例生效,用于金丝雀发布
举个例子,风控阈值需要临时调整:
# nacos 配置中心中的配置
trading:
risk:
max-order-amount: 1000000 # 单笔最大订单金额
max-daily-loss: 5000000 # 每日最大亏损
修改后,服务端无需重启,几秒内自动生效。嗯,这个能力在券商这种高实时性场景下特别重要。
2.5 API 网关:Spring Cloud Gateway
网关是系统的入口,所有外部请求都经过它。我选 Spring Cloud Gateway,而不是 Zuul 1.x。
- 基于 WebFlux:非阻塞 IO,性能比 Zuul 高一个量级
- 路由灵活:支持路径、Header、参数等多种路由规则
- 内置限流、熔断:配合 Sentinel 或 Resilience4j 使用
网关的核心职责:
- 路由转发:把 /order/** 转发到订单服务,/risk/** 转发到风控服务
- 鉴权:校验 Token、API Key
- 限流:防止恶意刷单
- 日志记录:记录所有请求的入参、出参、耗时
配置示例:
spring:
cloud:
gateway:
routes:
- id: order-service
uri: lb://order-service
predicates:
- Path=/api/order/**
filters:
- StripPrefix=1
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 100
redis-rate-limiter.burstCapacity: 200
注意:网关不要做太多业务逻辑,否则会变成“大泥球”。我曾经见过一个团队把风控逻辑写在网关里,结果网关频繁重启,所有服务都挂了。网关只做路由和通用横切关注点,业务逻辑下沉到微服务里。
2.6 技术栈选型理由总结
咱们把整个技术栈梳理一下:
| 组件 | 选型 | 理由 |
|---|---|---|
| 微服务框架 | Spring Cloud | 生态成熟,与 Spring Boot 无缝集成 |
| 服务注册与发现 | Nacos | 支持 CP/AP 切换,自带配置中心 |
| 配置中心 | Nacos Config | 动态刷新,支持灰度配置 |
| API 网关 | Spring Cloud Gateway | 非阻塞 IO,性能好,路由灵活 |
| 负载均衡 | Spring Cloud LoadBalancer | 替代 Ribbon,支持响应式 |
| 熔断降级 | Sentinel | 流量控制、熔断降级、系统保护 |
| 分布式事务 | Seata | 支持 AT、TCC、Saga 模式 |
你可能会问:为什么不用 Kubernetes 原生服务发现?嗯,K8s 的 Service 确实能做服务发现,但它的粒度太粗,而且不支持健康检查的灵活配置。在券商这种对稳定性要求极高的场景下,Nacos 的精细化控制更合适。
2.7 架构总览图
下面这张图,是我画的一个简化版架构。它展示了请求从客户端到网关,再到各个微服务的流转路径。
这张图里,客户端请求先到网关,网关从 Nacos 获取服务实例列表,然后路由到具体的微服务。每个微服务启动时,都会向 Nacos 注册自己。微服务之间如果需要互相调用,也通过 Nacos 做服务发现。
一句话总结:Nacos 是“通讯录”,网关是“前台接待”,微服务是“业务部门”。各司其职,系统才能稳定高效。
好了,技术选型和架构设计就聊到这儿。这套方案我在多个券商项目中验证过,扛过日均千万笔订单的峰值。你照着搭,基本不会踩大坑。
公众号:蓝海资料掘金营,微信deep3321