- 博客(213)
- 资源 (138)
- 收藏
- 关注

原创 Java等待通知机制的工作原理
在Java中,任意一个对象都拥有自己的监视器。当这个对象被同步块或这个对象的同步方法调用时,执行方法的线程必须先获取到这个对象的监视器 才能进入同步块或同步方法。没有获得监视器的线程将会被阻塞在同步块和同步方法的入口处,并且变为`Block`状态
2021-01-25 21:18:53
329
1

原创 你的网站密码安全吗——保障用户密码安全的一些套路
本文主要介绍,如何保障网站用户的密码安全。总的来说,要在用户交互的各个环节保证密码的安全性。如何应对猜测、暴力破解要求用户输入的密码尽可能复杂,如 必须包含数字、大写字母、小写字符、特殊字符中的三种,长度大于8等加入防刷机制,多次密码错误,强制输入验证码。错误次数累积到一定量,锁定账号一定时间不允许登录如何应对传输过程中劫取对前端输入的密码,利用不可逆算法加密后传输对传输过程进行加密,使用 HTTPS/TLS 加密传输如何应对数据库拖库数据库不允许存储明文密码对于前端传输过来的
2020-12-03 23:09:10
465
1

原创 定时任务处理中的分页问题
使用定位标识来进行遍历,从而在一个调度执行期间,能够对所有待处理任务进行处理;并且对于处理异常的任务,能够在下一次调度启动时自动拉起执行。另一方面,我们可以优化任务属性,添加一个重试次数字段。当达到最大重试次数后,任务翻为失败,由人工进行处理。具体的重试次数和调度执行时间间隔,可以由具体的业务场景来决定。这样就能尽可能减少人工干预的次数,减少人力成本。
2020-07-27 23:33:47
2440
4

原创 震惊!日志级别居然可能导致Dubbo出现空指针异常
你可能是被标题吸引过来的,但这确实是一次真实的产线事件。日志级别影响Dubbo出现空指针异常,这个是在查看源码排查问题之后,反推得到的结论。文章所用Dubbo版本为2.6.3问题复现Consumer A服务依赖Provider B服务。Consumer先启动了,此时注册中心无B服务实现,而后Provider启动。调用A服务时,报空指针异常:[dispatcherServlet] in...
2020-04-11 00:15:44
9273
6

原创 使用poi+itextpdf将word转成pdf
将word转换成pdf确实有很多种方案!背景最近正好需要做一个这样的功能,需求是将word模板进行签名后转换为pdf。为此,我花了一点时间去网上找方案。期间遇到了一些坑,这里记录一下。方案选择首先,因为代码是跑在linux服务器上的,所以一般的,依赖windows office功能的方案就行不通了。这就排除了jacob这样一些效果很好的方案。其次,我们的服务器上是不能安装office这样...
2020-03-05 22:22:11
22947
28
原创 知识工程视角下的软件研发
而对于新加入团队的成员而言,可能处于复杂认知模式,也就是需要先实现功能,再根据组员或架构师的反馈,逐步修改代码以符合架构的要求。例如,在一个软件开发团队中,不可言说的知识可能包括特定的编码实践、项目管理的非正式流程、代码审查的潜规则,甚至是如何有效地与特定同事沟通的技巧。比较这两类认知行为模式就会发现,有序的行为模式是感知(sense)在先,而无序的行为模式则是行动在先,感知在后。对于团队而言,效率的根源在于知识传递的效率,即知识传递的准确性,一致性和及时性,这些极大地影响着团队的效率。
2024-08-02 21:47:24
1111
原创 架构入门要点
将要解决的问题根据优先级、重要性、实施难度等划分为不同的阶段,每个阶段聚集于一个整体的目标,集中精力和资源解决一类问题。360°环评表:性能、复杂度、硬件成本、可运维性、可靠性、人力投入。系统、子系统:有关联的个体,通过一定规划,完成某项工作。与SOA是不同的架构设计理念,只是在“服务”上有交集。模块、组件:逻辑角度->模块,物理角度->组件。框架、架构:框架->规范,架构->结构。举例:装饰者模式(设计模式)、规则引擎。架构设计的目的:解决软件系统的复杂性。不同的拆分方式决定了不同的扩展方式。
2024-08-02 21:38:53
459
原创 一个实例了解JVM运行原理
6.此时再次创建一个JVMCase对象,调用sayHello非静态方法,sayHello方法属于对象JVMCase,此时sayHello方法入栈,并通过栈中的student引用调用堆中的Student对象;在这个阶段中,JVM首先会执行构造器方法,编译器会在.java 文件被编译成.class 文件时,收集所有类的初始化代码,包括静态变量赋值语句、静态代码块、静态方法,收集在一起成为。下面以一个具体的代码示例,来说明Java代码对象是如何分配的,Java代码又是如何在JVM中运行的。
2024-04-16 08:27:06
561
1
原创 Java业务研发中的一些经验(持续补充ing)
如何获取当前时间?当前时间的获取方式有多重,一是可以直接取服务器时间,即new Date(),二是可以使用数据库时间。一般来说,使用数据库时间比较好。一是因为我们的业务大多与数据库进行交互,相关时间也存储到数据库中,使用数据库时间可以很好的进行统一。另一方面,在分布式环境下,由于Java所运行环境服务器的不同,根据new Date()获取到的当前时间可能也有差异,,可能会造成业务时间不统一而带来的问题。断言的使用业务代码编写时,我们时常会针对一些异常的场景,抛出对应的异常,防止程序进入后续的处理流程
2022-05-15 23:53:25
436
原创 设计模式中的六个原则
1. 单一职责原则 (SRP: Single Responsibility Principle)类或接口职责单一2. 里式替换原则 (LSP: Liskov Substitution Principle)父类出现的地方子类也可以出现。 并且将父类用子类替换后,也不会产生任何问题3. 依赖倒置原则 (DIP: Dependence Inversion Principle)• 高层模块不应该依赖底层模块,两者都应该依赖其抽象• 抽象不应该依赖细节,细节应该依赖抽象4. 接口隔离原则 (ISP:In
2022-02-20 23:37:14
410
1
原创 关于最近没有更新博客这件事
许久没有更新文章了。近况是的,笔者最近换工作了。换工作嘛,确实打乱了原本按部就班的生活。那么这一段时间笔者做了什么呢?首先,笔者跟上一份工作画上了一个句号。然后利用离职工作的间隙,将最近上海一些想去玩但是一直没有玩的地方玩了一遍(毕竟后面就要去另一个城市了)。真正离职之后,笔者预留了约两周的时间,去长沙逛了一周。散散心,也算作是年度旅游了吧。后面就是搬家入职了。由于是新工作在异地,因此搬家相关的事情花了一段时间。新工作入职,也开始融入团队。不同于与上份工作的“清闲”,目前的工作时间与强度,笔者
2021-11-23 23:02:21
298
原创 面试中的HashMap
关键常量static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;默认初始bucket容量static final int MAXIMUM_CAPACITY = 1 << 30;默认最大bucket容量static final float DEFAULT_LOAD_FACTOR = 0.75f;默认负载因子,当元素数量超过 负载因子 * bucket容量 时,就会触发扩容static final int TRE
2021-08-31 21:45:07
281
原创 Spring AOP代理原理
如果仅仅使用二级缓存,当然也能解决Spring AOP代理问题,但是就无法做到按需进行提前曝光,而是所有bean在实例化之后都要完成AOP代理,这样就写“死”了,违背了架构设计中对扩展开放的设计原则。
2021-07-18 22:55:49
372
原创 Dubbo如何处理业务异常
最近产线上出现了一个下游服务抛出的Error,传递到上游的问题。引发了大家对于Dubbo异常处理的讨论。Dubbo实际上不处理异常,只是做异常的传递。下游业务系统如果没有catch住自己内部系统的异常,经由Dubbo调用后,上游系统会收到同样的异常。
2021-06-14 15:20:58
2153
转载 RSA加密、解密、签名、验签的原理、方法及应用
一、RSA加密简介 RSA加密是一种非对称加密。可以在不直接传递密钥的情况下,完成解密。这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险。是由一对密钥来进行加解密的过程,分别称为公钥和私钥。两者之间有数学相关,该加密算法的原理就是对一极大整数做因数分解的困难性来保证安全性。通常个人保存私钥,公钥是公开的(可能同时多人持有)。 二、RSA加密、签名区别 加密和签名都是为了安全性考虑,但略有不同。常有人问加密和签名是用私钥还是公钥?其实都是对加密和签名的作用有所混淆。简单的说
2021-05-20 21:59:50
1181
原创 浅析Spring如何解决循环依赖问题
Spring通过三级缓存解决循环依赖问题。这三级缓存分别是指:- singletonObjects:单例对象的缓存- earlySingletonObjects:提前曝光的单例对象的缓存- singletonFactories:单例对象工厂的缓存
2021-05-17 23:54:15
231
3
原创 Java并发那些事
文章目录操作系统级的并发策略多核CPU与主内存的层次结构缓存与缓存行应用系统底层如何实现数据一致性系统底层如何保证有序性【扩展】缓存一致性协议Java线程与线程池线程的实现方式线程调度方式Java线程状态及转换线程池工作原理线程池相关参数线程池使用策略Java内存模型为什么要有Java内存模型Java内存模型运行机制内存间的交互操作as-if-serialhappens-beforeJava线程安全的实现方式1. 阻塞同步2. 非阻塞同步3. 无同步方案3.1 可重入代码3.2 线程本地存储Synchron
2021-04-03 22:58:01
473
原创 Dubbo那些事儿
Dubbo架构服务启动者启动时,会向注册中心写入自己的元数据信息,同时会订阅配置元数据信息消费者启动时,也会向注册中心写入自己的元数据信息,并订阅服务提供者、路由和配置元数据信息服务治理中心(dubbo-admin)启动时,会同时订阅所有消费者、服务提供者、路由和配置元数据信息当有服务提供者离开或者有新的服务提供者加入时,注册中心服务提供者目录会发生变化,变化信息会动态通知消费者、服务治理中心当消费方发起服务调用时,会异步将调用、统计信息等上报给监控中心Dubbo结构分
2021-02-28 16:59:21
391
原创 Spring @Autowired、@Resource注入过程
Spring启动时,会通过 ContextNamespaceHandler 加载一些 标签解析器,其中包括AnnotationConfigBeanDefinitionParser,其会解析 annotation-config 标签,并注册一些关键的 PostProcessor:CommonAnnotationBeanPostProcessor ,AutowiredAnnotationBeanPostProcessorComponentScanBeanDefinitionParser,其会解析 co..
2021-02-25 20:52:21
435
原创 Spring中的那些PostProcessor挂载点
在 bean 实例化、属性赋值、初始化这几个阶段中,Spring通过 `PostProcessor` 接口的形式,留下了很多挂载点。这一点符合 设计模式 中的开闭原则,让后续的开发者能够便捷使用 Spring 继承自己的应用和服务。
2021-02-25 20:51:41
223
原创 MESI(缓存一致性协议)
现在的处理器都是多核处理器,并且每个核都带有多个缓存(指令缓存和数据缓存,见下图)。为什么需要缓存呢,这是因为CPU访问内存的速度比较慢,所以在CPU和内存之间加了个缓存以提高访问速度。既然每个核都有缓存,那么假设两个核或者多个核同时访问同一个变量时这些缓存是如何进行同步的呢(缓存细分为一个个缓存行),这就有了MESI协议。缓存行的四个状态:MESI中每个缓存行都有四个状态,分别是E(exclusive)、M(modified)、S(shared)、I(invalid)。下面我们介绍一下这四个状
2021-02-01 23:10:42
992
原创 水滴石穿 + 勤能补拙 = 2020
去图书馆学习,真的能够提高我们的学习效率。不仅仅是因为你会找到很多学习的小伙伴,也能有一个安静的氛围,这个是很难得的。就算在图书馆累了,不想学习,光坐在那里,放空自己,看看窗外。想象一些快乐的事、一些工作上的事,可能会有不一样的灵感爆发、不一样的心流体验。在这忙碌的生活中,难得有这样闲暇的好时光、好地方!
2021-01-04 18:52:25
275
1
原创 关于JVM,你必须知道的这些知识点
一、一些必知参数堆的分配参数-Xmx:堆内存的最大大小(max)-Xms:堆内存的初始大小(start)-Xmn:新生代大小(new)-XX:NewRatio老年代和新生代(eden+2*s)的比值例如:4,表示老年代:新生代=4:1,即新生代占整个堆的1/5-XX:SurvivorRatio(Survivor)设置新生代eden区与Survivor区的比值例如:8,表示 eden:s0:s1 = 8:1:1,即一个Survivor占年轻代的1/10栈的分配参数栈的分配参数-
2020-12-20 00:41:59
578
1
原创 关于计算机二进制编码,你一定要知道这些
原码、反码、补码的计算方法结论:正数有:原码 = 其二进制编码原码 = 反码 = 补码负数有:原码 = 其绝对值二进制编码(即:对应正数的原码),最高位置1反码 = 原码符号位不变,其他位取反补码 = 反码+1举例:一个四字节的int类型的数字 9原码:0000 0000 0000 0000 0000 0000 0000 1001反码:0000 0000 0000 0000 0000 0000 0000 1001补码:0000 0000 0000 0000 0000 000
2020-11-29 22:35:08
1667
原创 CPU高负载原因定位的一般方法——Java版
总体原理:先定位到CPU高的进程,再定位到线程,然后从jstack导出的文件中找到该线程对应的方法使用 top 命令找到CPU高的进程使用命令 shift + H 切换到线程模式,找到线程执行CPU高的线程号把线程号转成16进制print "%x\n" 40437使用jstack 命令,将线程文件dump下来Jstack pid > tmp.txt有可能导出的时候,cpu并没有飚高哦。间歇性的cpu高场景,dump要看运气用刚刚转换的线程号,去dump出来的
2020-11-26 23:27:24
263
原创 Dubbo服务调用的过程
在服务的引用过程中,Dubbo经过层层的包装,将Invoker做成了一个代理,提供给用户。使得用户仅仅只要像调用自己本地服务一样调用即可。在Dubbo服务调用的过程中,其实正是这一过程的“逆过程”。Dubbo将代理的Invoker层层剥开,放出里面一个又一个“套娃”,每个套娃完成自己特定的功能和效用,最终协调一致,完成了整个服务的调用。Dubbo说简单点,就是远程服务的调用。但是为了其各种各样的特性,因此多了很多处理逻辑。如 集群容错、路由、负载均衡、Mock。。。在体会Dubbo调用过程中,这些细节可
2020-10-24 23:57:48
1099
转载 Spring 常用注解原理剖析
前言Spring 框架核心组件之一是 IOC,IOC 则管理 Bean 的创建和 Bean 之间的依赖注入,对于 Bean 的创建可以通过在 XML 里面使用<bean/>标签来配置,对于 Bean 之间的依赖可以使用构造方法注入、Set 方法注入在 XML 里面配置。但是使用这种方式会使 XML 变的比较臃肿庞大,并且还需要开发人员一个个的在 XML 里面配置 Bean 之间的依赖,这简直是一个灾难,还好 Spring 框架给我们提供了一系列的注解让开发人员从这个灾难中解脱出来,比...
2020-10-21 23:07:45
296
转载 InnoDB MVCC 机制,看这篇就够了
本文详细的介绍了什么是MVCC?为什么要有MVCC?以及MVCC的内部实现原理:包括Undo Log的版本链是如何组织的,RR、RC两个级别下一致性读是如何实现的等。通过案例、插图,以最通俗易懂的方式,让你彻底掌握MVCC的来龙去脉。1 什么是MVCCMVCC (Multiversion Concurrency Control)中文全称叫多版本并发控制,是现代数据库(包括MySQL、Oracle、PostgreSQL等)引擎实现中常用的处理读写冲突的手段,目的在于提高数据库高并发场景下的...
2020-10-14 23:45:16
438
原创 String操作的细节——你的单位统一了吗?
究其原因,还是因为Oracle数据库字段的定义 与 代码实现的基准不一致导致的。如果Oracle中varchar用byte作为基准进行存储,我们的Java代码中也要按照字节来进行计算,这样才能符合我们的预期。
2020-10-11 22:53:15
195
原创 Dubbo服务的引用
Dubbo服务的引用,主要是将一些URL相关的信息,组装成一个`Directory`对象,然后通过`Cluster`连接成一个`Invoker`,最后生成此`Invoker`的代理给应用层调用。
2020-09-06 12:21:17
381
原创 Java获取数据库表结构
虽然各个DB厂商查询数据库表结构的语句不同,但是Java中通过封装,可以使用共同的API来获取。各个具体的DB厂商有各自的实现,只需导入相应的包即可。
2020-09-01 23:33:18
9344
1
原创 一个Dubbo服务是如何发布的
服务器端在框架启动时,会初始化服务实例,通过Proxy组件调用具体协议,把服务端要暴露的接口封装成Invoker,然后转换成Exporter,这个时候框架会打开服务端口等并记录服务实例到内存中,最后通过Registry把服务元数据注册到注册中心,并注册相应的监听。
2020-07-12 22:36:48
821
原创 Java实现大文件分割与合并
逻辑很简单,是使用二进制方式读取的,所以打开的临时文件会是乱码。如果要读取成字符串,就可以避免乱码的问题了。我们可以将读取成的二进制流,再通过Base64编码,这样就可以变成字符串了。
2020-06-27 09:52:57
1698
原创 Dubbo是如何搭上Spring的车的?
正是由于Spring开放的扩展设计,从而使得Dubbo可以很方便的“搭车”。也正是由此,Spring才能如此广泛的被应用,而Dubbo,也能通过“搭车”,被更便捷的推广使用。相信了解了Dubbo“搭车”的过程后,我们能够更好的了解Dubbo的运行机制,从而为我们的开发、问题的排查助力。
2020-06-25 19:42:06
420
原创 Dubbo SPI机制(下):自激活扩展与自适应扩展的加载
Dubbo SPI机制是理解后续服务暴露、引用和调用过程的基石,也是整个Dubbo能够博采众长,吸纳众多开源解决方案的一个重要原因。让我们继续Dubbo SPI的旅程,来看一看两个特殊的扩展:自激活扩展和自适应扩展。
2020-05-30 15:01:17
770
原创 Dubbo SPI机制(上):一个普通的扩展类是如何加载的
Dubbo SPI机制这一篇我们先不讲Dubbo中的具体业务逻辑,我们来打基础,聊一聊Dubbo中的SPI机制。Dubbo SPI是干啥的了解一个技术,得先知道它是为了解决什么问题而产生的。那么Dubbo SPI是干什么的呢?按照官网的描述,Dubbo是一款高性能的RPC框架,是为了解决应用间的服务治理问题而诞生的。服务治理会涉及到很多方面的内容,如网络连接、集群容错、服务路由、负载均衡等。这么多的内容,每个都有不同的解决方案。如网络连接,可以由netty实现,也可以由mina实现。Dubbo并
2020-05-24 16:33:42
457
原创 Dubbo源码简析-序言
这是一篇序言,作为接下来一段时间对Dubbo源码的简析的开端吧。为什么要写Dubbo源码的分析呢?说实话,作为一个IT人,最为重要的就是持续不断的学习能力。我也曾看过不少的书,记过不少的笔记,但是到最后,发现自己的理解还是不够深刻。那些教我们使用的书和博客,固然能够在短时间内提高我们的实战能力。但是不懂原理,不知道如何实现的,还是会很大程度上限制我们的思维。只有从原理上、从源码上了解一个东西,并且能够用自己的语言描述,让他人知道和了解,才能从真正意义上说懂了!所以我打算用这一系列Dubbo源码分析的博
2020-05-16 11:06:44
228
linux下串口调试工具,含源码
2016-03-31
学生成绩管理系统(QT版,这是可执行文件!)
2016-03-03
车票管理系统
2015-12-25
仿360手机助手秒装和智能安装功能源码
2015-12-16
Dubbo空指针问题测试代码.zip
2020-04-11
利用poi+itextpdf进行word转pdf.zip
2020-03-04
JAXBContent使用Demo
2018-10-09
FastDFS部署文档
2018-04-05
sublime Text3 3143注册码,亲测可用
2017-09-17
PHP实现图片转字符串代码
2017-08-26
first follow select集合及LL1文法判别
2017-04-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人