zoukankan      html  css  js  c++  java
  • 优雅的对API进行内部升级改造

    优雅的对API进行内部升级改造

    • 背景

       随着业务的快速发展老的系统将逐渐的无法快速支撑现有业务迭代重构一个必然的过程;然而在底层业务系统重构的过程中,对外提供的API也同时需要进行相应的升级替换;推动外部调用方替换新的API是十分艰难而漫长的过程,因此往往很多时候不得不需要在旧的API内部进行改造升级。旧API的内部改造。。。接口无单测逻辑有点惨不忍睹。。。需要保证出入参数逻辑完全一致!!!如何能避免不改动老的代码优雅的完成接口的内部改造升级?

    • 实现方案
      • 利用自定义注解+aop+反射不直接侵入旧代码进行切换升级
      • 利用redis对接口进行灰度控制来保证业务逻辑平滑过渡

      • 部分代码    

    自定义注解部分:

     

    /**
     * @Author: wjy
     * @Date: 2019-08-28 16:08
     * @Description:
     */
    @Target({ElementType.METHOD, ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Forward {
    
        String beanName() default "";   //需要转发到的对象名称
    
        String methodName() default "";  //需要转发到的执行方法名称
    
        int[] paramsIndex() default 0;   //方法参数的下标
    
        Class[] paramsType() default String.class; //参数类型
    
    }

                 Aspect部分代码:

        @Around(value = "pointcut()")
        public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
            Method method = this.getSpecificmethod(pjp);
            Forward forward = method.getAnnotation(Forward.class);
            if (forward != null) {
                Object object = springContextUtil.getBean(forward.beanName());
                Method forwardMethod;
                Object[] obj = pjp.getArgs();
                Object result;
                if(obj!=null&&obj.length>0){
                    forwardMethod=object.getClass().getMethod(forward.methodName(), forward.paramsType());
    
                    int[] index=forward.paramsIndex();
                    Object[] objParams=new Object[index.length];
                    for(int i=0;i<index.length;i++){
                        objParams[i]=obj[index[i]];
                    }
                    result=forwardMethod.invoke(object,objParams);
                }else{
                    forwardMethod=object.getClass().getMethod(forward.methodName());
                    result=forwardMethod.invoke(object);
                }
                return result;
            }
            log.warn("注意未走转发逻辑:{}",method.getName());
            return pjp.proceed();
        }

    老的V1版本API添加注解:

                   

                   V2版本API

    • 达到比较优雅目的:

    a.内部升级不去改动惨不忍睹的老代码

    b.方便测试人员进行两个版本的API即实现逻辑进行比对测试

    c.利用灰度开关平滑的进行内部升级过渡

    d.后续外部调用方进行主动替换升级版本改动小

     

  • 相关阅读:
    python之+=与+(转载)
    python之上下文管理器与contextlib
    python之类中的super函数
    python之__dict__与dir(转载)
    python多继承之c3算法(转载)
    python之比较is与==(转载)
    python之鸭子类型
    python之抽象基类
    raindi python魔法函数(一)之__repr__与__str__
    Win7系统无法记住网络访问的凭据怎么办?
  • 原文地址:https://www.cnblogs.com/Onlywjy/p/12289365.html
Copyright © 2011-2022 走看看