# flex-point
**Repository Path**: as_lxg/flex-point
## Basic Information
- **Project Name**: flex-point
- **Description**: Flex Point 是一款面向企业级应用的性扩展点(Ext Point)框架,专为多业务场景下的"能力解耦、动态路由、灵活扩展"而设计。 他支持在不同场景下动态选择和切换业务实现,极大提升了系统的可维护性和业务创新能力。
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-06-30
- **Last Updated**: 2025-08-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
Flex Point
多场景适配、轻量级、极致灵活的扩展点框架
---
## 📚 简介
Flex Point 是一款面向企业级应用的性扩展点(Ext Point)框架,专为多业务场景下的"能力解耦、动态路由、灵活扩展"而设计。 他支持在不同场景下动态选择和切换业务实现,极大提升了系统的可维护性和业务创新能力。
**核心特性:**
- 🚀 **轻量级设计** - 专注于核心扩展点功能,核心模块无Spring依赖
- 🎯 **场景选择器** - 支持自定义扩展点选择器,内置CodeVersionSelector等常用选择器
- 📊 **企业级监控** - 内置扩展点调用监控、性能统计、异步处理、告警机制
- 🏷️ **元数据管理** - 灵活的扩展点标签系统,支持任意场景的元数据存储
- 🔌 **开箱即用** - Spring Boot环境下零配置启动,自动扫描注册
**使用场景:**
- **多租户/多业务线能力隔离**:不同租户/业务线可动态选择不同实现,支持灰度、A/B测试、版本切换等
- **平台型/中台型系统**:平台能力通过扩展点暴露,业务方可按需接入和自定义实现
- **企业级复杂业务**:如订单处理、风控、营销、支付等场景下的多策略动态切换
- **SaaS平台**:支持多租户、多版本、多策略的灵活配置和动态切换
- **业务中台**:将通用业务能力抽象为扩展点,支持各业务线按需定制
---
## 🏗️ 模块结构
```
FlexPoint/
├── flexpoint-dependencies-bom/ # 依赖版本BOM管理模块,统一管理所有依赖版本
├── flexpoint-common/ # 公共模块 - 接口、注解、常量、异常等
├── flexpoint-core/ # 核心模块 - 核心功能实现,不依赖Spring
├── flexpoint-spring/ # Spring集成模块 - Spring环境下的集成
├── flexpoint-springboot/ # Spring Boot自动配置模块
├── flexpoint-test/ # 测试模块 - 测试用例和示例
└── flexpoint-examples/ # 多场景接入示例模块 - Spring Boot、Java原生
```
| 模块名 | 说明 |
|------------------------------|----------------------------------------|
| flexpoint-dependencies-bom | 依赖版本BOM管理,所有依赖版本统一配置 |
| flexpoint-common | 公共基础模块,接口、注解、常量、异常等 |
| flexpoint-core | 核心实现模块,扩展点注册/查找/监控 |
| flexpoint-spring | Spring集成,自动扫描注册扩展点 |
| flexpoint-springboot | Spring Boot自动配置,开箱即用 |
| flexpoint-test | 测试模块,测试用例和示例 |
| flexpoint-examples | 多场景接入示例模块(Spring Boot、Java原生) |
---
## 📦 安装
### 🍊 Maven
在项目的 `pom.xml` 的 dependencies 中加入以下内容:
```xml
com.flexpoint
flexpoint-springboot
${revision}
```
> 推荐业务项目通过 BOM 方式统一依赖版本:
>
> ```xml
>
>
> com.flexpoint
> flexpoint-dependencies-bom
> ${revision}
> pom
> import
>
>
> ```
---
## 📝 文档
- [核心架构V1](statics/ARCHITECTURE_V1.md)
- [项目计划](statics/FLEXPOINT_PLAN.md)
- [多场景接入示例(Spring Boot/Java原生)](flexpoint-examples/README.md)
- [测试用例](flexpoint-test)
---
## 🚀 快速开始
### 1. 依赖引入
在 Spring Boot 项目 `pom.xml` 中添加:
```xml
com.flexpoint
flexpoint-springboot
```
### 2. 定义扩展点接口
```java
@FpSelector("codeVersionSelector") // 指定使用的选择器名称
public interface OrderProcessAbility extends ExtAbility {
String processOrder(String orderId, String orderData);
String getOrderStatus(String orderId);
}
```
### 3. 实现扩展点(自动注册)
```java
import org.springframework.stereotype.Component;
@Component
public class MallOrderProcessAbility implements OrderProcessAbility {
@Override public String getCode() { return "mall-app"; }
@Override public String processOrder(String orderId, String orderData) { return "商城订单处理完成"; }
@Override public String getOrderStatus(String orderId) { return "已支付"; }
}
@Component
public class LogisticsOrderProcessAbility implements OrderProcessAbility {
@Override
public String getCode() { return "logistics"; }
@Override
public String version() { return "1.0.0"; }
@Override
public String processOrder(String orderId, String orderData) {
return "物流订单处理完成";
}
}
```
### 4. 定义选择器
```java
import org.springframework.stereotype.Component;
@Component
public class CodeVersionSelector implements Selector {
@Override
public T select(List candidates) {
String code = SysAppContext.getAppCode();
for (T ext : candidates) {
if (code.equals(ext.getCode())) return ext;
}
return null;
}
@Override
public String getName() { return "codeVersionSelector"; } // 与@FpSelector注解中的名称一致
}
```
### 5. 业务代码中直接注入并调用
```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
public class OrderController {
@FpExt
private OrderProcessAbility orderProcessAbility;
@GetMapping("/order/process")
public String process(String orderId, String orderData) {
return orderProcessAbility.processOrder(orderId, orderData);
}
}
```
---
## 🔧 核心功能
### 扩展点注册与查找
```java
// 注册扩展点
flexPoint.register(new MallOrderProcessAbilityV1());
flexPoint.register(new MallOrderProcessAbilityV2());
flexPoint.register(new LogisticsOrderProcessAbility());
// 查找扩展点(自动根据@FpSelector注解指定的选择器进行选择)
OrderProcessAbility ability = flexPoint.findAbility(OrderProcessAbility.class);
```
### 选择器自定义与注册
#### 推荐:默认选择器注册(Spring Boot最佳实践)
```java
import com.flexpoint.core.selector.resolves.CodeVersionSelector;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
@Component
public class FlexPointConfig {
/**
* 注册默认的代码版本选择器
*/
@Bean
public CodeVersionSelector codeVersionSelector() {
return new CodeVersionSelector(context -> SysAppContext.getAppCode());
}
}
```
- 这样,业务代码只需在请求入口(如过滤器)设置好 `SysAppContext.setAppCode(appCode)`,能力查找时自动感知上下文。
#### 进阶:自定义 Selector(如需特殊路由/多维选择)
```java
import org.springframework.stereotype.Component;
@Component
public class CustomSelector implements Selector {
@Override
public T select(List candidates) {
String code = SysAppContext.getAppCode();
for (T ext : candidates) {
if (code.equals(ext.getCode())) return ext;
}
return null;
}
@Override
public String getName() { return "customSelector"; }
}
```
- 通过 @FpSelector 注解在扩展点接口上指定选择器名称:
```java
@FpSelector("customSelector") // 指定使用名为customSelector的选择器
public interface OrderProcessAbility extends ExtAbility {
String processOrder(String orderId, String orderData);
String version();
}
```
### 扩展点监控
```java
// 获取扩展点调用统计
ExtMetrics metrics = flexPoint.getExtMetrics("mall:1.0.0");
System.out.println("调用次数: " + metrics.getTotalInvocations());
System.out.println("平均耗时: " + metrics.getAverageDuration() + "ms");
```
---
## ⚙️ 配置项说明
| 配置项 | 类型 | 默认值 | 说明 |
|--------|------|-------|------|
| flexpoint.enabled | boolean | true | 是否启用Flex Point框架 |
| flexpoint.monitor.enabled | boolean | true | 是否启用扩展点监控功能 |
| flexpoint.monitor.log-invocation | boolean | true | 是否记录扩展点调用日志 |
| flexpoint.monitor.log-selection | boolean | true | 是否记录扩展点选择日志 |
| flexpoint.monitor.log-exception-details | boolean | true | 是否记录异常详情 |
| flexpoint.monitor.performance-stats-enabled | boolean | true | 是否启用性能统计 |
| flexpoint.monitor.async-enabled | boolean | false | 是否启用异步处理 |
| flexpoint.monitor.async-queue-size | int | 1000 | 异步处理队列大小 |
| flexpoint.monitor.async-core-pool-size | int | 2 | 异步监控核心线程数 |
| flexpoint.monitor.async-max-pool-size | int | 4 | 异步监控最大线程数 |
| flexpoint.monitor.async-keep-alive-time | long | 60 | 异步监控线程保活时间(秒) |
| flexpoint.registry.enabled | boolean | true | 是否启用扩展点自动注册 |
> 以上配置可在 application.yml 或 application.properties 中灵活配置,详细含义见上表。
---
## 🎯 最佳实践
- **注册扩展点时只需 flexPoint.register(ability)**,无需类型和元数据。
- **查找扩展点时直接 flexPoint.findAbility(AbilityClass.class)**,框架会根据@FpSelector注解自动查找对应的选择器。
- **自定义选择器通过 @Component 注解自动注册,或者手动调用 flexPoint.registerSelector(selector) 注册。**
- **选择器的名称(getName()方法返回值)必须与@FpSelector注解中指定的名称一致。**
- **推荐通过BOM统一依赖版本。**
---
### 🚦 Spring Boot 全流程实战
以 `flexpoint-examples/spring-boot-example` 为例,演示如何实现"基于上下文动态切换扩展点"的完整链路:
#### 1. 过滤器编写(上下文注入/鉴权)
```java
// src/main/java/com/flexpoint/example/springboot/framework/flexpoint/security/AppAuthFilter.java
@Component
public class AppAuthFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
String appCode = req.getHeader("X-App-Code");
SysAppContext.setAppCode(appCode);
try {
chain.doFilter(request, response);
} finally {
SysAppContext.clear();
}
}
}
```
#### 2. 选择器注册(推荐方式)
```java
// src/main/java/com/flexpoint/example/springboot/framework/flexpoint/FlexPointConfig.java
@Component
public class FlexPointConfig {
@Bean
public CodeVersionSelector codeVersionSelector() {
return new CodeVersionSelector(context -> SysAppContext.getAppCode());
}
}
```
#### 3. 扩展点接口与实现
```java
// src/main/java/com/flexpoint/example/springboot/ext/OrderProcessAbility.java
@FpSelector("codeVersionSelector") // 指定使用codeVersionSelector选择器
public interface OrderProcessAbility extends ExtAbility {
String processOrder(String orderId, String orderData);
String getOrderStatus(String orderId);
}
// src/main/java/com/flexpoint/example/springboot/ext/mall/MallOrderProcessAbility.java
@Component
public class MallOrderProcessAbility implements OrderProcessAbility {
@Override public String getCode() { return "mall-app"; }
@Override public String processOrder(String orderId, String orderData) { return "商城订单处理完成"; }
@Override public String getOrderStatus(String orderId) { return "已支付"; }
}
```
#### 4. 控制器中注入扩展点并调用
```java
// src/main/java/com/flexpoint/example/springboot/controller/OrderController.java
@RestController
public class OrderController {
@FpExt
private OrderProcessAbility orderProcessAbility;
@PostMapping("/api/v1/orders/process")
public String processOrder(@RequestBody Map request) {
String orderId = request.get("orderId");
String orderData = request.get("orderData");
return orderProcessAbility.processOrder(orderId, orderData);
}
}
```
#### 5. 配置文件示例
```yaml
flexpoint:
enabled: true
monitor:
enabled: true
log-invocation: true
async-enabled: true # 启用异步监控
async-queue-size: 2000 # 队列大小
async-core-pool-size: 4 # 核心线程数
async-max-pool-size: 8 # 最大线程数
async-keep-alive-time: 120 # 线程保活时间(秒)
registry:
enabled: true
```
可通过注入 `ExtMonitor` 获取扩展点调用统计:
```java
@Autowired
private ExtMonitor extMonitor;
ExtMetrics metrics = extMonitor.getExtMetrics(扩展点实例);
```
---
## 🤝 贡献
如果您觉得 Flex Point 有优化空间或有更好的设计思路,欢迎随时提交 PR(Pull Request)!我们鼓励社区共同完善和壮大本项目。
### 🐾 贡献代码的步骤
1. 在 GitHub 上 fork 本项目到您的个人仓库。
2. 将 fork 后的项目(即您的仓库)clone 到本地。
3. 在本地新建分支进行代码修改和优化。
4. commit 并 push 到您的远程仓库。
5. 登录 GitHub,在您的仓库首页点击 "Pull Request" 按钮,填写说明信息后提交。
6. 等待维护者 review 并合并。
### 📐 PR 遵循的原则
欢迎任何人为 Flex Point 添砖加瓦,贡献代码。
- **注释完备**:每个新增方法请按照 JavaDoc 规范标明方法说明、参数说明、返回值说明等,必要时请添加单元测试。
- **依赖规范**:新增方法尽量避免引入额外的第三方库。
- **风格统一**:请遵循项目现有代码风格和格式。
---
## 联系
如有问题或需要支持,扫码加微信(备注 flex-point)
---
## 📄 许可证
本项目采用 [Apache License 2.0](LICENSE) 许可证。
---
让扩展点开发更简单、更灵活!