带你读《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

 

相关文章
|
存储 Java 测试技术
【通用行业开发部】阿里开源TransmittableThreadLocal使用经验记录
本文章主要记录我在一次业务优化中,使用线程池带来的子父线程值传递问题,及使用TransmittableThreadLocal来解决该问题的经验,并对TransmittableThreadLocal原理做些梳理。
|
6月前
|
数据采集 人工智能 算法
大模型竞赛——从参数膨胀到效能革命的转折
2023年至2025年,全球人工智能领域经历了一场前所未有的“大模型军备竞赛”。
736 0
|
存储 缓存 NoSQL
京东面试:亿级黑名单 如何设计?亿级查重 呢?(答案含:布隆过滤器、布谷鸟过滤器)
尼恩,40岁的老架构师,近期在读者交流群中分享了几个大厂面试题及其解决方案。这些问题包括亿级数据查重、黑名单存储、电话号码判断、安全网址判断等。尼恩给出了三种解决方案:使用BitMap位图、BloomFilter布隆过滤器和CuckooFilter布谷鸟过滤器。这些方法不仅高效,还能显著提升面试表现。尼恩还建议大家系统化学习,刷题《尼恩Java面试宝典PDF》,并提供简历修改和面试辅导,帮助大家实现“offer自由”。更多技术资料和PDF可在公众号【技术自由圈】获取。
|
NoSQL 定位技术 Redis
RedisTemplate.opsForGeo()用法简介并举例
RedisTemplate.opsForGeo()用法简介并举例
1110 3
|
存储 SQL 关系型数据库
|
人工智能 供应链 算法
SWOT分析法:知彼知己的战略规划工具
SWOT分析法是一种用于评估组织、项目、个人或任何其他事物的战略规划工具。SWOT是Strengths(优势)、Weaknesses(劣势)、Opportunities(机会)和Threats(威胁)的缩写。通过分析这四个方面,SWOT分析法可以帮助决策者了解当前情况,并为未来的行动制定策略。
1956 0
SWOT分析法:知彼知己的战略规划工具
|
缓存 Java 网络安全
Nacos报错问题之获取配置文件的时候报错如何解决
Nacos是一个开源的、易于部署的动态服务发现、配置管理和服务管理平台,旨在帮助微服务架构下的应用进行快速配置更新和服务治理;在实际运用中,用户可能会遇到各种报错,本合集将常见的Nacos报错问题进行归纳和解答,以便使用者能够快速定位和解决这些问题。
2751 1
|
消息中间件 存储 Kafka
深入Kafka:如何保证数据一致性与可靠性?
**Kafka一致性详解:** 讲解了幂等性如何通过ProducerID和SequenceNumber确保消息唯一,防止重复处理,维持数据一致性。Kafka利用Zookeeper进行控制器和分区Leader选举,应对节点变动,防止脑裂,确保高可用性。实例中,电商平台用Kafka处理订单,保证每个订单仅处理一次,即使在异常情况下。关注微信公众号“软件求生”获取更多技术内容。
2401 0
|
Prometheus 监控 Cloud Native
SpringBoot3 整合Prometheus + Grafana
SpringBoot3 整合Prometheus + Grafana
SpringBoot3 整合Prometheus + Grafana
io.lettuce.core.RedisCommandTimeoutException: Command timed out 解决办法
io.lettuce.core.RedisCommandTimeoutException: Command timed out 解决办法
768 0

热门文章

最新文章