Java Composition 在微服务架构中的应用
一 概念与原则
二 典型落地场景
三 模式对比与选型
| 模式 | 作用层级 | 核心职责 | 典型位置 | 优点 | 局限与应对 |
|---|---|---|---|---|---|
| API 组合模式 | 服务间 | 跨服务查询聚合 | 前端/BFF/API 网关 | 实现简单、解耦清晰 | 多次往返、数据一致性需权衡;可用并行调用、缓存、CQRS优化 |
| 服务内组合(组合模式) | 服务内 | 可插拔能力与横切关注点 | Service/Component | 高内聚低耦合、易测试替换 | 需良好接口与生命周期管理;用DI与配置化治理 |
四 Java 代码示例
// 1) 组件接口
interface Step { void execute(Context ctx); }
// 2) 具体组件
@Component
class AuthStep implements Step {
public void execute(Context ctx){ if(!ctx.authenticated) throw new SecurityException("未认证"); }
}
@Component
class PermissionStep implements Step {
public void execute(Context ctx){ if(!ctx.hasPermission) throw new AccessDeniedException("无权限"); }
}
@Component
class BusinessStep implements Step {
public void execute(Context ctx){ ctx.result = "OK"; }
}
// 3) 组合容器(编排与委托)
@Component
class WorkflowProcessor {
private final List<Step> steps;
// 通过构造注入,形成可插拔管道
public WorkflowProcessor(AuthStep auth, PermissionStep perm, BusinessStep biz){
this.steps = List.of(auth, perm, biz);
}
public void process(Context ctx){
for(var s : steps) s.execute(ctx);
}
}
// 4) 上下文与使用示例
class Context { boolean authenticated; boolean hasPermission; String result; }
// 在Controller/Service中注入 WorkflowProcessor 并调用
@RestController @RequestMapping("/api/order")
public class OrderController {
@Autowired private OrderServiceClient orderClient;
@Autowired private KitchenServiceClient kitchenClient;
@Autowired private DeliveryServiceClient deliveryClient;
@Autowired private AccountingServiceClient accountingClient;
@GetMapping("/{id}")
public OrderDetails findOrder(@PathVariable String id){
var o = orderClient.findById(id);
var k = kitchenClient.findByOrderId(id);
var d = deliveryClient.findByOrderId(id);
var a = accountingClient.findByOrderId(id);
return OrderDetails.builder()
.orderId(o.id).status(o.status).payStatus(a.status)
.prepareStatus(k.status).estimatedPrepareTime(k.estimate)
.deliveryStatus(d.status).estimatedDeliveryTime(d.estimate)
.build();
}
}
五 实践建议
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。