-
VUE代码编辑器
前言 上一章大概的聊了一下我设想中的低代码模式原型,其中就有代码编辑器的功能,这一章来分享一下我的网页版代码编辑器如何实现。 Monaco-Editor 前端使用的是VUE,微软开源了VSCode前端版插件,我们就用这个插件来做代码编辑器功能,虽然基础版只有几种前端的高级支持,但显示上已经包含很多语言的基础版支持了。 # 安装 npm install monaco-editor -S 我们需要自定义这个组件(类似java的封装)方便后续的组件引入使用,所以在src->components下新建了一个组件MonacoEditor.vue。 由于我的项目优先支持java所以我默认把组件的语言设置为java,还有一个注意事项的是props的定义,这个属性下面的子属性是可以... Read More
-
我想象中的低代码
LowCode本质 2020年主流技术媒体和大厂纷纷入局低代码(LowCode)!显然,LowCode这一说法仅仅是一种愿望表达,即我们希望大幅降低代码编程量,这意味着更少的工作、更快的交付、更稳的系统,然后从老板的角度,它带来更低的成本、更高的利润和更广的市场等。作为一种朴素而美好的愿望,LowCode的本质与FastCode/SlowCode一样,那就是它没有什么本质,或者说它的本质就是对理想中的一种现象的描述。当所有其他指标都相同的情况下,FastCode肯定比SlowCode强。同样的,在提供同样功能特性的前提下,LowCode肯定比HighCode更让人青睐。 要注意一点是:Code Low不代表Code Less。我们要清楚以现在的科技水平,在无代码领域是做不到的,如果... Read More
-
OSHI获取系统信息
前言 我们在常规性系统观测领域会做一些系统层面的服务指标暂时仪表盘,但基本上对系统的指标或许、进程的指标获取用java其实也有点难度的,今天我们学一下OSHI这个类库,它提供了很多方法用于获取系统和进程数据,咱们来做个漂亮的仪表盘。 OSHI OSHI是Java的免费的基于JNA的(本机)操作系统和硬件信息库。它不需要安装任何其他本机库,并且旨在提供一种跨平台的实现来检索系统信息,例如OS版本,进程,内存和CPU使用率,磁盘和分区,设备,传感器等。 支持平台: Windows • Linux • macOS • Unix (AIX, FreeBSD, Solaris) – 计算机系统和固件,底板 – 操作系统和版本/内部版本 – 物理(核心)和逻辑(超线程)CPU,处理器... Read More
-
Linux定时任务
前言 我们在Linux系统启动应用服务成功后需要做一下运维监控工作,比如应用因某些不可控原因服务挂了,或者断电机器后重启了,我们发服务进程就消失了,如果人不在电脑旁边就无法快速响应服务拉起工作。 这时候我们需要一个机器层面的任务调度,自动把不在服务的应用自动拉起。 定时任务 crontab Linux系统中有一个定时任务配置,我们可以利用这个工具帮我们做这类操作,一般操作系统已经安装了的,如果没有安装的网上找一下安装方式,这类就不着重说安装了。我们着重看如何使用。 # 执行命令 crontab -e # 会打开一个vi编辑界面,这里要注意的是你现在登录的用户是什么用户。 # crontab执行的用户是分开的,所以一定要注意 # 这里我用的root登录linux的,所以执行这... Read More
-
AES PKCS7Padding填充和256位加解密支持
前言 1:我们在java-8中使用AES加解密用PKCS5Padding填充(默认支持),但是换成PKCS7Padding填充就会报错,原因是jdk-8中没有支持PKCS7Padding的填充。 com.utils.MsfAESUtilTest ============PKCS5Padding=========== java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/PKCS7Padding at javax.crypto.Cipher.getInstance(Cipher.java:543) Process finished with exit code 0 ... Read More
-
动态线程池设计
背景 我们平时使用线程池参数都是写死在代码中的,需要改变线程池参数则需重启应用才能有效(必须要配置化参数),那么动态变更线程池则非常有效的解决普通线程池在调优方面的便利问题。 如何设计它? 在我们的第一反应就是将每一个线程池管理起来,则每一个线程池都必须有一个id唯一标识,再有则必须要有个存储来存放线程池id对应的参数数据,还需要有个控制台UI方便我们实时操作变更,并且能显示出变更后的执行结果,我还想看到每10秒钟该线程池的执行情况,并绘制出图标一目了然的知道在执行的线程数、已经执行完成的任务数。再高级一点的则是任务的执行耗时,并能够配置执行任务耗时告警,出现拒绝任务的数据到达多少时能告警出来。围绕这个猜想,我们画图设置一下。 我们规划一下项目的脚手架 dynami... Read More
-
你在教我做事?
。。。我本来写了很多感慨,现在全删了,无非是一些苦口婆心的劝诫,想了想这些只是我自己的自以为而已。 我想写这篇文章很久了,我写的时候就在想,我有什么资格教人这些东西,你也只是个普通小职员,又不是领导、总监、经理。你有这些资质吗?搞的好像有多能似的。 最后只能妥协的我以一个30多岁的老油条、混职场多年的人,诉说一些个人成长心得吧,因我刚入社会职场那会也是靠自身多年的经历感悟如何让自己快点成长、与德配位。如果那会的我能有个老同志教我一些经验,可能我现在又不一样了。亦或许我当时根本看不起这些教条,依然我行我素的走自己认为的路。 温馨提示:本文拟自身IT工作生涯来讲述。 职业动机 先讲个案例,说一老总招了两个高学历的毕业生作为培养对象,A是清华本硕连读毕业的,B是某211本科后硕... Read More
-
Jar包加固
背景 我们在公司内网写代码、打包、部署都是在内网专有机器和专有网络上访问,所以基本不会考虑代码加密等问题。 如果我们的代码要部署到公有云等外部机器上,或者与其他公司共建等共享机房内部署,那么就要考虑我们部署的代码要进行加密后上传到公有云机器上部署,从而避免别的公司会下载我们的部署包反编译查看我们的代码。 如果我们的代码不进行加密等处理,那我们的业务极有可能 1:被破解,内部数据隐私等泄露的风险。 2:也很有可能被恶意通过字节码植入破坏性代码。 3:被破解者绕过关键逻辑造成经济损失。 正是要解决此类问题,我们不得不对代码进行加固处理。 预研 Jar包的加密在正常场景中运用较少,基本不会考虑此类加密处理,一般是在加密数据等领域居多,和Android的SDK包等发布加密居多,... Read More
-
什么是云原生?
前言 想必在IT的工作中云原生(CloudNative)这个词会在工作或学习中出现无数次,其实我也很不理解什么是云原生,和我现在的码字工作沾到了哪些边?很多开源应用都是声称自己是云原生或向云原生靠拢的趋势。还有云计算、云服务器,这些是不是就是云原生?出于焦虑原因,我就不停的去翻找资料查Wiki,试图真正的理解这个概念,至少吹牛的时候自己还能搭上话。 大多资料读完会感觉云绕雾罩,一知半解,让我更焦虑了;为了让我避免陷入自我怀疑的负面情绪,这些文章一概认为作者文字功底不行(如果别人看不懂我写的,那也可以认为我文字功底不行,但请不要怀疑自己)。 历史 看一下这个历史发展图,这个概念是2013年提出2015年推广,2013年Docker就出现了。 我之前以为Docker就是云原生... Read More
-
Spring Boot自动装配流程
前言 Spring Boot自动装配了解一下,所谓自动装配那自然是要关注@Configuration这个注解啦。 追溯到源码发现有点像SPI技术,了解SPI技术的朋友看起来就没花什么力气了。SPI说白一点就是在某个规定的路径下存放的特定的配置文件(这就是技术规范),里面的内容就是需要应用启动的时候去加载类、初始化类的功能。如果各位朋友看SpringBoot源码到最后,其实也就是在特定的文件路径下特定的文件名,其内容是要初始化的全类路径,就是告诉Spring你要帮我搞定这些自定义类帮我变成你管理的Bean。 这类的实现目的是什么呢?扩展性非常高了,Spring是一个Bean对象管理的高手,不单单是它自己的一些Bean,我们很多类自己实现的,那么你这种第三方的代码也可以给Spring... Read More
-
Spring是如何解决循环依赖
前言 Spring循环依赖,也就是说类A依赖了类B,类B又依赖类A,那么在项目启动的时候,由于系统不知道先加载A还是B,就会出现循环依赖的错误。 Error creating bean with name 'AServiceImpl': Bean with name 'AServiceImpl' has been injected into other beans [BServiceImpl,CServiceImpl,EServiceImpl] 最好的是重构代码抽取公用部分被大家一起依赖。 或者用@lazy-init属性。在你注入bean时,在互相依赖的两个bean上加上@Lazy注解也可以。 Spring是如何解决循环依赖问题的呢?下面我们从代码的角度的看看它是如何设计的... Read More
-
Spring Bean初始化流程
前言 对于Bean的初始化流程,我觉得无需太专注去了解的,因为里面的东西太多了,对我们有啥帮助吗?没有,因为你只是应付将来可能面试时别人会问而已,拿到Offer了基本就扔掉了,如果是我的话我就直接说忘了或没怎么关注,我反而觉得里面的一些设计模式需要去探索一下的,远比应付面试要好千倍万倍。 我这里也随便简单过一下,想到哪就聊到哪吧。我想鼓励你的是:没关注就是没关注,如果很重要我们就去补习,不是每一个人都有过目不忘的本领,我们时刻保持一颗学习的心态去面对工作和生活就好了。 源码 下面我把关键的类方法贴出来大概说说它的流程是干嘛的,如果不感兴趣就瞎过一遍就行,重要的是里面的具体实现是值得我们去学习和深究的,我也是看了几遍源码去理解和找一些设计模式思想方法学习的,反正我也记不住,我就记... Read More
-
Java线程池工作流程
前言 我们在工作中基本都会用到池连接技术,数据库连接池、HTTP连接池、线程池。深入了解其设计思路背后是为了解决频繁开启连接和关闭了解带来的性能开销,合理的复用连接池技术有效的减少创建和消耗带来的内存开销。 今天分享一下线程池的一些原理和示例,让我们更好的理解线程池的工作流程。 一般说线程池的几个核心参数的作用,什么情况下会使用到最大线程数?线程是通过哪个类创建出来的?拒绝策略有哪些?基本上大家都有了解,如当线程数>=核心线程数且任务队列满时就会新建线程数到最大线程数据的范围;如线程是由实现ThreadFactory接口的DefaultThreadFactory去创建线程的,源码中就是new Thread();当任务队列满时新的任务如何处理就看拒绝策略,默认的AbortPo... Read More
-
JVM固定堆大小原理概解
前言 可能很多人都知道Java程序上生产后,运维人员都会设定好JVM的堆大小,而且还是把最大最小设置成一样的值。那究竟是为什么呢? 你是否有这个疑问?设置堆大小为何要设置成两个相同的固定值,一般不是小的设置小点,大的是一个上限值,我们一般的人认知不也是说随用随取吗,你设置为大小都一样会不会一开始就把空间全占了,让自己独享经济呗。 我也有这个疑问,昨天我的同事让我给某个应用这么配,我也没想明白,然后我就找了好多资料,总结后跟你分享一下。 初始化内存做了什么 一般而言,Java程序如果你不显示设定该值得话,会自动进行初始化设定。 -Xmx #的默认值为你当前机器最大内存的 1/4 如本机有4G内存,这里1G -Xms #的默认值为你当前机器最大内存的 1/64 这里... Read More
-
iframe跨域解决方案
1.原因现象 应用中如果需要用iframe嵌套某个应用的页面,该应用也是用了相同的CAS-SSO登录,但在iframe中出现无限循环登录。 该现象是在谷歌浏览器中出现,原因是谷歌浏览器限制了嵌入的网页不可设置cookie,导致无法访问。仔细检查,在浏览Set-cookie的响应头出发现提示: This Set-Cookie didn't specify a "SameSite" attribute and was defaulted to "SameSite=lax", and was blocked because it came from a cross-site response which was not the response to a top-level navig... Read More
-
提问的艺术
最近我在解决一些日常维护应用的过程中遇到很多提问的同事,有些许感慨和无奈,我们工作确实有时候很无聊或久而久之麻木了,程序员确实是有些闷的职业于是导致很多人对沟通交流技能退化了,提问的方式和语句让人无力和不想与之交谈。 如:在吗?(要是以前的2G时代我还得花一毛线短信回:在!啥事?) 如:大神,你们这个功能是不是有BUG?(我知道我们系统存在问题的可能性,但是你啥都不告知我们还得不停的望闻问切。) 诸如此类的提问,一般很不想搭理的,我需要不停的问才能了解他的意图和来龙去脉,这花了我很长时间,也行过一会他说:请忽略,是我的VPN没登录。但我们作为基础软件的提供方,我们有时候不得不做一些类似客服的工作,耐心解答用户的问题。为了提高我的工作效率、为了证明我不是客服。我觉得尽我所能让更... Read More
-
自立的代价
何为自立 自立,动词,指依靠自己的力量独立生活。这里的生活首先应该是精神生活,然后是物质生活。 自立很难,其实没有什么缺点。我们一般定义自立是用经济独立作为标志,认为一个人能够独自养活自己就算是自立。这是比较常见的说法,它与生存和生活完全是两码事。经济独立只是确保能够独自生存,距离称之为生活的东西还有很远的距离。 走入社会之后,我以为有一份过得去的工资,有一处属于自己的住所,这就叫自立。但在现实社会工作中你会发现没有体系力量的庇护,你的自立往往站不住脚。如果有一天你要离开,那么你所学会的技能不足以在体系之外生存。这样一来,当然让加班就得加班,要调动就得服从。除非拒绝这一套游戏规则,离开庇护冲进外面的风雨里,否则就没有多少选择的余地。这样的生活算是一种自立么? 电视剧《理想之城》... Read More
-
精神交锋
精神交锋 一个人如果把自己的一颗心(情感)关注在某一个事(人)上,专心致志地做某件事。能在很大的程度应对某件事时避免自己把自己绊倒。 现实生活中,人和人经常发生精神上的交锋。比如说交通警察拦下你的车,面无表情地盯着你,要求你出示驾驶证的时候,你会感受到巨大的精神压力。你知道,他在观察你的神情有什么慌乱的地方,所以你也会强自镇定,希望他只是发现尾灯故障,而不是驾驶证过期一周。 电影中的警察在审讯嫌疑犯的时候总会用一些谈判术语炸一炸:张三,别以为我不知道,你做的这些事我们全部都掌握了证据,现在你只要坦白交代,争取将功补过。。。只要这嫌疑犯没有太多的反侦察思维就会被炸出非常多的信息,不管是当时被抓的这个案子还是不被人知的过完一些罪证都如倒豆子帮全部招供了,这一招在审讯环节也是屡试不爽。... Read More
-
Spring @Value注解详解
说明 通过@Value注解将配置文件中的属性注入到容器内组件中(可用在@Controller、@Service、@Configuration、@Component等Spring托管的类中)。该注解在Spring容器使用非常广泛,配合Apollo等配置化管理平台更是爽的不得了。 @Value(“#{xxxx.key}”) 表示支持SpEl表达式,可以调用某个方法来对配置进行增强,甚至可以用其他的@Bean里面的属性给自己。当然还有可以表示常量。 @Value(“${xxxx.key}”) 表示从配置文件读取值的用法。 @Value(“${xxxx.key:val}”) 加冒号表示初始值,在没有获取到配置的时候默认用冒号后面这个字符串val当初始值。 用法 从Spring pr... Read More
-
netty-reactor
什么是经典的三种I/O模式 我们在学Netty的时候讲的最多的就是Reactor的三种模式,因为他的这个模式用的最广泛,涉及的I/O知识点很基础也很常用。 我们去吃饭的时候: 1:家乐园排队打饭,排队在窗口,打好才走。 2:点单,拿一个号码牌等待被叫,好了自己去端走。 3:辣可可包厢模式,点单后菜直接端上桌。 类比: 饭店->服务器 饭菜->数据 饭菜好了->数据就绪 端菜、送菜->读取数据 模式 特点 JDK版本 排队打饭模式 BIO(阻塞) JDK1.4之前 点单... Read More
-
netty-http-server
场景 一个应用如果不是web应用,如何使用http接口上传文件下载文件? 寻找解决方案 我在某应用想开发一个http接口时,发现我的应用不是web应用,想用成熟的组件如spring-web、spring-boot、Tomcat等却望梅止渴,这时候netty就出场了,高性能网络传输框架。 我记得sentinel有类似的接口比如说下发规则到客户端,监听的是8720端口,我去翻了sentinel的源码,确实是用netty做为接口交互的。shardingsphere开源软件也用netty做http和前端交互,我也参考了源码。 建立服务 import com.alibaba.csp.sentinel.concurrent.NamedThreadFactory; impor... Read More
-
Mockito 断言和校验器《第九章》
前言 我们有很多篇幅介绍了如果使用mock挡板等工具做无外部依赖单元测试,本章聊一下单元测试中的断言和校验器。 断言Assertj 推荐用Assertj 断言,反观Assert不是那么的直观好用。Assertj支持字符串、数字、日期、List、Map、Class等类型,此外还提供了好用的 fail 方法。除此之外,对Java中的Exception、Iterable、JodaTime、Guava等都提供支持。 import static org.assertj.core.api.Assertions.*; @Test public void testList() { List<String> names = Lists.newAr... Read More
-
Mockito WEB接口测试《第八章》
前言 前面基本都是接口后端类的测试,这章聊一下web端的http服务如何测试。 我们使用junit测试web的时候不得不起一个完整的服务后调用才能够进入controller代码里面,就如下代码: @Controller @RequestMapping public class WarehouseController { @RequestMapping(value = "/web/warehouse/httpDownload") public ResponseEntity<String> httpDownload( HttpServletRequest request, HttpServletResponse response, ... Read More
-
Mockito 正常场景测试技巧《第六章》
正常场景测试技巧 在这半个月我写的单元测试用例代码中,遇到了很多问题,比如私有变量、方法内部new对象、静态方法mock等,有些代码我们确实难以模拟的,我把我的解决方式跟大家分享一下。 各种service接口模拟 // Spring里面的接口、Dubbo接口等注入 public class TestServiceImpl{ @Resource private MyService myService; } // 单元测试这么做 public class Test{ @Mock MyService myService; @InjectMocks TestServiceImpl testService; @Before public void se... Read More
-
Mockito 异常场景测试技巧《第七章》
异常场景测试技巧 我们的方法有时候没有异常返回,但是内部的某些方法我们try catch了需要测试覆盖到,这类的场景我们也是非常常见的且着重要注意到的。 模拟执行某方法异常测试 public class TestServiceImpl{ @Resource private MyService myService; public boolean doSomeThing(){ boolean isError = false; try{ myService.getName(); } catch(Exception e) { isError = true; } return isError; } ... Read More
-
Mockito EventBus RocketMQ 生产者测试《第五章》
前言 上一章说到了RocketMQ在EvnetBus包装下的测试工具。本章主要讲MSF EventBus生产者操作。 EventBus 生产者模拟测试 请看下面实例: import com.alibaba.fastjson.JSONObject; import com.cdg.msf.event.bus.base.DelayTimeEnum; import com.cdg.msf.event.bus.base.EventBus; import com.cdg.msf.event.bus.base.MsfEventBusException; import org.apache.rocketmq.client.exception.MQClientException; import ... Read More
-
Mockito EventBus RocketMQ 消费者测试《第四章》
前言 在消息中间件中我们要模拟的是收发信息的动作,MQ这类的是依赖第三方消息中间件的,除去启动消息中间件去消费消息这一动作外,其实我们最关心的是我们接受到消息后怎么处理的问题,那么收消息是MQ中多线程去拉取数据的,也是官方jar提供工具类帮我们做的,所以我们需要入手的就是模拟有人给我们发消息,这个接收类是我们重点Mock的对象。本章主要讲如何在单元测试中模拟收RocketMQ服务器消息操作。 还是一如既往的不使用真正的服务器,直接用mock挡板。 EventBus 消费者模拟测试 MSF框架中提供了抽象类,用户只要继承该类去实现handle方法即可,请看下面实例: 首先需要建一个子类的实现类,并且实现父类的handle方法 import com.cdg.msf.event.... Read More
-
Mockito MongoDB测试《第三章》
1:前言 上一章说到了Redis测试工具,我们需要模拟的是Redis连接挡板。本章主要讲如何在单元测试中模拟Mongo服务器操作。 还是一如既往的不使用真正的服务器,直接用mock挡板。 2:Mongo模拟测试 请看下面实例: import com.google.common.collect.Lists; import com.mongodb.MongoClient; import com.mongodb.client.ListDatabasesIterable; import org.bson.Document; import org.bson.types.ObjectId; import org.junit.Before; import org.junit.Test; i... Read More
-
Mockito Redis测试《第二章》
前言 上一章说到了Mockito测试工具,大概入门的使用了该工具模拟调用Dubbo接口。本章主要讲如何在单元测试中模拟Redis服务器操作。 还是一如既往的不使用真正的服务器,直接用mock挡板。 Redis模拟测试 请看下面实例: import com.cdg.msf.cache.redis.RedisCache; import org.junit.Before; import org.junit.Test; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFac... Read More
-
Mockito 接口测试《第一章》
什么是Mock测试 Mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。什么是不容易构造的对象呢?例如HttpServletRequest,需要在有servlet容器环境中创建获取。那不容易获取的对象呢?如一个JedisCluster,需要准备redis相关环境,然后设置进去等等。 Mock 可以分解在单元测试中耦合的其他类或者接口,它能够帮你模拟这些依赖,并帮你验证所调用的依赖的行为。 关于Mockito的简介之前有同事已经介绍过这里就不在赘述了,大家有兴趣可以自行去官方文档查阅,这里主要带大家了解一些常用的Mock方法。 <dependency> <groupId>org.mocki... Read More
-
单元测试准则《开篇》
单元测试应该遵循的原则 F-FAST(快速原则) 单元测试应该是可以快速运行的,在各种测试方法中,单元测试的运行速度是最快的,通常应该在几分钟内运行完毕 I-Independent(独立原则) 单元测试应该是可以独立运行的,单元测试用例互相无强依赖,无对外部资源的强依赖 R-Repeatable(可重复原则) 单元测试应该可以稳定重复的运行,并且每次运行的结果都是相同的 S-Self Validating(自我验证原则) 单元测试应该是用例自动进行验证的,不能依赖人工验证 T-Timely(及时原则) 单元测试必须及时的进行编写,更新和维护,以保证用例可以随着业务代码的变化动态的保障质量 MSF单元测规约 测试是多而小... Read More