1、组件引入的业务背景
系统存储的信息需要被很多系统的不同业务场景调用,外围的业务场景需要的返参信息不完全一样,针对业务模块等开发了一些接口,这些接口返回的参数较多,外围根据需要获取需要的返参字段;同时有些外围的返参一些要求或者调用量很大,对性能要求较高的,这部分场景还需要定制专门的接口服务;最终导致需要维护的接口梳理较多,维护成本较高(每个接口都需要维护接口文档、概设详设文档、以及针对每个接口的监控告警等配置…)。
针对上面的背景提出了返参配置化的解决思路,解决的问题:
- 灵活定制返参字段,减少非必要信息的露出,保护用户隐私;
- 减少Redis查询和降低 Redis内存占用,合理使用资源;
- 减少字段返回,提升接口查询性能;
- 针对场景调用配置化,减少了设计开发工作量,快速交付业务;
- 查询提供标准的接口,支持标准组件化能力输出。
2、设计思路
2.1、整体的思路,根据场景编码和场景密钥定制返回字段,基本的流程图如下:
2.2、模型设计
外部场景配置表:定义外部场景编码+密钥与内部场景编码之间的映射关系。外围调用方系统需要传入,外部系统号用于记录和异常日志打印,便于快速定位问题,
Column Name | Simple Name |
scene_code | 外部场景编码 |
app_code | 外部系统号 |
scene_secret | 场景密钥 |
inner_code | 内部编码 |
scene_desc | 使用场景说明 |
valid_flag | 场景有效标识1:有效 0:无效 |
内部场景返参字段配置表:定义内部场景编码对应的返参字段列表,使用的是field_key外键,字段命名由返参字段取值规则配置表定义。
Column Name | Simple Name |
inner_code | 内部场景编码 |
field_key | 返参字段对应的key |
返参字段取值规则配置表:定义字段的取值规则
Column Name | Simple Name |
field_key | 返参字段对应的key |
field_name | 返参英文名称 |
field_name_desc | 返参中文名称 |
field_name_detail_desc | 返参详细说明 |
field_type | 返参类型 |
field_val_expression | 返参取值表达式 |
field_val_type | 返参表达式类型 |
data_bean | 取值bean |
data_bean_param | 取值bean中的参数 |
data_result_condition | 当前结果取值的过滤条件 |
2.3、核心字段设计思路
场景编码+场景秘钥:外围系统调用接口,需要传入场景编码和秘钥,避免系统场景乱用导致不好管理。
返参表达式类型:支持多种字段解析,如:1:SpEL表达式;2:函数表达式组合;3: 自定义组合(对象/列表);4:java类
返参表达式类型:
1:表达式:单值的简单表达示,例:${userName}
2:函数表达式组合:单值的函数表达示,函数必须用@开头,例:@Desen.mobileNo(${mobileNo})、@Date(${verifyTs},'yyyy-MM-dd HH:mm:ss') 、@xxUtil.xx(${xx})等
3:对象函数组合:此类型对应的表达示必须为OBJ、LIST或LIST_STRING开头的,可以自定义扩展。
OBJ 语法:返回一个对象,对象有多个参数,简化配置默认使用参数作为字段名例:OBJ| name =${ name }, mobileNo =@Desen.mobileNo (${mobileNo })----简化配置:OBJ|${name},@Desen.mobileNo(${mobileNo })
List语法:返回对象列表,简化配置处理相同
LIST| name =${ name }---简化配置:LIST|${ name }
LIST_STRING语法:返回列表,内部是单值类型String
LIST_STRING|${ hobby }4: 自定义java类
2.4、bean对象解析流程图<核心模块>:
三、接口流控设计:
- 接口支持根据业务场景进行单台应用的QPS流控(分布式流控),避免某个业务场景调用量大导致服务器压力上升,而影响其他核心业务场景的查询性能。流控使用了服务端“业务维度的分布式流控组件设计”。
- 接口支持到单机房的全局流控配置。
全局流控:单机房有200组jboss,每台应用每秒接收100个请求,单机房全局流控阈值2W,超过200*100=2W个请求会被拒绝(全局QPS使用redis汇总,每台应用有个Step
步长,实际未到2W就可能被拒绝)。
3、RPC接口也支持到单台应用的QPS流控与并发流控
QPS流控:某服务每秒接收100(QPS阈值)个请求,超过100个请求会被拒绝。
并发流控:某服务同时接收100(并发阈值)个请求,超过100个请求会被拒绝。