在日常开发过程中经常会遇到这么一个情况.线上数据处理的方法可能经常需要变动.所以需要经常修改方法内容,并进行服务重启.如果只有一个服务也挺方便,但是如果用上了微服务,服务数量较多时,启动成本就会变大.需要引入第三方插件的支持例如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);
}
屎山的制作从来都不是挥之即来的
- 一生二,二生万物.万物之后有maven依赖
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>{version}</version>
</dependency>
-
毕竟不是孙悟空,必须要有一个爸爸类
首先定义好一个抽象类,这个抽象类需要在上线前就确定好入参和出参,如果连入参和出参都要调整那就意味着整个业务线需要变更了.
实现方法参考抽象类
-
七十二变我不会,但是我会从字符串生成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);
}
}
-
泥巴都有了怎么才能让他更像屎呢
参考如下 如何使用
-
不够黏继续加料,论如何让原材料更贴近真实质感
在本地编辑器中先实现这么一段代码,测试通过后将其复制保存到数据库或其他存储中.
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";
}
-
就像博物馆的展览品看不清楚不能轻易移动.那我再多加几个倍镜没关系吧
在日常使用中,如果领导说,这一块的数据需要这样处理,过了几天说需要那样处理,那么打工人就能直接在本地修改编译,然后复制保存到数据库中.就可以完成业务逻辑的重写了.服务器地址是多少我都不需要知道.
-
既然选择了前进,那就应该不停的奋勇向前.
为了保证打工人的权益不被无良资本侵犯,所以我们可以对代码进行加密处理.将代码字符串混淆之后存储能更有效的保护自己.具体加密方案可以自行百度.(其实我也不会)
屎山制造不易,且拉且珍惜