自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 资源 (1)
  • 收藏
  • 关注

原创 认识GO语言中的nil,零值与空结构体

认识GO语言中的nil,零值与空结构体

2024-09-06 18:54:42 1447

原创 Netty深度剖析(2)— 事件调度

深度解析netty高性能的核心-事件调度的相关设计原理

2024-08-18 22:41:47 810

原创 Netty深度剖析(1)— 纵观全局

Netty系列的第一篇,主要介绍了Netty技术架构的基本脉络和一些核心组件的作用和概念

2024-08-11 19:23:59 685

原创 谈谈DDD设计落地的一些经验

基础层和领域层并不关心事务。另外还有一些比较极端的规则,说是应用层的service不应该出现if-else,因为判断也意味着某种逻辑。但这个我觉得倒不一定非得遵守。

2024-07-28 22:19:30 954

原创 从0到1手搓一个规则引擎(2)

书接上回,这次我们来看一下fast-rule这个规则引擎实现的一些细节,包括一些高性能的设计。

2024-07-21 17:47:49 1129

原创 从0到1手搓一个规则引擎(1)

规则引擎相信很多人都听说过,它能够帮助我们在应对复杂多变的业务需求时,避免硬编码的业务逻辑,提升系统的灵活性和可维护性,降低新业务的开发成本。正好笔者最近在工作中需要用到一个规则引擎,但现成的框架不是功能不合适就是性能跟不上,因此就尝试自己实现一款轻量级的,性能也有保障的规则引擎。如果你也对规则引擎的原理感兴趣,欢迎跟随我的文章,一起来手搓一个规则引擎吧。

2024-07-14 18:22:31 1229

原创 GraalVM上的多语言混合开发

如果你的项目需要某种在Java应用中嵌入其它脚本语言的能力,那么目前最佳的解决方案就是使用GraalVM的多语言混合开发能力,性能上有保障,而且多个语言之间的互操作性也完全不用担心。Truffle框架提供了非常灵活和强大的API,让不同的语言可以相互访问其变量和方法,让每种语言都能充分发挥其长处。欢迎关注我的公号—飞空之羽的技术手札,阅读更多有深度的技术好文~

2024-07-07 17:13:46 1258

原创 下一代的JDK - GraalVM

GraalVM提供了Java应用程序运行的另一种方式,这将带来深远的影响,在云原生时代JAVA语言也终于有了自己的一席之地了。即时启动: 这个效果非常明显,基本就是所谓的秒起,和原来动辄等待十几二十秒简直是天壤之别。节约内存: 经过实测空载内存差不多能够减少到原来的五分之一左右,虽然仍然比同一规模的go,rust等应用占用内存要多,但已经很惊艳了。安全性: 这个可能是很多同学没想到的,这要从两个方面来分析:首先是静态编译仅编译实际应用需要的类和方法。

2024-06-29 21:46:49 1261

原创 异步开发的终极答案—协程

官方的定义非常晦涩难懂,这里就不引用了。如果要给出一个比较简单的核心定义,那么协程其实式一种可以中断并恢复执行的函数。对,协程本质上也是一种函数,但普通函数一旦开始执行,就会执行完成然后才会return,这是一种的结构。但协程并不是这样,而是的结构,即在其中一段程序尚未执行完成时就向另一段程序移交控制权,而且前者会保存自己的上下文,以便稍后恢复现场继续执行。这样是不是很契合上面所说的协作式调度的原理了,协程的”协“字也是这么来的。

2024-06-21 17:21:45 1070

原创 深度解析响应式异步编程模型

完全的响应式开发确实能在性能和资源占用上给系统带来显著的提升,但是它需要实现整个功能处理链路的完全异步化。这依赖于开发者小心的将功能任务划分到多个线程(池)之间进行处理,并通过事件通知机制来进行相互协调,这对开发者的心智负担是非常大的。虽然有框架的辅助,但响应式编程的难度仍然是要显著的高于传统的命令式开发模型,再加上大多数业务应用并没有那么高的性能要求,导致目前响应式编程依然只是 ”看起来很美“,只在部分中间件和Android开发中使用的相对多一些。不过这并不妨碍我们了解响应式编程背后的原理,

2024-06-17 14:48:41 995

原创 聊聊分布式集群的基本概念

都存在分片(分区)和副本的概念,集群中不同的分片保存了不同的数据和状态,但同一个分片一般具备多个副本,副本与副本间的数据和状态是一致的(最终一致),副本一般分为和slave两种角色,仅master接收读写请求(clickhouse例外,多个副本可以同时接收写请求,是多写结构),slave在master挂掉以后通过选举算法确定出新的master。分片的目标是负载均衡,副本的目标是高可用;集群的状态和数据分为两种,一种算是元数据,元数据需要在集群所有实例间进行共享;另一种是实例状态数据。

2024-06-12 17:35:05 1050

原创 聊一聊线程池

它最大的作用就是对线程池中的线程进行某种程度的定制,比如线程的优先级,线程的名称。不过以上规则都是纸面上的,我们大多数实际的工作任务都是CPU和IO的混合型任务,很难直接根据经验给出合适的值,最佳的方式是对线程池的使用进行持续的监控,根据监控结果来动态的调整线程池的各项参数。另外线程池的使用还可以增加对线程的可管理性,因为线程池除了复用线程外,还有个重要的作用就是限制对线程的创建,对于线程这种重量级的资源,如果任由应用进行创建而没有抑制的手段,本身就是很危险的。,我们这里不谈具体用法,主要聊一些核心概念。

2024-06-12 15:59:42 1146

原创 像编排容器一样编排进程

当前微服务架构大行其道,一个业务应用往往是由多个独立的服务构成,通过K8S,Docker Compose等容器编排工具,以及Jekins等DevOPS工具,我们也能够很方便的将服务发布到容器,并通过配置和编排轻松部署到线上环境。同时K8S,Jekins等都对运维能力有比较高的要求,如果希望在开发环境自行部署和调试微服务架构的项目,那往往意味着必须手动部署多个服务的容器并管理它们的状态,这也会大大加剧开发人员在开发阶段进行调试的负担。正是这样的一款工具。

2024-05-11 15:19:15 671

原创 如何排查java应用的高CPU占用的问题

来查看具体哪些线程的CPU占用较高,最后通过jstack命令打印服务的线程堆栈信息,再将占用过高的线程的PID转换成16进制到线程堆栈文件中去搜索,找到对应的高CPU占用的线程就行了。那么如何排查容器内应用的高CPU占用的线程呢?这个线程虽然处于RUNNABLE状态,但明显在等待网络IO,其实并没有占用什么CPU资源。

2023-01-11 14:53:31 1301

原创 Vue 3.0新特性解析

Vue 的下一代版本(3.0)终于在9.18日发布正式版了,代号居然叫“One Piece”,不知海贼王粉们会作何感想… 不过终极秘宝这个定位,倒是很符合大家对这个版本的期待。去年开始,3.0版本的各种消息就一直源源不断,我只是粗略的了解了一下,只知道这个版本在性能和架构上都会有革命性的升级,因为早期的版本肯定无法直接应用到项目上,各种API和实现细节也会不断变化,我也就没有深入去了解版本升级变化的各种细节。但现在正式版已经发布了,核心生态圈的框架适配工作(vue-router 4.0,vuex4.0,An

2020-10-26 15:15:54 515

原创 Mysql Innodb 索引分析

什么是索引数据库索引是我们每个开发人员既熟悉又陌生的东西,几乎所有的业务系统都要与索引打交道,如果数据库查询慢了,第一时间想到的也是添加一个索引试试。但是大多数人并没有去深究这个神奇的东西究竟是如何起作用的。其实索引就像一本书的目录,没有目录的书,我们只能一页一页的往下翻,边看边找自己感兴趣的内容。而有了目录,我们想看书的哪一部分只需要翻翻目录的介绍,找到对应的页码,然后就可以快速的翻到感兴趣的部分了。数据库也是同样的道理,数据通常是保存到磁盘中的(ssd或者hdd),而磁盘的读取速度远远不如内存那么快

2020-08-17 11:37:17 238

原创 利用spring-boot-thin-launcher插件分离jar包的依赖和配置

Spring Boot项目可以通过spring-boot-maven-plugin插件打包生成一个可执行的jar包,这样可以脱离web容器(例如tomcat)直接运行。但默认情况下spring-boot-maven-plugin打出来的包是一个fat jar,即将所有的依赖全部打进了jar包当中,这样的jar包体积很大,每次更新系统的时候都需要完整替换整个jar包(本地还好,如果是云服务器,网速慢了每次上传文件都想砸电脑π__π)。此外,系统切换环境时,也同时需要切换配置参数,虽然可以使用配置中心或者利用命

2020-06-11 10:05:08 2258

原创 Spring Cloud OpenFeign 自定义结果解码器

我们在定义微服务接口的时候,通常会使用一个Result类进行封装,将提示信息,返回对象和状态码等内容封装到一起返回给调用方,例如如下的格式:public class Result<T> { /** * 响应码,200为成功 */ private Integer code; /** * 失败时的具体失败信息 */ private String message; /** * 失败信息是否为用户提示,如果是

2020-06-09 18:41:31 6753 6

原创 利用交互式UI来生成MyBatis-Plus的代码

MyBatis-Plus是一个比较流行的 MyBatis 的增强工具,它提供了一个代码生成框架mybatis-plus-generator 功能也非常强大,可以根据数据库表结构生成Entity,Mapper,Service,Controller等一系列的基础代码,配合框架的支持,基本实现了普通单表增删改查的0编码。但是mybatis-plus-generator并没有提供交互的界面,只有一个简单的命令行用于输入表名,稍微复杂的定制都需要每次改动代码才能实现。而且目前mybatis-plus-generat

2020-05-27 11:22:15 1327 6

原创 使用Sharding-Jdbc进行数据拆分

数据拆分的三种方案当数据库的数据量变得特别大,影响到查询和更新效率的时候,我们就得考虑做数据拆分了。数据拆分一般包含三种方式:分区,分表和分库,我们先分别来讲一讲:分区:数据分区是数据库提供的一种表结构设计方式,对一张数据表进行分区并不会创建新的表, 只是将原本存储为单个文件的表数据根据一定的规则拆分为多个文件进行存储(不同的文件还可以放到不同的硬盘上),这样可以有效降低单个文件的IO压力,提高读写效率,部分聚合语句也可以在不同的分区上并行的执行,缩短执行时间。目前主流数据库都支持数据分区技术,这个

2020-05-11 17:21:27 1078

原创 Spring Cloud笔记(8)使用Seata管理分布式事务

分布式事务介绍所谓事务,就是一系列业务操作构成的独立的执行单元。比如用户购买商品下单的行为,需要执行创建订单,扣减商品库存的两个不同的数据库操作,这就是一个事务。事务最重要的特性就是要支持原子性,要么所有操作全部成功,要么全部失败。为什么要这样设计呢?如果一切顺利,当然什么问题都不会有。但天有不测风云,没有谁能保证系统一直不会出错,如果哪一天订单已经创建成功了,但在扣减对应商品库存时突然失败了,...

2020-05-06 16:28:21 1230

原创 Spring Cloud笔记(7)使用Consul作为配置中心

Spring Boot应用最大的特点就是使用配置来代替编码,很多时候启用某一个功能只需要引入相关的starter,再加入对应的配置项就可以了,例如数据源,安全性,中间件等等。对于单个项目,我们一般会把配置项放到application.property或者application.yaml中,在不同的环境中替换相应的配置值就可以了。但在Spring Cloud项目中,因为引入微服务概念,导致整个系统的...

2020-04-27 14:18:52 968

原创 Spring Cloud笔记(6)使用Spring Boot Admin监控服务

微服务的核心思想就是拆分业务,将单个系统按业务边界切分为多个可独立部署的微服务子系统。这样可以让系统更容易扩展,更快速的迭代,但必然会导致系统内服务实例数量的大量增加,再加上服务实例可能部署到不同的操作系统和网段,对整个系统进行管理和监控的难度比单系统环境要高出不少。幸运的是,针对Spring Boot技术体系我们有一个开箱即用的系统监控解决方案——Spring Boot Admin,对于中小规模...

2020-04-26 11:38:28 691

原创 Spring Cloud笔记(5)Spring Cloud Gateway与权限认证

上一篇中,我们构建了一个简单的Spring Cloud Demo项目,涵盖了服务注册/发现,服务间的相互调用,以及熔断降级等内容。但如果服务需要暴露给外部进行使用,比如移动端,或者web端,则还需要考虑更多的事情。整个服务端的部署情况对于外部调用方应该是一个黑盒,外部调用方无法了解到每个服务具体是部署到哪一个IP或者域名下面,为了安全性也不太可能允许外部调用方直接连接到Consul去查询服务注册的...

2020-04-21 12:01:13 5539 4

原创 CDH的安装与配置

基础环境要求OS: CENTOS 7.1及以上版本(推荐最小化安装,不然部分包版本会有冲突)JAVA: oracle JDK 1.7(不要使用OPENJDK)MYSQL: 5.6.12以上需使用的安装文件:CDH-5.8.0-1.cdh5.8.0.p0.42-el7.parcel CDH离线安装文件CDH-5.8.0-1.cdh5.8.0.p0.42-el7.parcel.s...

2020-04-17 10:00:39 600

原创 HIVE使用时的问题记录

优化 Spark 应用的一个主要手段就是合理设置任务执行的并行度,尽可能的利用集群资源,从而提高执行效率。而影响 spark 并行度的因素主要有如下几个:RDD 的分区数(Partition )Spark 应用默认会为每一个 RDD 分区创建一个 Task, 所以输入 RDD 的分区数直接影响待分配的 Task 总数,Task 任务数如果少于分配的计算资源(cores ),则可能造成部分资...

2020-04-17 09:50:23 1003

原创 Spring Cloud笔记(4)构建Spring Cloud Demo

通过前几篇文章的积累,我们现在可以来动手搭建一个完整的Spring Cloud Demo项目了。为了更清楚的说明Spring Cloud的结构特点,我们的demo项目还是遵循由浅入深的原则,一开始只加入一些基本的特性,后面再来逐步完善。业务背景本来演示技术点的demo,弄一些sayHello的方法出来也无可厚非。但Spring Cloud的很多特性都是与业务的实际需求紧密结合的,脱离业务谈技术...

2020-04-16 11:19:55 465

原创 Spring Cloud笔记(3)Consul的架构和配置

Consul是一个提供整套服务网络解决方案的中间件,除了核心的服务注册/发现以外,还提供很多其它的用途,包含对Service Mesh模式的支持,以及键值对存储等等。我们这里仅对Consul的服务注册/发现功能进行介绍。Consul的基本架构Consul启动的每一个实例都叫做agent,agent根据运行的模式又分为两种类型:server:用于保存整个 Consul集群的状态。包括其它 Co...

2020-04-13 11:45:38 437

原创 Spring Cloud笔记(2) 组件的搭配和选择

上一篇文章介绍了Spring Cloud的基本设计思想,就是为构建一个良好的分布式系统提供了一系列的最佳实践和模式,同时也针对各个模式提供了一些开箱即用的工具,开发者通过组合不同的工具就能够快速构建出符合自身业务特点的微服务系统。但是Spring Cloud针对每个模式提供解决方案或工具并不止一个,我们应该在繁多的候选者里面去进行挑选和比较呢?在这里就来做一个简单的梳理,Spring Cloud提...

2020-04-02 18:00:42 622

原创 Spring Cloud笔记(1)Spring Cloud是什么

网上介绍Spring Cloud的文章已经是汗牛充栋了,从入门到精通,各种教程应有尽有。所以这个系列大概率也不会写出什么新的东西,只是作为我在深入学习微服务以及Spring Cloud的过程中的一些理解和感悟吧。Spring Cloud到底是一个什么东西了?估计很多人的印象都是Spring Cloud就是应用于微服务场景下的一个的应用框架(framework),类似于Spring。这个印象不能算...

2020-03-31 18:05:02 147

原创 Spark任务并行度分析

优化 Spark 应用的一个主要手段就是合理设置任务执行的并行度,尽可能的利用集群资源,从而提高执行效率。而影响 spark 并行度的因素主要有如下几个:RDD 的分区数(Partition )Spark 应用默认会为每一个 RDD 分区创建一个 Task, 所以输入 RDD 的分区数直接影响待分配的 Task 总数,Task 任务数如果少于分配的计算资源(cores ),则可能造成部分资...

2020-03-30 16:32:22 1129

原创 Spark on Yarn模式下的资源分配

Spark程序以Hadoop Yarn作为集群管理器时,运行时所需资源的分配完全由Hadoop Yarn进行管理,相关的配置参数也分成Spark本身以及Hadoop Yarn两部分。以下配置以Spark-1.6.0和Hadoop 2.6.0为标准,部署模式为yarn-cluster。(client模式下个别参数会有区别主要是涉及到driver的参数应该替换为am)Spark配置参数内存配...

2020-03-30 16:29:42 778 5

原创 Parquet文件格式解析

介绍Parquet是目前比较流行的大数据文件列存储格式,主流的大数据计算框架都对其有良好的支持,包括spark,hive,impala等。相对于传统的行存储模式,列存储主要有以下优点:可以跳过不符合条件的数据,只读取需要的数据,降低IO数据量。压缩编码可以降低磁盘存储空间。由于同一列的数据类型是一样的,可以使用更高效的压缩编码(例如Run Length Encoding和Delta Enc...

2020-03-23 16:02:12 3040

原创 CDH与kafka整合的问题记录

CDH 版本:CDH-5.15.0Spark 版本:SPARK2-2.3.0.cloudera3OS: centos 6.2针对CDH的安装以及与kafka的整合遇到的问题进行记录问题记录使用 systemctl start cloudera-scm-server 启动时没有反应,也没有生成日志使用 service cloudera-scm-server start 才行,原因不明...

2020-03-23 11:57:02 322

原创 基于Shiro和JWT的无状态安全验证方案

本文涉及的源码地址:https://github.com/davidfantasy/shrio-with-jwt-spring-boot-starter背景说明用户权限管理是每个信息系统最基本的需求,对基于Java的项目来说,最常用的权限管理框架就是大名鼎鼎的Apache Shiro。Apache Shiro功能非常强大,使用广泛,几乎成为了权限管理的代名词。但对于普通项目来说,Shiro的设...

2020-03-22 20:02:35 1372 1

mybatis-plus-generator-ui-1.0.1.jar

提供交互式的Web UI用于生成兼容mybatis-plus框架的相关功能代码,包括Entity,Mapper,Mappmer.xml,Service,Controller等 ,可以自定义模板以及各类输出,参数。详情请查看https://github.com/davidfantasy/mybatis-plus-generator-ui

2020-05-27

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除