带你读《2022技术人的百宝黑皮书》——一种可灰度的接口迁移方案(3)

简介: 带你读《2022技术人的百宝黑皮书》——一种可灰度的接口迁移方案(3)

带你读《2022技术人的百宝黑皮书》——一种可灰度的接口迁移方案(2)https://developer.aliyun.com/article/1339610?groupCode=taobaotech


接口代理

 

接口代理主要通过切面来拦截,通过注解方法的方式来实现。代理注解如下

 

 

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface EnableProxy {
// 用于标识代理类Class<?>
proxyClass();
// 用于标识转发的代理类的方法,默认取目标类的方法名
String methodName() default "";
// 对于单条数据的查询,可以指定key的参数索引位置,会解析后转
int keyIndex() default -1;
]

 切面的实现核心逻辑就是拦截注解,根据代理分发的逻辑去判断是否走代理类,如果走代理类需要解析代理类型、方法名、参数,然后进行转发。


////

@Component @Aspect @Slf4j
public class ProxyAspect {
// 核心代理类@Resource
private ProxyManager proxyManager;
// 注解拦截@Pointcut("@annotation(***)") private void proxy() {}
@Around("proxy()") @SuppressWarnings("rawtypes")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable { try {
MethodSignature methodSignature = (MethodSignature)joinPoint.getSignature(); Class<?> clazz = joinPoint.getTarget().getClass();
String methodName = methodSignature.getMethod().getName(); Class[] parameterTypes = methodSignature.getParameterTypes(); Object[] args = joinPoint.getArgs();
// 拿到方法的注解
EnableProxy enableProxyAnnotation = ReflectUtils
.getMethodAnnotation(clazz, EnableProxy.class, methodName, parameterTypes); 26
if (enableProxyAnnotation == null) {
// 没有找到注解,直接放过
return joinPoint.proceed();
  }
//判断是否需要走代理
Boolean enableProxy = enableProxy(clazz, methodName, args, enableProxyAnnotation);
if (!enableProxy) {
// 不开启代理,直接放过
return joinPoint.proceed();
  }
// 默认取目标类的方法名称
methodName = StringUtils.isNotBlank(enableProxyAnnotation.methodName())
? enableProxyAnnotation.methodName() :  methodName; 
// 通过反射拿到代理类的代理方法
Object bean = ApplicationContextUtil.getBean(enableProxyAnnotation.proxyClass());
  Method proxyMethod = ReflectUtils.getMethod(enableProxyAnnotation.proxyClass(), method- Name, parameterTypes);
if (bean == null || proxyMethod == null) {
// 没有代理类或代理方法,直接走原逻辑
return joinPoint.proceed();
  }
// 通过反射,转发代理类方法
return ReflectUtils.invoke(bean, proxyMethod, joinPoint.getArgs()); 
} catch (BizException bizException) {
// 业务方法异常,直接抛出
throw bizException;
} catch (Throwable throwable) {
// 其他异常,打个日志感知一下
throw throwable;
  }
  }
  }

 

带你读《2022技术人的百宝黑皮书》——一种可灰度的接口迁移方案(4)https://developer.aliyun.com/article/1339608?groupCode=taobaotech

 

相关文章
|
供应链 前端开发 算法
技术人应该知道的电商运营小知识(上)
技术人应该知道的电商运营小知识(上)
720 0
|
存储 设计模式 算法
DDD之于业务支撑的意义
DDD之于业务支撑的意义
346 0
|
4月前
|
存储 Java 数据库连接
简单学Spring Boot | 博客项目的三层架构重构
本案例通过采用三层架构(数据访问层、业务逻辑层、表现层)重构项目,解决了集中式开发导致的代码臃肿问题。各层职责清晰,结合依赖注入实现解耦,提升了系统的可维护性、可测试性和可扩展性,为后续接入真实数据库奠定基础。
412 0
|
数据采集 Java 测试技术
精准测试如何落地
在快速迭代的软件开发环境中,精准测试作为一种高效、针对性的测试方法,正逐步成为企业的首选。本文探讨了精准测试的落地方法、对质量指标的影响、数据统计与跟踪度量、提高投入产出收益率的策略及卡点数据的具体内容。通过优化测试用例、代码关联、技术融合及流程优化,精准测试能够显著提升软件质量和测试效率。
|
存储 SQL 缓存
AnalyticDB 实时数仓架构解析
AnalyticDB 是阿里云自研的 OLAP 数据库,广泛应用于行为分析、数据报表、金融风控等应用场景,可支持 100 trillion 行记录、10PB 量级的数据规模,亚秒级完成交互式分析查询。本文是对 《 AnalyticDB: Real-time OLAP Database System at Alibaba Cloud 》的学习总结。
306 1
|
SQL 存储 数据挖掘
快速入门:利用AnalyticDB构建实时数据分析平台
【10月更文挑战第22天】在大数据时代,实时数据分析成为了企业和开发者们关注的焦点。传统的数据仓库和分析工具往往无法满足实时性要求,而AnalyticDB(ADB)作为阿里巴巴推出的一款实时数据仓库服务,凭借其强大的实时处理能力和易用性,成为了众多企业的首选。作为一名数据分析师,我将在本文中分享如何快速入门AnalyticDB,帮助初学者在短时间内掌握使用AnalyticDB进行简单数据分析的能力。
544 2
|
存储 运维 架构师
架构之道:人人都是架构师(1)
架构之道:人人都是架构师
521 8
|
数据挖掘
技术人应该知道的电商运营小知识(中)
技术人应该知道的电商运营小知识(中)
390 1
|
SQL 安全 Java
慢SQL治理经验总结
慢SQL治理经验总结
776 0
|
存储 设计模式 算法
如何在业务代码中优雅地使用责任链模式
如何在业务代码中优雅地使用责任链模式
378 1