高端屎山制造指南1.0

在日常开发过程中经常会遇到这么一个情况.线上数据处理的方法可能经常需要变动.所以需要经常修改方法内容,并进行服务重启.如果只有一个服务也挺方便,但是如果用上了微服务,服务数量较多时,启动成本就会变大.需要引入第三方插件的支持例如k8s,或jenkis.基于此本人冥思苦想出一个高端的解决方案

屎山本来不是屎,只是晦涩难懂才会发酸发臭

基于对屎山的理解.我们一定要把这段代码写的高端大气上档次.

例如以下代码:

如何使用

public static void main(String[] args) throws InstantiationException, IllegalAccessException {
        String classStr = "从数据层获取的class类字符串";
        Class clazz = getCodeSourceClass(classStr);
        DataDealClass dataDealClass = (DataDealClass) clazz.newInstance();
        String str = dataDealClass.deal(1);
}

DataDealClass有一个处理数据的方法deal()传入了一个整形参数,但是他却返回了一个字符串,或者返回了更多的数据.当开发人员点击DataDealClass去查看实现方法的时候,会发现他只是一个抽象类.在项目中也找不到具体的实现方法.这样无形中增加整个项目的阅读难度.让屎山披上厚厚的护甲

抽象类

public abstract class DataDealClass {
  
  /**
  * 入参和出参都需要提前做好规定
  * 如果 入参和出参 发生了变化则需要重启服务了.
  */
   public abstract String deal(Integer a);
}

屎山的制作从来都不是挥之即来的

  1. 一生二,二生万物.万物之后有maven依赖
<dependency>
    <groupId>org.codehaus.groovy</groupId>
    <artifactId>groovy-all</artifactId>
    <version>{version}</version>
 </dependency>

  1. 毕竟不是孙悟空,必须要有一个爸爸类

    首先定义好一个抽象类,这个抽象类需要在上线前就确定好入参和出参,如果连入参和出参都要调整那就意味着整个业务线需要变更了.

    实现方法参考抽象类

  2. 七十二变我不会,但是我会从字符串生成class类

 CLASS_CACHE = Map<String,Class>
 private GroovyClassLoader groovyClassLoader = new GroovyClassLoader();
 private Class<?> getCodeSourceClass(String codeSource) {
        try {
            //将整个实现类的字符串转为md5编码,并将其缓存到Map中.减少内存的压力
            byte[] md5 = MessageDigest.getInstance("MD5").digest(codeSource.getBytes());
            String md5Str = new BigInteger(1, md5).toString(16);

            Class<?> clazz = CLASS_CACHE.get(md5Str);
            if (clazz == null) {
               //使用groovy转换
                clazz = groovyClassLoader.parseClass(codeSource);
                CLASS_CACHE.putIfAbsent(md5Str, clazz);
            }
            return clazz;
        } catch (Exception e) {
            return groovyClassLoader.parseClass(codeSource);
        }
    }
  1. 泥巴都有了怎么才能让他更像屎呢

    参考如下 如何使用

  2. 不够黏继续加料,论如何让原材料更贴近真实质感

    在本地编辑器中先实现这么一段代码,测试通过后将其复制保存到数据库或其他存储中.


                
import java.util.Arrays;
import java.util.List;
     
public class DataDealClassImpl extends DataDealClass {
   @Override
 public String Deal(Integer param) {
   //code 业务代码
  List<Integer> abd = Arrays.asList(1,2,3,4,5,6,7,8,9);  
  abd.parallelStream().forEach(System.out::println);
              
  return "1";
}
  1. 就像博物馆的展览品看不清楚不能轻易移动.那我再多加几个倍镜没关系吧

    在日常使用中,如果领导说,这一块的数据需要这样处理,过了几天说需要那样处理,那么打工人就能直接在本地修改编译,然后复制保存到数据库中.就可以完成业务逻辑的重写了.服务器地址是多少我都不需要知道.

  2. 既然选择了前进,那就应该不停的奋勇向前.

    为了保证打工人的权益不被无良资本侵犯,所以我们可以对代码进行加密处理.将代码字符串混淆之后存储能更有效的保护自己.具体加密方案可以自行百度.(其实我也不会)

屎山制造不易,且拉且珍惜

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值