
技术文章
文章平均质量分 60
风清扬鍀师傅
java/javascript/linux/架构
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
规则引擎liteFlow初步尝试
LiteFlow是一个非常强大的现代化的规则引擎框架,融合了编排特性和规则引擎的所有特性。利用LiteFlow,你可以将瀑布流式的代码,转变成以组件为核心概念的代码结构,这种结构的好处是可以任意编排,组件与组件之间是解耦的,组件可以用脚本来定义,组件之间的流转全靠规则来驱动。LiteFlow拥有开源规则引擎最为简单的DSL语法。十分钟就可上手。转载 2023-08-02 20:29:49 · 566 阅读 · 0 评论 -
JVM参数设置
JVM常用参数设置原创 2022-07-24 15:10:38 · 225 阅读 · 0 评论 -
Java 对象toString()之后转化成json对象
Java toSting()对象转成json对象原创 2022-06-28 22:05:45 · 6894 阅读 · 0 评论 -
互联网面试专栏---第一章git reset与git revert区别
互联网面试专栏之git reset与git revert原创 2022-04-29 22:46:07 · 338 阅读 · 0 评论 -
java源码解析之HashMap篇
一.JDK1.7和1.8中HashMap的数据结构各是什么样的1.在jdk 1.7中hashMap的数据结构是数组+链表结构 如下图2.在jdk1.8中hashMao的数据结构是数组+链表+红黑树 如下图二.hashMap中关键常量 有啥意义//hashMap的默认大小 默认是16 注意hashMap的长度必须是2的幂static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16//最大容量static fin原创 2022-03-05 16:07:56 · 614 阅读 · 0 评论 -
记一次线上fullgc排查历程
在公司一次重大项目中,生产环境突然发生频繁fullgc问题,通过cat发出警告。很不幸,这次项目非常重要,领导很看重,所以得赶紧解决问题,下面就是排查的艰苦历程22:10 线上可以报警,出现fullgc问题,初步判断是服务器少了,于是申请堆线上服务器进行扩容,扩容之后,还是有fullgc问题22:30 初步通过代码判断是自己查询了大对象导致老年代内存快速增长,目前业务中只有一个地方老年待,于是盲目改代码:一次查询修改成分页查询修改完代码 进行发布 还是依然fullgc23:30 突然原创 2021-12-07 22:25:49 · 847 阅读 · 3 评论 -
JVM内存分析工具MAT入门篇
一基本概念MAT(全名:Memory Analyzer Tool),是一款快速便捷且功能强大丰富的 JVM 堆内存离线分析工具。其通过展现 JVM 异常时所记录的运行时堆转储快照(Heap dump)状态(正常运行时也可以做堆转储分析),帮助定位内存泄漏问题或优化大内存消耗逻辑。二应用场景场景一:内存溢出,JVM堆区或方法区放不下存活及待申请的对象。如:高峰期系统出现 OOM(Out of Memory)异常,需定位内存瓶颈点来指导优化。场景二:内存泄漏,不会再使用的对象无法被垃圾回收器回收转载 2021-12-07 21:55:28 · 2034 阅读 · 0 评论 -
DDD领域驱动心得体会
最近在学习DDD领域驱动设计,下面是自己的一点心得体会原创 2021-11-28 18:07:17 · 279 阅读 · 0 评论 -
Spring-boot-starter 实现过程
STEP 1在 pom 文件中引入对应的包,例如:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>STEP 2在应用配置文件中加入相应的配置,配置都是组件约定好的,需要查看官方文档或者相关说明。有些比较复原创 2021-11-10 10:07:28 · 581 阅读 · 0 评论 -
互联网公司最新技术面试篇
1.git reset 和revert区别git revert是生成一个新的提交来撤销某次提交,此次提交之前的commit都会被保留git reset是回到某次提交,提交及之前的commit都会被保留,但是此次之后的修改都会被退回到暂存区2.在你的项目中java线程池的数量是多少 怎么配置的 原理是什么?首先要考虑到 CPU 核心数,那么在 Java 中如何获取核心线程数?可以使用 Runtime.getRuntime().availableProcessor() 方法来获取(可...原创 2021-11-02 12:22:21 · 111 阅读 · 0 评论 -
Spring技术专栏---beanFactory创建流程
一:BeanFactory创建流程图二:核心代码讲解2.1 加载beanDefinations入口public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException { super(parentBeanFactory); this.reader.loadBeanDefinitions(resource);}通过XmlBeanDefinition...原创 2021-10-23 23:22:47 · 359 阅读 · 0 评论 -
2021-03-23
filebeat服务器: 10.6.5.53logstash服务器: 10.6.5.21ES集群服务器: 10.4.0.12:9200 10.4.0.13:9200 10.4.0.14:9200kibana服务器: 10.6.5.21组件简介: filebeat:轻量级的日志收集工具,在每台服务器上安装配置即可。Logstash:日志分析过滤工具,通过特定的规则对收集的日志分析过滤,然后转存到ES服务器。ES:elasticsearch搜...原创 2021-10-23 23:08:46 · 91 阅读 · 0 评论 -
互联网公司MySQL数据库采用读已提交的隔离级别原因
开始我们的内容,相信大家一定遇到过下面的一个面试场景面试官:“讲讲mysql有几个事务隔离级别?”你:“读未提交,读已提交,可重复读,串行化四个!默认是可重复读”面试官:“为什么mysql选可重复读作为默认的隔离级别?”(你面露苦色,不知如何回答!)面试官:"你们项目中选了哪个隔离级别?为什么?"你:“当然是默认的可重复读,至于原因。。呃。。。”(然后你就可以回去等通知了!)为了避免上述尴尬的场景,请继续往下阅读!Mysql默认的事务隔离级别是可重复读(Repeatable Rea转载 2021-10-12 10:07:34 · 2826 阅读 · 2 评论 -
浅谈六大设计原则
一、单一职责原则一个类只负责完成一个职责或者功能。不要设计大而全的类,要设计粒度小、功能单一的类。单一职责原则是为了实现代码高内聚、低耦合,提高代码的复用性、可读性、可维护性。二、开闭原则对扩展开放、对修改关闭具体理解:原来代码 一个告警规则 当前满足各种条件时进行告警行为重构之后的代码public class Alert { private List<AlertHandler> alertHandlers = new ArrayList<&g..原创 2021-06-23 22:35:55 · 163 阅读 · 2 评论 -
ELK环境搭建
环境准备: filebeat服务器: 10.6.5.53logstash服务器: 10.6.5.21ES集群服务器: 10.4.0.12:9200 10.4.0.13:9200 10.4.0.14:9200kibana服务器: 10.6.5.21组件简介: filebeat:轻量级的日志收集工具,在每台服务器上安装配置即可。Logstash:日志分析过滤工具,通过特定的规则对收集的日志分析过滤,然后转存到ES服务器。ES:elast...原创 2021-06-23 22:12:01 · 257 阅读 · 0 评论 -
数据结构--排序算法(冒泡排序---插入排序--选择排序)
一.冒泡排序的思路 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较 具体过程图:java代码实现逻辑 public static void doubleSoft(int[] array){ //对...原创 2021-04-17 23:55:17 · 138 阅读 · 1 评论 -
实现一个单项链表的反转
一.解题思路1.新建一个reverseHeroNode =new HearoNode()2.从头到尾遍历原来的数组,将其取出 放到新的reverseHearoNode最前端3.将head.next=reverseHeroNode.next二.过程详解三.代码详解 /** * 链表的反转 * 思路: */ public void reverseLinkedList(){ //为空节点 或者只有一个节点 ..原创 2021-03-31 23:34:01 · 118 阅读 · 0 评论 -
高并发库存秒杀场景
简单库存场景的数据库实现一般来说,从数据库层面讲,库存业务会分为两步,第一步是插入一条记录到扣减明细表inventory_detail,第二步是对库存扣减表inventory的一条记录进行扣减,这两步往往是在一个事务中实现的。数据库业务架构图如下,所有的请求均发往同一个Database。从上文的架构图不难看出,所有的商品的库存信息都存在单一的表和库里,当商品种类繁多或者业务并发请求暴涨时,单实例的数据库显然会成为容量或者性能瓶颈。该数据库架构一般只是功能性的实现,主要用于微型库存系统或者测试转载 2021-03-29 14:40:48 · 284 阅读 · 0 评论 -
全面解密阿里新零售供应链
里在新零售领域的动态,一直备受关注。从天猫超市早期的3日达、当天达再到一小时达;从盒马鲜生诞生,喊出3公里内半小时送达的服务效率,到天猫小店的数量越开越多,国际直营7天之内便可收到快递。阿里的这些新零售业态一直不断地演进突破,给消费者提供了越来越好的时效服务和购物体验。而在背后起到重要支撑作用的,是阿里巴巴智慧供应链平台。这个平台一直很神秘,极少对外发声。但它就像一个商业智慧大脑,为各个零售业务提供供应链管理的优化方案和大数据决策能力。在去年首届供应链平台开放日上,曾鸣教授首次提出了转载 2021-03-29 13:44:33 · 1430 阅读 · 0 评论 -
互联网公司面试问题整理
1.git--- git reset 和revert区别git revert是生成一个新的提交来撤销某次提交,此次提交之前的commit都会被保留git reset是回到某次提交,提交及之前的commit都会被保留,但是此次之后的修改都会被退回到暂存区2.java线程池里面的线程如何进行分配CPU 密集型任务:比如像加解密,压缩、计算等一系列需要大量耗费 CPU 资源的任务,大部分场景下都是纯 CPU 计算。IO 密集型任务:比如像 MySQL 数据库、文件的读写、网络通信等任务...原创 2021-02-28 15:48:31 · 711 阅读 · 0 评论 -
统一认证Ouath2流程
随着微服务的兴起,OAuth2也火了起来,由于其自身的优势,俨然已成为微服务API服务接口安全防护的首选。啥是 OAuth2OAuth2(Open Authorization,开放授权)是OAuth的升级版本。OAuth 是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。OAuth允许用户提供一个令牌给第三方网站,一个令牌对应一个特定的第三方网站,同时该令牌只能在特定的时间内访问特定的资源。OAu.转载 2021-02-28 10:48:06 · 382 阅读 · 0 评论 -
生产环境JVM配置
当前机器配置CPU信息当前机器内存信息、当前机器配置8核 16Gjava -Xms12g -Xmx12g -Xmn512m -Xss512k -XX:NewSize=2g -XX:MaxNewSize=2g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC...原创 2021-02-24 22:34:25 · 207 阅读 · 0 评论 -
死锁的四个条件
死锁的四个条件:1. 互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用2. 不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占用者 主动释放3. 请求和保持,即当资源的请求者在请求其他的资源的同时保持对原有资源的占有4. 循环等待,即存在一个等待队列: P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。 这样就形成了一个等待环路。当上述四个条件都成立,便形成死锁。...原创 2021-02-20 09:37:07 · 150 阅读 · 0 评论 -
线上问题排查思路
整理一下线上问题的排查思路原创 2021-02-04 14:58:31 · 108 阅读 · 0 评论 -
数据结构--二分搜索树
1.二分搜索树的定义:二叉树也是一种动态的数据结构。每个节点只有两个叉,也就是两个孩子节点,分别叫做左孩子,右孩子,而没有一个孩子的节点叫做叶子节点。每个节点最多有一个父亲节点,最多有两个孩子节点(也可以没有孩子节点或者只有一个孩子节点)。对于二叉树的定义我们不通过复杂的数学表达式来叙述,而是通过简单的描述,让大家了解一个二叉树长什么样子。1 只有一个根节点。2 每个节点至多有两个孩子节点,分别叫左孩子或者右孩子。(左右孩子节点没有大小之分哦)3 每个子树也都是一个二叉树2.二分搜索树的j原创 2021-01-30 11:36:09 · 136 阅读 · 0 评论 -
数据结构---连表
1.链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(原创 2021-01-24 15:28:09 · 165 阅读 · 0 评论 -
数据结构--堆、队列
1.堆的定义:栈也是一种线性数据结构,它允许从一端入,且从一端出的数据结构,这一端称为栈顶,具备后进先出(Last in first out)LIFO A-->B-->C依次从栈顶入栈C-->B-->A依次出栈2.队列也是一种线性数据结构,是数组的一种子集,他允许元素从一端入(队尾),从另一端出(对首),具有先进先出特点(First in First Out)FIFO3.自己实现一个栈的过程代码 private MyArr...原创 2021-01-24 14:23:45 · 420 阅读 · 0 评论 -
数据结构专栏--数组
1.数组是一个线性数据结构 在内存中是连续的一段 如下图 2.数组适合索引有语义的情况,适合快速查找的场景 3.简单的实现自定义数组 //定义一个数组对象 private Object[] data; //数组大小 private int size; public MyArray(){ this(10); } publi...原创 2021-01-24 13:29:46 · 114 阅读 · 0 评论 -
浅谈Spring的事务传播特性
谈起事务,最简单就是事务的特性ACID 原子性 一致性 隔离性 持久性。事务的隔离级别 读未提交 读已提交 可重复读 可串行化Spring对事务控制的支持统一在TransactionDefinition类中描述,该类有以下几个重要的接口方法:int getPropagationBehavior():事务的传播行为 int getIsolationLevel():事务的隔离级别 int getTimeout():事务的过期时间 boolean isReadOnly():事务的读写特性所..原创 2021-01-16 18:20:50 · 176 阅读 · 0 评论 -
浅谈双机架构
存储高可用方案的本质都是通过将数据复制到多个存储设备,通过数据冗余的方式来实现高可用,其复杂性主要体现在如何应对复制延迟和中断导致的数据不一致问题。因此,对任何一个高可用存储方案,我们需要从以下几个方面去进行思考和分析: 数据如何复制? 各个节点的职责是什么? 如何应对复制延迟? 如何应对复制中断? 常见的高可用存储架构有主备、主从、主主、集群、分区,每一种又可以根据业务的需求进行一些特殊的定制化功能,由此衍生出更多的变种。由于不同业务的定制功能难以通用化,今天我将针转载 2021-01-14 21:34:43 · 509 阅读 · 0 评论 -
浅谈高性能缓存架构
单纯依靠存储系统的性能提升不够的,典型的场景有:需要经过复杂运算后得出的数据,存储系统无能为力例如,一个论坛需要在首页展示当前有多少用户同时在线,如果使用 MySQL 来存储当前用户状态,则每次获取这个总数都要“count(*)”大量数据,这样的操作无论怎么优化 MySQL,性能都不会太高。如果要实时展示用户同时在线数,则 MySQL 性能无法支撑。读多写少的数据,存储系统有心无力绝大部分在线业务都是读多写少。例如,微博、淘宝、微信这类互联网业务,读业务占了整体业务量的 90% 以上。以微博转载 2021-01-14 21:27:34 · 215 阅读 · 0 评论 -
浅谈分布式事务
[作者简介]李文华,小米信息技术部海外商城组随着互联网技术的不断发展,系统越来越复杂,几乎所有 IT 公司的系统都已经完成从单体架构到分布式架构的转变,分布式系统几乎无处不在。谈到分布式系统,特别是微服务架构,我们不得不谈分布式事务。今天就跟大家一起聊聊分布式事务以及常用解决方案。基础理论在讲解具体方案之前,我们有必要了解一些分布式事务所涉及到的基础理论知识。事务事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个.转载 2021-01-04 11:14:09 · 191 阅读 · 0 评论 -
MySQL数据库之分库分表方案
数据库之互联网常用分库分表方案一、数据库瓶颈1、IO瓶颈2、CPU瓶颈二、分库分表1、水平分库2、水平分表3、垂直分库4、垂直分表三、分库分表工具四、分库分表步骤五、分库分表问题1、非partition key的查询问题(水平分库分表,拆分策略为常用的hash法)2、非partition key跨库跨表分页查询问题(水平分库分表,拆分策略为常用的hash法)3、扩容问题(水平分库分表,拆分策略为常用的hash法)六、分库分表总结七、分库分表示例转载 2020-12-02 19:00:58 · 1555 阅读 · 0 评论 -
java线程池学习
1.传统方式创建线程池的弊端1.传统方式通过ExecutorService executorService = Executors.newCachedThreadPool() 创建线程池 虽然简化了开发人员的创建流程 但是由于这种方式隐藏了线程池内部的原理 在线上可能存在很大的风险 故需要手动创建线程池(默认的方式 线程池采用队列没有指定大小 采用无界队列Integer.MAX 在高并发环境下 容易导致服务器资源枯竭)2.推荐创建方式 /** * 方式1 阿里推荐方式...原创 2020-09-26 23:04:56 · 635 阅读 · 0 评论 -
线程的几种状态总结
一.Java中创建线程的方式有一下几种a)继承Thread类b)实现Runnable接口c)实现Callable接口d)线程池二.线程的状态总结线程共包括以下 5 种状态:1. 新建状态(New):线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。2. 就绪状态(Runnable):也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,thread.start()。..原创 2020-09-26 21:55:58 · 1589 阅读 · 0 评论 -
集合中常用的合并 求交集 并集 补集问题
1.在平时的时候经常会用到求交集、补集、并集、差集的问题 本文通过引入org.apache.commons.collections4.CollectionUtils 进行很方便的解决 ArrayList arrayList=new ArrayList(); List<String> list = Arrays.asList("A", "A", "B", "C"); List<String> list2 = Arrays.asList("E.原创 2020-09-12 18:06:36 · 1588 阅读 · 0 评论 -
Git 创建分支
简介:编写代码,是软件开发交付过程的起点,发布上线,是开发工作完成的终点。代码分支模式贯穿了开发、集成和发布的整个过程,是工程师们最亲切的小伙伴。那如何根据自身的业务特点和团队规模来选择适合的分支模式呢?本文分享几种主流 Git 分支模式的流程及特点,并给出选择建议。分支的目的是隔离,但多一个分支也意味着维护成本的增加。我们可以分别从开发和发布分支的多寡,做个简单组合,即:主干开发,主干发布。 分支开发,主干发布。 主干开发,分支发布。 分支开发,分支发布。设想两个不同的场景:如果一个.转载 2020-08-13 19:21:20 · 593 阅读 · 0 评论 -
ES 聚合函数的用法
1. ES聚合分析是什么?聚合分析是数据库中重要的功能特性,完成对一个查询的数据集中数据的聚合计算,如:找出某字段(或计算表达式的结果)的最大值、最小值,计算和、平均值等。ES作为搜索引擎兼数据库,同样提供了强大的聚合分析能力。对一个数据集求最大、最小、和、平均值等指标的聚合,在ES中称为指标聚合 metric而关系型数据库中除了有聚合函数外,还可以对查询出的数据进行分组group by,再在组上进行指标聚合。在 ES 中group by 称为分桶,桶聚合 bucketingES中还提供..转载 2020-08-05 22:34:47 · 12118 阅读 · 6 评论 -
ElasticSearch学习笔记第一章
1.通过ElasticSearch head-master插件 进行简单搜索的语法{ "query": { "bool": { "must": [ { "match": { "name": "mclongyi" } } ] } }, "_source": [ "id", "name" ], "sort": [ { ...原创 2020-08-04 21:43:02 · 132 阅读 · 0 评论 -
记录Docker搭建ELK出现的问题
上一篇文章 写了Docker 搭建ELK的文章 针对搭建过程中出现的问题进行解答1.对于docker容器里面的查看某个应用的日志 docker logs --details 容器id 这样能及时发现问题2.再设置es的密码的时候 建议设置英文加中午 避免纯数字 不然会抛出 interger 转换成String 错误3.启动Kibana报错[admin][elasticsearch] NO living connections问题的解决方法 修改kibana/config 里面的 kibana..原创 2020-07-03 21:31:46 · 234 阅读 · 0 评论