很多 Java 项目一谈架构,就开始堆技术栈:Spring Cloud、Kafka、Redis、分库分表、微服务。 结果代码越写越多,依赖越来越乱:Controller 直接调 Mapper,Service 里塞满业务逻辑,领域模型变成贫血对象,换个数据库要改半个系统。
Java 架构的核心,从来不是“用了多少中间件”,而是依赖方向有没有管住。 下面用 20 行代码,搭一个最小六边形架构,把这件事说清楚。
六边形架构,也叫端口适配器架构。它只强调一件事:
用文字表示就是:
入站适配器 -> 应用服务 -> 端口 <- 出站适配器业务代码只认识端口,不认识 MySQL、Redis、Spring。
下面代码用纯 Java 写,不依赖任何框架。它模拟“下单”用例:应用服务校验金额,然后通过端口保存订单。
import java.util.*;
interface OrderRepository { void save(Order order); }
record Order(String id, int amount) {}
class PlaceOrderService {
private final OrderRepository orders;
PlaceOrderService(OrderRepository orders) { this.orders = orders; }
void place(String id, int amount) {
if (amount <= 0) throw new IllegalArgumentException("金额必须大于0");
orders.save(new Order(id, amount));
}
}
class InMemoryOrderRepository implements OrderRepository {
private final Map<String, Order> db = new HashMap<>();
public void save(Order order) { db.put(order.id(), order); }
}
public class Main {
public static void main(String[] args) {
OrderRepository repo = new InMemoryOrderRepository();
new PlaceOrderService(repo).place("A001", 100);
System.out.println("下单成功");
}
}代码很短,但架构关系已经完整:
OrderRepository 是出站端口;InMemoryOrderRepository 是出站适配器;PlaceOrderService 是应用服务,只依赖端口;Main 是组合根,负责装配具体实现。如果换成 MySQL,只需要新增一个 JpaOrderRepository,PlaceOrderService 一行不用改。
如果换成 REST 入口,只需要新增 Controller,应用服务仍然不变。
上面只是骨架,企业级 Java 架构还要补齐:
真正的企业级架构,不是一上来就微服务,而是先把边界和依赖方向管住。
new 具体实现。Java 架构的起点,不是引入多少中间件,而是把依赖方向管住。 上面 20 行代码,先跑通它,再逐步叠加模块、权限、事务、缓存、消息和监控。
代码可以少,但依赖方向不能乱。 架构不是让你写更多代码,而是让你在系统变大时,仍然改得动、测得准、换得起。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。