自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 收藏
  • 关注

原创 redisson滑动时间窗应用场景

前10分钟内累计3次验证失败后,增加图形验证码验证条件,前10分钟内累计6次验证失败后,系统自动锁定该账号15分钟,15分钟后自动解锁;

2024-01-04 15:36:13 642

原创 手写springboot

思考:jetty\tomcat都已实现,总不能用if/else这样决定用哪个服务扩展性太差,基于此,就联想到spring的Condition条件注解和参考springboot中的OnClassCondition这个注解。jetty服务实现(具体实现逻辑没写,具体实现逻辑类似tomcat实现)至此,springboot简化版已实现完成,首先启动看看。至此,springboot简易版已全部实现。首先定义服务接口WebServer。

2023-08-07 14:01:24 3698

原创 idea实用快捷键

Ctrl+Shift+Enter : 补全当前行的结束分号,或者在方法名、if后使用可补全小括号和花括号;Shift+Enter : 在当前行的下一行创建新行,相当于光标跳转到行尾然后回车;Ctrl+Alt+L : 格式化代码,清除多余空格以及缩进,让代码对其更简洁养眼;Ctrl+Alt+Enter :在当前行的上一行创建新行;Ctrl+Alt+O : 优化去除没有用到的import;Ctrl+Tab : 在最近打开的两个文件中切换;Ctrl+E : 打开最近操作的文件列表;

2023-08-07 10:59:36 130

原创 SecureRandom.getInstanceStron获取随机数线程阻塞

1、(强伪随机数,难以预测的随机数)采用 new SecureRandom() 实例化,这个实例化底层是读取的是操作系统的 /dev/urandom文件,这个是伪随机,相比 SecureRandom.getInstanceStrong() 方式,它的随机性稍微弱一些,但大多数场景够用了。2、(弱伪随机数,易于预测的随机数)使用commons-lang3工具包中的RandomUtils.nextLong(起始值,结束值)方法,可以得到一个在该范围内的随机数。(和采用的代码语言无关)。

2023-03-31 15:16:10 1041

原创 mybatis-plus通用性枚举

前言一般对于数据库中存枚举的code,前端列表页却要展示code所对应的中文含义。对于mybatis-plus通用性枚举没出现前我们需要特殊处理。是不是比较繁琐、下面就看看mybatisplus通用性枚举。

2023-03-22 20:45:34 437

原创 灵活的策略模式示例

【代码】灵活的策略模式示例。

2023-02-07 18:37:12 11556

原创 git基本操作

git基本操作

2022-12-23 15:39:56 11503 1

原创 Spring Cloud全链路灰度发布

实际生产中如有需求变更,并不会直接更新线上服务,最通常的做法便是:切出线上的小部分流量进行体验测试,经过测试后无问题则全面的上线。这样做的好处也是非常明显,一旦出现了BUG,能够保证大部分的客户端正常使用。要实现这种平滑过渡的方式就需要用到本篇文章介绍到的全链路灰度发布灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式。

2022-12-22 15:16:12 12490

原创 SpringMvc请求流程

springmvc执行流程

2022-12-19 16:45:15 77

原创 LambdaQueryChainWrapper的用法

mybatisplus 的 LambdaQueryChainWrapper用法

2022-11-21 23:48:59 552

原创 java动态数据填充word转pdf

word动态数据转pdf

2022-10-27 21:20:53 796

原创 Dubbo3.0新特性介绍

dubbo协议在Dubbo框架内使用还是比较舒服的,并且dubbo协议相比于http1.x协议,性能会更好,因为请求中没有多余的无用的字节,都是必要的字节,并且每个Dubbo请求和响应中都有一个请求ID,这样可以基于一个Socket连接同时发送多个Dubbo请求,不用担心请求和响应对不上,所以dubbo协议成为了Dubbo框架中的默认协议。关于Triple协议,后面会深入的讲,今天先分析到这,大家只需要知道它是基于HTTP2的,性能更高,并且兼容了gRPC,还支持流式调用,就可以了。

2022-10-24 23:25:55 2359

原创 手写Spring整合mybatis

spring整合myabtis无非就是,把@Mapper修饰的接口扫描到容器中,然后spring中接口是不能呗扫描成为bean定义的,还有spring中connection与mybatis中connection的整合无非就是同一个线程spring生成的connection放到ThreadLocal中,mybatis用到时直接从中取保证了同一个业务方法中spring的连接与Mybatis时同一个。(此文只针对相应的@Mapper接口扫描beandefinition)......

2022-08-08 22:45:01 10087

原创 Spring构造器的选择

2)通过annotationConfigApplicationContext.getBean(UserService.class,newOrderService());3、当步骤2中返回的构造方法不为Null时、getResolvedAutowireMode默认true、通过bean定义指定的构造方法的参数、通过getBean设置的参数。2、determineConstructorsFromBeanPostProcessors调用bean的后置处理器筛选出候选的构造方法,注意此时可能存在多个。......

2022-07-29 00:21:07 499

原创 Spring实例化过程几种方式以及构造器的选择

个人感觉spring这样设计感觉考虑到效率层面,supplier不需要通过反射,而是在supplierFactory中直接实例化对象,所以supplier的效率比其他方式要高。determineConstructorsFromBeanPostProcessors(beanClass,beanName);当存在多个构造方法、多个构造方法存在@Autowired注解有没有考虑过该选择那个呢。3、@Bean形式、工程方法形式比较简单。2、通过supplier方法形式。1、自定义后置处理器。...

2022-07-28 08:52:57 10226

原创 Spring 基于PropertyDescriptor扩展剖析

总结满足以下条件才会生成PropertyDescriptor(注意读写方法是否为空,spring中by_type类型注入会筛选出具有写方法不为空的PropertyDescriptor):1、参数个数必须2个以内、方法不是static2、 方法没有参数:方法有readMethod没有writeMehtod1、普通get开头方法2、返回值boolean 以is开头的3、 有一个参数1、有一个参数且int类型,方法get开头的,没有readMethod writeMehtod等属性2、没有返回值、

2022-06-29 22:38:44 10323

原创 Spring注入点的扫描(Autowired)

一、bean实例化后会调用postProcessMergedBeanDefinition后置处理器寻找注入点AutowiredAnnotationBeanPostProcessor#postProcessMergedBeanDefinition二、findAutowiringMetadata先去缓存中看是否能获取到三、寻找注入点buildAutowiringMetadata(Class clazz)匹配属性、方法是否匹配............

2022-06-25 10:02:36 861

原创 Spring底层扫描过程(@Component)

一、ClassPathBeanDefinitionScanner#doScan二、获取候选的beandefinition,this.findCandidateComponents(basePackage)三、this.isCandidateComponent四、上面筛选出@Component的beandefinition此时还不能是真正的beandefition必须满足一下条件才能成为真正的beandefinitionthis.isCandidateComponent((AnnotatedBean

2022-06-14 22:35:29 1104

原创 并发三大特性

可见性当一个线程修改了共享变量的值,其他线程能够看到修改的值。Java 内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值这种依赖主内存作为传递媒介的方法来实现可见性的。如何保证可见性如何保证可见性通过 内存屏障保证可见性。通过 synchronized 关键字保证可见性。通过 lock保证可见性。通过 final 关键字保证可见性有序性即程序执行的顺序按照代码的先后顺序执行。JVM 存在指令重排,所以存在有序性问题。如何保证有序性通过 volatile

2022-05-05 22:43:21 192

原创 JVM执行模式

一、解释模式通过解释器(Bytecode Interpreter)解释执行特点:启动快(不需要编译),执行慢可通过-Xint参数指定为纯解释模式二、编译模式由JIT(Just In-Time Compiler)编译为本地代码(C语言实现)执行特点:启动慢(编译过程较慢),执行快可通过-Xcomp参数指定为纯编译模式三、混合模式(默认)混合使用解释器 + 热点代码编译起始阶段采用解释执行热点代码检测(HotSpot),默认-XX:CompileThre

2022-04-30 17:28:47 249

原创 centos安装elk(es、kibana、ik)

一、安装es 先创建组, 再创建用户: 1)创建 elasticsearch 用户组 [root@localhost ~]# groupadd elasticsearch 2)创建用户 kcc 并设置密码 [root@localhost ~]# useradd kcc [root@localhost ~]# passwd kcc 3)# 创建es文件夹, 并修改owner为kcc用户 mkdir ‐p /usr/local/src/es 4)用户kcc添加到 elasticsear

2022-04-30 16:48:03 1547

转载 synchronized如何保证原子性、可见性、有序性

原理原子性:加锁和释放锁;可见性: 加了Load屏障和Store屏障,释放锁flush数据,加锁会refresh数据;有序性:Acquire屏障和Release屏障,保证代码块内部可以重排,但是代码块内部和代码块外部的指令是不能重排的。如何保证原子性:java对象是分为对象头和实例变量两块,其中实例变量就是对象那些变量数据,然后对象头包含了两块内容,一是 Mark Word(含hashCode、锁数据、GC数据等),另一个是Class Metadata Address(包含了指向类的元数据指针

2022-04-27 23:54:37 1542

原创 linux下es启动报错unknown setting [http.cors.allow‐origin] did you mean [http.cors.allow-origin]?

报错日志:elasticsearch.yml内容: cluster.name: kcc-es node.name: node1 path.data: /usr/local/src/es/elasticsearch‐7.6.1/data path.logs: /usr/local/src/es/elasticsearch‐7.6.1/log network.host: 192.168.19.128 http.port: 9200 discovery.seed_hosts: ["192.168

2022-04-25 20:54:44 4152

原创 SpringBoot Security工作原理

一、概述 Spring Security是解决安全访问控制的问题,说白了就是认证和授权两个问题。而至于像之前示例中页面控件的查看权限,是属于资源具体行为。SpringSecurity虽然也提供了类似的一些支持,但是这些不是Spring Security控制的重点。Spring Security功能的重点是对所有进入系统的请求进行拦截,校验每个请求是否能够访问它所期望的资源。而Spring Security对Web资源的保护是通过Filter来实现的,所以要从Filter入手,逐步深入Spring Sec

2022-02-14 17:48:37 1296

原创 Spring Security 快速上手

一、项目搭建 1、创建SpringBoot项目 ![在这里插入图片描述](https://img-blog.csdnimg.cn/bb8e82e13b8f43cc8b6f43de675288f1.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAU3RyYW5nZXJJdA==,size_19,color_FFFFFF,t_70,g_se,x_16#pic_center)2、next

2022-02-11 17:52:11 311

原创 mybatis源码api_sqlSessionFactory创建过程(一)

一、先看SqlSessionFactory创建过程流程图(配置文件都要解析封装到Configuration对象中)二、基于源码解读SqlSessionFactory创建过程(1)、首先把mybatis配置文件读取到流中,传给SqlSessionFactoryBuilder().build()InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory sqlsessionFac

2022-01-24 16:54:57 368

原创 Mybatis底层调用过程源码分析(基于sqlsession增删改查)

一、mybatis调用方式基于sqlsession调用,例如sqlsession.selectList调用通过sqlsession.getMapper()代理调用(底层最终还是通过sqlsession调用)基本业务代码:Userpublic class User { private String name; private int age; public String getName() { return name; } p

2022-01-24 16:18:52 357 2

原创 Spring整合mybatis源码剖析

spring 整合mybatis,无非主要两点:1、spring、mybatis中connection整合2、mapper接口的扫描(得自定义扫描类去扫描接口、因spring扫描类会过滤接口)、生成代理类一、

2022-01-21 17:56:44 12021 6

原创 SpringBoot启动流程及扩展点

2022-01-14 17:13:11 202

原创 gateway整合https(自定义证书)

一、证书生成、以及导入jdk中1、生成证书 keytool -genkey -alias dpcer -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore C:\Users\k03691\keystore.p12 -validity 3650 -ext san=ip:127.0.0.1 -dname "CN=garyyan, OU=mycompany, O=mycompany, L=gd, ST=gd, C=china"2、证书导出设置别名

2021-12-07 10:14:13 1206

转载 RocketMQ新的订阅组CONSUME_FROM_LAST_OFFSET为啥无效

一、背景 之前遇到一个问题,就是一个新的订阅组,指定集群方式消费,使用DefaultMQPushConsumer,第一次启动指定的consumeFromWhere是CONSUME_FROM_LAST_OFFSET,但是却消费了好久之前的消息!!! CONSUME_FROM_LAST_OFFSET官方的解释是一个新的订阅组第一次启动从...

2021-11-05 10:42:30 1219

原创 编译zookeeper源代码

1、拉去分支代码到idea中 https://github.com/apache/zookeeper.git2、源码导入idea后,org.apache.zookeeper.Version类会报错,需要建一个辅助类(如果源代码不报错忽略此类)package org.apache.zookeeper.version;public interface Info { int MAJOR = 1; int MINOR = 0; int MICRO = 0; Str

2021-08-10 14:48:47 776

转载 openstack计算节点ssh免认证

一、免认证设置https://blog.csdn.net/klyhuntermax/article/details/51469493遇到的问题: 一直认证失败,查看/var/log/secure日志,最终定位selinux没有关闭,关闭重启解决(防火墙也得关闭)

2021-08-09 09:55:49 141

原创 如何关闭Linux里边的selinux

查看selinux的状态getenforce 这个命令可以查看到selinux的状态,当前可以看到是关闭状态的。还有一个命令也可以查看出selinux的状态。sestatus -v假设selinux是正在运行的,我们可以使用setenforce 命令设置临时关闭,不用重启生效。setenforce 0我们还可以通过编辑文件,然后重启让它关闭生效。vi /etc/sysconfig/selinux把里边的一行改为SELINUX=disabled改了之后保存,然后重启就可以了。

2021-08-09 09:39:30 721

原创 ReentrantLock详解(公平锁)

一、概述ReentrantLock是一种基于AQS框架的应用实现,是JDK中的一种线程并发访问的同步手段,它的功能类似于synchronized是一种互斥锁,可以保证线程安全。而且它具有比synchronized更多的特性,比如它支持手动加锁与解锁,支持加锁的公平性。AQS定义了一套多线程访问共享资源的同步器框架,是一个依赖状态(state)的同步器ReentrantLock内部定义Sync实现了AbstractQueuedSynchronizer,公平锁、非公平锁都实现Sync公平锁 F

2021-06-17 20:33:56 1640

原创 mysql索引详解

一、explain包含字段详解二、主键索引、联合索引(Innodb)InnoDB聚集索引的叶子节点存储行数据记录(上左图),因此, InnoDB必须要有,且只有一个聚集索引:(1)如果表定义了PK,则PK就是聚集索引;(2)如果表没有定义PK,则第一个not NULL unique列是聚集索引;(3)否则,InnoDB会创建一个隐藏的row-id作为聚集索引;普通索引(上右图):只存储主键值、和索引值根据普通索引查询过程:先从普通索引树检索查看普通索引树叶子节点是否有select全部包含

2021-05-22 10:47:56 245

原创 Tomcat热加载原理剖析

一、热加载时序图二、热加载原理剖析开启热加载在<Context标签中配置reloadable="true"1、StandardEngine容器启动startInternal(),内部会调用父类ContainerBase的startInternal() protected synchronized void startInternal() throws LifecycleException { // Log our server identification info

2021-05-13 19:17:28 940

原创 Tomcat处理请求过程源码剖析

一、处理请求时序图(以tomcat7 nio为列)线程池处理SocketProcessor中请求过程时序图二、源码剖析1、NioEndpointer启动时(启动流程上一篇有时序图)会开启Acceptor、Poller线程默认Acceptor数量是1 ,Poller数量如果是多核就是两个线程,如果单核就是一个线程当然都可以配置如下: acceptorThreadCount、pollerThreadCount配置 <Connector port="8080" protocol="or

2021-05-13 11:09:14 300

原创 tomcat系统架构与原理分析

一、tomcat架构图、组件介绍1、架构图上述组件都可以在server.xml中配置<Server> <Service> <Connector /> <Connector /> <Engine> <Host> <Context /> </Host> <

2021-05-12 20:48:20 430 1

原创 idea部署tomcat9源代码

一 、idea下载源代码(idea2021 ant 1.10)代码路径:https://gitee.com/kangchangchang/tomcatfile->new ->Project from Version control二、源码克隆下来后,不能直接运⾏,需要⽤ant进⾏编译,主要⽬的是下载依赖(1)本地需要安装ant并配置环境变量下载地址: https://ant.apache.org/bindownload.cgi配置环境变量、检查是否安装好:ant -version

2021-04-23 17:28:31 381

空空如也

空空如也

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

TA关注的人

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