- 博客(137)
- 资源 (14)
- 收藏
- 关注

原创 自己动手写任务调度平台
本文项目Github地址:https://github.com/zhouhuanghua/z-job什么是任务调度平台呢?暂时不做解释,先来看一下定时器的发展历史吧!首先,new Thread + while (true) + Thread.sleep的方式,虽然很low但是起码能够实现对吧——这种方式的问题是过于占用资源,定时任务一多就暴露出来了。然后,就是利用一些框架,比如JDK提...
2019-07-11 18:16:35
2305

原创 自己动手写MyBatis框架
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。至于怎么使用,源码分析就不讲了,来直接实...
2019-01-26 16:31:06
1759
1

原创 自己动手写RPC框架
在上一篇博客中,介绍了RPC的主要概念和实现原理,然后基于TCP协议实现了一个非常简单的RPC小案例(点此回顾)。现在,自我挑战一下,动手写一个RPC框架。高能预警:本文涉及到的知识点如下Spring Boot2:起步依赖、自动配置,让应用开发变得简单 Spring的Java Bean配置,条件注解:灵活控制注入 基于JDK接口的动态代理(了解一下?):发起远程调用对服务消费者来说...
2019-01-13 02:08:02
3964
18

原创 利用Java的动态编译、动态加载结合EasyRules实现业务规则的动态性
作为一名专门写bug的Java程序猿,相信大家都会遇到过这样的问题:项目的业务逻辑很复杂,而且还经常变化,今天的一个办理条件是小于5,明天就变成了大于10或者条件作废。这就很头疼了,里面的数字可以抽取到配置文件,但是大于和小于呢?条件作废呢?对于业务规则的复杂性,我们可以使用一些规则引擎来解决代码可读性差的问题。市面上也有不少的规则引擎框架,开源的不开源的,收费的不收费的,我们这里推荐使用的是...
2018-12-19 17:05:43
17697
14
原创 Kafka整合WebFlux
1、引入依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId></dependency><dependency> <groupId>io.projectreactor.kafka</groupId>
2021-07-22 01:10:35
1226
原创 Java线上问题排查
1、CPU使用率高模拟代码 public static void main(String[] args) { while (true) { // run } }2、内存占用高3、内存溢出
2021-06-12 23:20:58
1573
2
原创 模块化开发---实现模块的动态加载与卸载
在工作中,由于我是主要负责直播APP的运营活动开发,这些活动代码有两大特性活动周期短,通常只是一个节日、一个星期、十天、一个月等,所以导致代码用于运行的时间短。
2021-05-30 17:13:25
1858
4
原创 编程题:随机抢红包---面向对象版
太晚了,直接放代码吧!1、红包池工厂用于创建一个红包池,保证其正确性和完整性。package red_bag;/** * 红包池工厂 */public class RedBagPoolFactory { /** * 创建红包池 * * @param number 个数 * @param totalMoney 总共金钱(分) * @param maxMoney 单个最大金钱(分) * @param minMoney
2021-05-30 00:50:17
770
原创 Sharding-JDBC实现分库分表和读写分离
在遇到数据量大、性能瓶颈的时候,分库分表和读写分离能够很好解决此类问题。分库分表包括分库和分表两个部分,在生产中通常包括:垂直分库、水平分库、垂直分表、水平分表四种方式。...
2021-05-29 13:42:23
1204
1
原创 DDD随便整理
一、DPDomain Primitive:Domain Primitive是一个在特定领域里,拥有精准定义的、可自我验证的、拥有行为的Value Object。DP是一个传统意义上的Value Object,拥有Immutable的特性 DP是一个完整的概念整体,拥有精准定义 DP使用业务域中的原生语言 DP可以是业务域的最小组成部分、也可以构建复杂组合在DDD里,DP可以说是一切模型、方法、架构的基础,而就像Integer、String一样,DP又是无所不在的。可以带来的好处:接口的清
2021-05-16 17:10:37
1245
2
原创 Java Instrument实践应用:运行中修改程序的Class
Provides services that allow Java programming language agents to instrument programs running on the JVM. The mechanism for instrumentation is modification of the byte-codes of methods.【用于允许Java编程语言代理检测运行在JVM上的程序提供服务。检测的机制是修改方法的字节码。】这是java.lang.instrum...
2021-04-24 04:21:32
1193
1
原创 Filebeat+Elasticsearch+Kibana进阶:格式化日志
“ELK”是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一个搜索和分析引擎。Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中。Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。Logstash虽然功能强大,但是很笨重。Filebeat是轻量型的单一功能数据采集器,占用资源更少
2021-04-18 03:40:38
2774
原创 总结一下线程池
一、线程池的优点和处理流程1、优点降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。2、处理流程二、扩展知识1、corePoolSize和maximumPoolSize可以在创建之后使用setCorePoolSize()、setMaximumPoolSize(
2021-02-09 16:45:21
449
原创 实现优先级队列的线程池
回顾一下线程池的优点和原理优点降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。原理在实际的开发中,会将各种不同的异步任务提交到线程池执行,它们有轻重缓急。如果任务量少,一来就有空闲线程处理,哦那没事了。如果任务量多,我们希望任务队列根据任务的优先级有序存
2021-02-08 16:28:21
3844
1
原创 编程题:斐波那契数列(兔子繁衍问题)---面向对象版
最简单的版本:每一项等于前两项之和,这个用递归或者循环就可以解决。这里我们延伸出一个生活中兔子繁衍的实际案例:一开始有 A 只兔子,每只兔子 B 个月后可以生出 C 只小兔子,兔子在第 D 个月之后会死亡。如图展示了A=1,B=2,C=2,D=3的情况下兔子繁衍过程这里我们使用面向对象的思维解决????首先是建模:第一个我们定义兔子窝,它有窝里兔子、兔子寿命、兔子繁殖年龄、兔子每次繁殖数量4个属性,还有增加兔子、移除兔子、获取N月后兔子数量3个行为。第二个我们定义兔子,它有年龄1
2021-01-15 16:55:54
2316
原创 编程题:约瑟夫问题---面向对象版
/** * 约瑟夫问题是个有名的问题: * N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3。 */public class Josephus { public static void main(String[] args) { Game.create(10, 3, 1).start(); } /** * 游戏 */ static class.
2021-01-15 00:10:26
1274
原创 编程题:猴子分桃---面向对象版
题目猴子分桃:3只猴子抢着分100只桃子,每只抢到的猴子分去剩余桃子的一半。使用多线程模拟这一过程。分析面向对象就是抽取模型:第一个是猴子很简单,它有桃子数量的属性和抢桃的行为;第二个,表面上是桃子,但其实是一堆桃子,这里我们建模为桃篮子,它有桃子数量的属性和减少一半的行为。编码首先定义猴子。为了方便跟踪抢的过程我们加了一个名称属性,并且重写toString方法。在抢桃行为里我们把桃篮子传递进去,然后不断地拿走一半加到自己的数量里,直到无桃可抢。用多线程模拟,那就让猴
2021-01-09 16:08:09
1506
4
原创 责任链模式计算一个过去时间在xxx年/月/周/天/时/分/秒之前
有时候,需要计算一个过去时间在xxx年/月/周/天/时/分/秒之前。比如我们经常看到的文章评论时间、动态发表时间、代码提交时间等,如下怎么实现呢?逻辑是这样的:1、判断时间差是否超过1年,是的话直接计算xxx年前,否则往下走;2、判断时间差是否超过1个月,是的话直接计算xxx月前,否则往下走;3、判断时间差是否超过1个星期,是的话直接计算xxx周前,否则往下走;4、判断时间差是否超过1天,是的话直接计算xxx天前,否则往下走;5、判断时间差是否超过1小时,是的话直接计算xxx小时
2021-01-07 10:52:58
586
1
原创 Java程序将视频转化为动图
1、引入依赖 <!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform --> <dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv-platform</artifactId>
2020-11-03 12:20:30
2273
8
原创 使用建造者模式书写Hadoop MapReduce作业代码
Hadoop的MapReduce作业提交代码,都是相对固定的一段八股文,如下现在,我们就对Job对象的构建封装一个工厂类,以便简化书写。非空的属性放在Builder的构造函数里。/** * MapReduce Job 构造器 * * @author Zhou Huanghua */public class MapRedJobFactory { private MapRedJobFactory() { throw new UnsupportedOperatio
2020-09-22 21:41:34
504
原创 Redis杂谈
Redis,K-V数据库,属于NoSQL中的一员。一、Redis的Value有哪几种类型?String set(String key, String value)String set(String key, String value, String nxxx, String expx, long time)String get(String key)Long exists(String... keys)Boolean exists(String key)Long del(String..
2020-05-27 00:16:48
745
原创 如何搭建高性能、高可用、可伸缩、可扩展的网站
本文只是对所读书籍做一些总结,不代表博主的实战经验,#_#一、高性能也叫高并发,主要指标有响应时间、并发数、吞吐量等。1、Web前端方面浏览器:缓存、压缩、合并请求、减少Cookie传输、延迟加载JSCDN、反向代理:缓存静态资源2、应用服务方面使用缓存:本地缓存、分布式缓存、多级缓存尽量异步:MQ、异步方法搭建集群:横向扩展优化编码:多线程、算法、数据结构、对象复用(池化)、GC3、数据库字段优化:类型、建立索引、冗余走索引:执行计划、避免失效缓存
2020-05-26 03:58:35
792
原创 Java的单继承多实现问题
最近突然想到一个老生常谈的问题:为什么Java的类不支持多继承(接口支持的哈)?抛开高司令不想搞得太复杂的说法,大概答案就是若子类继承的多个父类拥有相同的成员变量,子类在引用该变量时将无法判别使用哪个父类的成员变量。 若子类继承的多个父类拥有相同的方法,同时子类并未覆盖该方法(若覆盖,则直接使用子类中该方法),那么调用该方法时将无法确定调用哪个父类的方法。那么一个类实现了多个接口,就没有这个问题了吗?在Java 8之前,很容易解释接口定义的变量都是常量,编译时就确定调用关系,使用接口名可
2020-05-10 15:50:35
1223
原创 Redis的数据结构操作命令及应用场景
目录 键:key 字符串:String 哈希:Hash 列表:List 集合:Set 有序集合:sorted set 键:key 命令 说明 Jedis方法 Redisson方法 DEL key key 存在时删除 key del DUMP key 序列化给定 key ,并返回被序列化的值 ...
2020-03-28 18:26:36
246
原创 Java使用Jsoup和Selenium抓取西瓜小视频
最近在家里无聊每天刷头条,看到一个很可爱的小姐姐,突然蹦出一个主意,就是想把它这些视频全部搞下来存到本地。网上搜了一下,发现这些视频其实是来自西瓜视频,根据用户名搜索就找到了。刚好会一点爬虫,这下就好办了。跟Python的requests和bs4一样,Java也有HttpClient和Jsoup分别用于发送请求和解析网页。因为Jsoup同时也具备发送请求的功能,并且本例也不涉及复杂的请求,...
2020-02-04 23:40:08
4462
2
原创 使用POI导入导出大数据量的Excel
昨天,产品提了一个紧急需求,让把十一月份已发货的商品数据导出来,写好SQL发给DBA执行之后,得到了三十多个100W数据的Excel文件。有一个属性是以JSON格式存在表中一个字段里面的,需要加工Excel文件将其单独取出来(如图的第四列)。处理程序也在数据导出的过程中写好了,大概思路就是读入Excel构建Workbook对象,然后对指定列的值进行转换,最后写回原文件。想法很奈斯,结果很悲...
2020-01-11 19:09:31
3594
原创 好玩的编译时注解处理工具——APT
大家对Java中的注解(Annotation)应该都不陌生吧,JDK1.5就引进来了,它本质上只是一种元数据,和配置文件一样。利用反射在运行时解析处理能够实现各种灵活强大的功能,比如Spring就将其作用发挥得淋漓尽致。至于用法,这里就不说了,我的其它文章里面很多地方有用到过,可以参考一下。一、运行时注解与编译时注解我们看到的大部分注解,它们都是在代码运行时才使用的,所以一般定义成这样...
2020-01-05 19:21:21
1961
3
原创 简单聊一下RabbitMQ
RabbitMQ凭借着其异步和解耦的两大核心特性在分布式系统应用中大放异彩。虽然在平时工作中经常用到,但是却很少去深入研究。这两天看了一下《RabbitMQ实战》,总结了平时不太注意的几个点。1、ErlangRabbitMQ是用Erlang语言开发的,听说Erlang在处理通信和并发时很是擅长。2、AMQPRabbitMQ是一个实现了AMQP(Advanced Message Qu...
2019-12-14 19:20:35
313
原创 Java中的Type家族简单介绍
之前用反射的时候,基本都是Class。最近弄生成接口文档工具的时候,又接触了一下ParameterizedType,偶然的机会发现两者居然有联系:顶级的接口都是Type。于是就统一整理下Type家族的东西。Type是Java编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。原始类型:Class类的实例表示正在运行的Java应用程序中的类和接口。枚...
2019-12-10 22:45:28
263
3
转载 字节码操纵技术探秘
大家可能已经非常熟悉下面的处理流程:将一个“.java”文件输入到 Java 编译器中(可能会使用 javac,也可能像 ANT、Maven 或 Gradle 这样的构建工具),编译器对其进行分析,最终生成一个或多个“.class”文件。图 1:什么是 Java 字节码?如果从命令行中运行构建,并启用 verbose 的话,我们能够看到解析文件直到生成“.class”文件这一过程的输出...
2019-11-08 16:32:47
502
原创 布隆过滤器原理解析
在撸码的时候,经常要判断一个元素是否已经存在。常用的做法是,把已经存在的元素全部存储到一个集合里,然后新的元素查一下看它是否在集合里来确定是否已经存在。这个集合的数据结构,一般我们会采用HashMap,它可以在O(1)的时间复杂度内返回结果,效率奇高。但是会带来一个问题,就是每条数据都完整地存储在集合里,量大的时候,占据的内存空间是个问题。如果你刚好遇到这方面的问题,那么可以考虑一下布隆过滤器...
2019-11-07 23:20:38
759
原创 SpringBoot+Mybatis配置多数据源并且实现事务一致性
最近博客写得少,不知道怎么说开场白了。呃,本文一共分三部分:SpringBoot+Mybatis环境搭建、两种方式配置多数据源、两种方式实现跨数据源事务,您可以直接跳到喜欢的部分,不过按顺序看完也不会花很多时间。。。一、搭建SpringBoot+Mybatis框架环境看标题就知道,这部分不是重点,所以简单说一下(如果你是小白那对不起了~)。1、引入依赖Mybatis整合包和jdbc...
2019-10-28 00:43:54
18066
11
原创 Java获取一个类继承的父类或者实现的接口的泛型参数
泛型的作用就不多介绍了,如果你想具备架构设计能力,那么熟练使用泛型是必不可少的。不多说了,先定义泛型父类和泛型接口:package cn.zhh;public class Parent<T1, T2> {}package cn.zhh;public interface Interface<T> {}然后,定义一个子类,分别继承和实现以上的父类...
2019-10-24 22:58:56
3617
原创 elasticsearch-head 5连接elasticsearch 6.x无法显示数据的解决办法
在docker安装了elasticsearch-head:5和elasticsearch:6.3.2(相关博客点这里)之后,打开界面连接es时发现数据无法展示。于是网上查了下原因,说是elasticsearch 6增加了请求头严格校验的原因,并且返回结果是{ "error" : "Content-Type header [application/x-www-form-urlencoded]...
2019-08-17 10:45:32
2322
6
原创 Spring Data Jpa将实体类相同属性抽取到基类导致找不到主键的解决方法
有时候我们在使用Spring Data Jpa的时候,会将实体类的一些相同属性抽取成一个公用的基类,这样可以减少代码的重复。但是,一些基本的属性还好,但是将主键也抽取的话,会遇到这样子一个问题:Caused by: org.hibernate.AnnotationException: No identifier specified for entity:XXXXXX说没有指定主键,但是分明...
2019-07-31 12:50:45
1461
1
原创 Docker安装ES,以及界面、中文分词器的插件
前提条件:确保你的机器上面已经安装了Docker和Java。一、安装ElasticSearch1、下载镜像docker pull docker.elastic.co/elasticsearch/elasticsearch:6.3.2用docker images查看已下载的镜像(可选)对镜像命名:docker tag IMAGEID(镜像id) REPOSITORY:TAG(...
2019-07-24 23:48:55
2646
原创 使用Docker搭建Hadoop单机版
其实,直接安装也很简单,官方说明文档:http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html。使用Docker安装只是为了不想污染我的云服务器...首先确保你的机器关了防火墙(或者安装完后开启指定端口的白名单),然后就是已经有了Docker,还没安装的可以参考我的另一篇博...
2019-07-21 01:46:03
6007
原创 使用Selenium实现直播平台的自动刷屏
本文项目Github地址:https://github.com/zhouhuanghua/auto-flood-screen最近,电竞圈LOL届最大的瓜非"蓝公主"莫属。本来,我也只是一名吃瓜群众,感觉都无所谓。但是,后面Baolan的亲妈粉闪现开团:嘲讽皇族官宣香锅退役是蹭热度,抢走了宝蓝生日的风头。这就不能忍了,作为RNG的忠实铁粉,而且还是香锅退役这么隆重的事情。怎么办呢?只能去最多人可...
2019-07-19 21:56:42
3889
原创 解密JUC——构建锁和同步器的AQS
AQS,本名:AbstractQueuedSynchronizer,是Java 5引入的一个并发工具类。它提供了一个基于FIFO(先进先出)队列,可以用于构建锁或者其他相关同步装置的基础框架。它的名字翻译为抽象队列同步器,可以分为三个词:抽象、队列、同步器。正好不知道怎么开始,那么现在我们就以名字的三个词作为切入点。但是为了逻辑讲得清晰,我调了一下顺序:同步器->抽象->队...
2019-07-02 23:58:04
504
自己动手写任务调度平台项目源代码
2019-07-11
根据数据库表自动生成实体类的源代码
2019-06-26
Apollo配置中心客户端使用案例源码
2019-02-24
自己动手写MyBatis框架项目源代码
2019-01-26
自己动手写SpringMVC框架项目源代码
2019-01-25
利用Aspect/Javassist/动态代理/Lombok等方式省略Controller的参数校验结果处理代码
2019-01-19
自己动手写基于动态代理,使用ZooKeeper作为注册中心,以Netty进行网络通信的RPC框架
2019-01-13
dubbo-admin的war包和zookeeper的安装压缩包
2019-01-02
利用Java的动态编译、动态加载结合EasyRules实现业务规则的动态性的项目源码
2018-12-19
借鉴p6spy,实现自己的SQL执行监控器项目源代码
2018-11-25
Spring Advice插件平台开发项目源代码
2018-08-05
自定义maven插件:自动生成API的word文档源代码
2018-07-30
Maven插件源码:根据库表生成实体类&根据实体类生成库表
2018-07-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人