自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 架构整洁之道-22章-整洁架构

架构合理分层拆分逻辑和变化

2023-04-02 17:18:07 281 1

原创 VMware centos7 Destination Host Unreachable

VMWARE centos7 Destination Host Unreachable

2022-12-21 20:54:07 2484 1

原创 阿里云依赖冲突 java.lang.NoSuchFieldError: REFLECTION

java.lang.NoSuchFieldError: REFLECTION

2022-11-09 20:13:41 627

原创 RBAC权限与shiro中登录与session的思考

RBAC权限与shiro中登录与session的思考1. 用户登录状态的思考1.1 Session参考多态电脑登录同一个用户/一台电脑登录多个用户服务端如何识别并处理?cookie/session 来保存交互记录从而实现更多功能Session 提供了一种用户跨多个页面请求/访问某个web 服务器的用户信息跟踪、识别机制。Session在网络协议中表示面向连接、保持状态的含义session的实现也许借助cookie在客户端保存标识以便用户身份认证1.2 cookie由浏览器存储的源

2021-12-10 14:12:13 1036

原创 Java Itextpdf 导出pdf

Java Itextpdf 导出pdf需求公司新需求:导出前端页面上的某个部分为pdf,由于涉及领导签名的图片以及只是页面的一部分而非整个页面 这个需求交给后端完成接下去我将以Java为基础讲述在服务端如何导出pdf思路使用itextpdf+原生Document编写过于麻烦需要掌握大量元素,在后端写前端页面使用itextpdf + pdf模板对基本字段替换支持较好样式不好看需要自己绘制模板,工具有限使用html模板+html转为pdf可以与前端同学配合完成cs

2021-11-18 17:27:33 1022

原创 MySQL 大量异常数据导致慢查询

MySQL 大量异常数据导致慢查询现象服务端生产环境报错org.springframework.dao.RecoverableDataAccessException: ### Error querying database. Cause: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure The last packet successfully received from the serv

2021-11-17 20:25:33 764

原创 3. JVM GC算法及具体垃圾收集器

3. JVM GC算法及具体垃圾收集器3.1 基础目标哪些对象(内存)需要回收什么时候回收如何回收GC和内存分配的作用当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就必须对这些“自动化”的技术实施必要的监控和调节。什么内存需要回收?jvm内存划分PC jvm虚拟机栈 本地方法栈 堆 方法区其中前三个随着线程的创建和消亡分别进行内存分配和回收 因此主要关注点放在堆和方法区3.2 对象已死?从上面的什么内存许要回收中我们知道许要回

2021-10-15 18:39:26 175

原创 java前中后 遍历 递归与非递归

public class TreeTraversal { public void preOrder(TreeNode root){ // 先序递归 if (root == null){ return; } // 根左右 每个节点都访问三次 System.out.println("root.val = " + root.val); preOrder(root.left);

2021-10-13 22:20:48 105

原创 Reids stream 非阻塞轮询导致QPS飙到1.8W

Reids stream 非阻塞轮询导致QPS飙到1.8WQPS监控 触发报警机制,最近redis被用来做简化版消息队列了在测试环境也发现这个现象,打印执行中的堆栈命令jstack -l xxxx > jstack.log at org.springframework.data.redis.stream.StreamPollTask.doLoop(StreamPollTask.java:138) at org.springframework.data.redis.stream.Strea

2021-09-14 18:24:50 554

原创 1241 - Operand should contain 1 column(s)

MYSQL 出现 1241 - Operand should contain 1 column(s)操作数应该包含一列错误原因:使用操作符出现问题例如=后面应该只能跟一列status_code = (1,2,3) 而不是status_code in (1,2,3)或者in出现问题in (select a,b from table_c)in后面应该只跟一列字段...

2021-07-06 11:24:40 1979

原创 基于redis stream + spring boot的消息队列机制简单实现

基于redis stream + spring boot的消息队列机制简单实现1.通知结构整体设计2.流程解析在各个不同的功能点都可能触发消息通知,借助LxNoticeStreamUtil#addNoticeMessage(Integer noticeAction,String actionParam)方法将消息推送到指定队列在程序启动时就会由StreamConsumerRunner启动MQ的监听器StreamMessageListener,一旦有消息产生,监听者自动接收消息,并解析执行

2021-06-26 15:06:29 1444

原创 Redis 字符串SDS源码解析

Redis 字符串SDS源码解析1.简介redis 字符串简单动态字符串(simple dynamic string,sds)底层采用柔性数组的特殊结构体具有二进制安全,占用空间小,结构紧凑等特点。接下去将介绍sds的基础结构体以及初始化、数据清理、扩容三个方法2.基础结构体为解决定长字符串占用额外空间的问题将字符串分为三种长度,短字符串占用空间小,可通过长度+类型整合进一步压缩容量。基础结构定义// 01234代表某个结构体存储数据的长度占多少个字节#define SDS_TYPE_5

2021-06-23 15:07:45 120

原创 2.JVM自动内存管理

2.自动内存管理2.1 概述Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。C++需要对构建的每个对象的生命周期进行管理和维护。Java把对象的生命周期(内存管理)交给了JVM,简化编码,但一旦出现问题则很难排查。2.2 运行时数据区Java运行时将内存分为不同区域以方便进行内存管理(例如垃圾回收)。分为线程私有和线程共享线程私有程序计数器本地方法栈虚拟机栈线程共享堆方法区2.2.1 程序计数器程序计数器

2021-06-17 23:17:20 319 3

原创 NGINX 实现jar包灰度发布

NGINX 实现jar包灰度发布1.目标实现jar包在服务器上部署不影响用户使用2.思路 部署多个服务,通过NGINX进行负载均衡,避免服务不可用,但任存在服务调用会出现成功/失败的切换 解决方案:通过心跳检测,尽可能实时的观察服务状态,如果服务不可用(在重新部署或其他故障),自动进行故障转移,将请求分发到可用服务上 Java热部署 本质通过运行时动态加载新的class文件实现,但实现困难,没有完整的支持java -jar的部署方式,并且生产环境基本不会用热部署,只.

2021-06-07 18:34:10 456 2

原创 shiro 登录流程源码分析

shiro 登录流程源码分析 获取subjectSecurityUtils.getSubject() 从ThreadContext获取subject 借助ThreadLocal实现线程私有 从线程私有变量的存储map中使用特定key(org.apache.shiro.util.ThreadContext_SUBJECT_KEY)获取subject对象 ThreadLocal#get()是从当前线程保存的私有map拷贝一个返回 ..

2021-06-03 20:14:16 215

原创 OkHttp在jdk11版本下升级变动

Caused by: java.lang.UnsupportedOperationException: clientBuilder.sslSocketFactory(SSLSocketFactory) not supported on JDK 9+获取不走X509证书认证的基于OkHttp的https请求调用客户端

2021-05-31 10:15:32 695

原创 shiro@RequiresPermission校验实现

shiro-spring借助Spring AOP特性实现shiro的注解式校验引入shiro-spring依赖后一定要注入AuthorizationAttributeSourceAdvisor以便借助spring aop进行shiro注解校验 @Bean public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) ...

2021-05-29 14:52:15 852 2

原创 idea出现decompiled .class file 解决方案

idea出现decompiled .class file 解决方案问题原因idea借助反编译插件从.class文件中获取的源码, 并不会携带javadoc。解决方案File->Project structure 选择本地jdk路径即可

2021-05-23 15:12:28 17986 2

原创 shiro用户信息自动更新并删除授权缓存

shiro用户信息自动更新并删除授权缓存业务场景一个权限管理系统下需要切换系统空间,此时需要更新登录用户在不同空间下的用户信息。一个用户在一个空间下会拥有特定的功能权限,因此切换空间的动作会引起当前登录用户功能权限变更。思路通过shiro框架进行登录用户权限管理每个登录用户在shiro中都使用Subject来标识根据subject获取principal将principal反序列化为存储用户信息的POJO对象修改对象中的某项参数达成更新不同空间下用户信息的需求删除用户之前的授权缓存,让下

2021-05-16 13:08:23 1641 1

原创 Redis Stream 消息队列的简单应用

Redis Stream 消息队列的简单应用目标借助Redis Stream构建一个简单消息队列有以下特点:拥有一个不断增长的队列,但支持容量限制自动缩容,避免超出内存限制,并支持配置化开启消息监听,支持 consumer group 监听队列手动确认与消息重试机制,消息被消费并不出现问题时手动确认消息消费,如果出现异常则通过补偿机制对未处理完成队列(pending list)中的消息进行重试。Redis Stream 基础概念介绍基本数据结构中间最核心的是一个基础的消息队列,队列中的

2021-04-17 16:12:31 710

原创 springboot 将yaml属性注入转为list

@Value("#{'${a.b}'.split(',')}")private List<String> testList;

2021-04-13 11:02:15 1078

原创 剑指 Offer 04. 二维数组中的查找

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16, 22],[10, 13, 14, 17, 24],[18, 21, 23, 26, 30]]给定 target = 5,返回 true。给定 ta

2021-04-08 19:52:58 71

原创 剑指 Offer 53 - I. 在排序数组中查找数字 I

剑指 Offer 53 - I. 在排序数组中查找数字 I统计一个数字在排序数组中出现的次数。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: 2示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: 0限制:0 <= 数组长度 <= 50000来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/zai-pai-xu-shu-zu-zhong-ch

2021-04-06 21:43:08 93

原创 java 数组与list互相转换

public static void main(String[] args) { // 数组转list String testStr = "a,b,c"; String[] myArray = {"a","b","c"}; List<String> arrayToList = new ArrayList<>(Arrays.asList(myArray)); System.out.println("...

2021-04-01 17:35:26 72

原创 Java请求跨域处理

Java请求跨域处理参考Access to XMLHttpRequest at ‘http://localhost:88/api/sys/login’ from origin ‘http://localhost:8001’ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: No ‘Access-Control-Allow-Origin’ header is

2021-03-28 18:30:05 1325

原创 nacos+spring cloud gateway 出现503 Service Unavailable

由于nacos自带spring-cloud-starter-netflix-ribbon,并且spring-cloud-gateway自动集成ribbon,如果将nacos的ribbon去掉,则出现503错误,无法通过lb路由到指定微服务 <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-start

2021-03-28 17:13:46 9830 15

原创 idea 在选中范围内替换数据

选中内容后CTRL+R记得勾选search in selection only 即可只替换指定范围内容shift+alt+insert可切换为块选择

2021-03-25 14:24:46 5214

原创 springcloud gateway 映射失效

网关解决的问题:自动路由,反向代理,负载均衡鉴权、监控使用spring cloud gateway路由匹配predicate 并到达指定位置请求过来通过handler mapping来判断是否可以处理,能处理通过handler去处理,处理前经过一系列filtergateway配置id代表某一条规则uri代表目的地predicate代表路由规则,解析请求头、请求方法、请求时间、请求路径等请求参数才可路由到uri的目的地filter代表过滤器,可在请求过程中额外添加参数使用:

2021-03-14 15:55:05 2249 1

原创 nacos 无法获取DATAID 配置刷新失败

遇到nacos上变更完后本地触发拉去动作,但无法获取DATAID的缓存导致本地刷新失败,引用@RefreshScope注解的目的在于 将某个类的scope声明为可刷新模式,spring boot默认的bean实例是单例模式以节省空间,而想动态加载配置文件就意味着某个bean需要刷新,因此需将Java类声明为@RefreshScope以达成此功能。但是版本不一致的清空下使用springboot2.4.3+spring cloud 2020.0.1 + nacos1.4.1 +spring cloud ali

2021-03-13 16:47:52 5197

原创 MYSQL 索引优化

SQL优化被驱动表(大表)会用到索引left join在优化关联查询,只有被驱动表建立索引才有效,LEFT JOIN 小表驱动大表 左表驱动右表,因此在右表构建索引生效,而在左表构建则不生效,即使左表用到了索引扫描的行数依旧未变inner join 自动选择小结果集作为驱动表,如果两表都构建索引,且数据量一样,默认使用右表索引,如果削减右表数据量使左表作为大表此时 索引使用 左表,依旧使用大表上构建的索引# 测试SQLselect id,status_code from event_p

2021-03-12 18:50:41 82

原创 0311小结

0311定时任务先设定各自的开始时间后续用设计模式优化positivenegativecron简单更新冲突,统计必须晚于数据更新observer相对复杂在更新完后通知刷新数据由于事务的存在可能并不一定产生冲突等待数据运行及测试看成果观察者设计模式设定观察者接口,指定update方法具体实现类实现观察者接口,update方法调用具体事务,可为update方法开启事务避免无法使用事务设定subject类,维持observer接口obser

2021-03-11 20:06:11 77 1

原创 JVM_走近Java_ch.1

深入理解Java虚拟机世界上并没有完美的程序,但我们并不因此而沮丧,因为写程序本来就是一个不断追求完美的过程。当我们在使用一门技术时,不再依赖书本和他人就能得到这些问题的答案,那才算升华到了“不 惑”的境界。走近JavaJava技术体系Java程序设计语言·各种硬件平台上的Java虚拟机实现·Class文件格式 ·Java类库API·来自商业机构和开源社区的第三方Java类库我们可以把Java程序设计语言、Java虚拟机、Java类库这三部分统称为JDK(Java Development

2021-03-11 17:52:59 63

原创 mysql 索引 using temporary场景

底层结构B+Tree和B-TreeB-Tree 数据与记录放在一起,中间节点存储数据,B+Tree中间节点只存储索引不存储数据,具体数据都在底层B-Tree 读取速度不稳定,越接近顶层速度越快,B+Tree读取时间稳定,数据都放在底层。由于上述特性B+Tree有如下优势:由于中间节点不存放数据,所以同样层数,B+Tree存储的索引更多容纳的数据量更多叶子节点连在一起方便范围查询聚簇索引:数据存储方式,为数据顺序存储在磁盘innodb支持,由于聚簇索引只能选取一个主要因素来排序因

2021-03-10 20:15:15 919 1

原创 数据库树形结构存储方法的选择

树形结构存储方法的选择简单的方法跟踪多级回复构成的树形分支:parent_id一开始的思路使用parent_id跟踪分支使用先找出所有节点,按照一定顺序整合成树形结构缺陷:在深度过深时仅用parent_id需要执行很多次SQL才能获取给定主题的所有数据每天的数据变动可能非常大,每访问一次整合一次过于浪费时间且不切实际目标:一个更好的存储多级结构及简单高效获取一个完整分支的方法分层存储合查询树形结构举例:组织架构图、线程化讨论解决方案邻接表依赖父节点构成的邻接表,由paren

2021-02-04 17:31:27 3780 1

原创 数据库存储的多叉树遍历

多叉树遍历针对数据库仅由PID存储父子结构的情况递归遍历数据库全量取出数据根据pid找出第一批节点递归组装剩下节点遍历根节点,找到根节点的下一层节点深度优先遍历public List<Node> compositeChildren(Integer pid,List<Node> allNodes){ List<Node> children = new ArrayList<>(); // 找到下一层的子节点 allNod

2021-02-04 17:26:16 419

原创 spring自定义pojo参数映射原理

自定义pojo参数映射原理树形结构的存储方案选择与设计自己通过反射产生的JavaBean如何交给spring容器管理HttpServlet接口由spring实现FrameworkServlet get/post -> doService衍生到子类DispatcherServlet实现doDispatcher来分配并执行方法,getHandler(processedRequest)获取合适的handlerExecutionChain来执行请求找到HandlerAdapter

2021-01-31 17:20:55 660

原创 网络协议模型

网络协议模型应用层通过HTTP协议发起请求请求方法,协议版本,数据格式传输层通过TCP协议进行三次握手建立连接,四次挥手释放连接三次握手需要双方都知道自己的发送/接收没问题四次挥手需要双方都想要关闭并且得到对方确认网络层通过封包(source ip destination ip)+数据进行数据包传递网络层在局域网内通过子网掩码确认交给哪个IP地址去处理请求,内部局域网直接转发,如果连接外网则通过网关地址,网关地址如何找到对应物理设备则通过链路层数据链路层通过ARP协议在网络层

2021-01-22 09:50:46 175

原创 springmvc 请求映射原理

请求映射原理DispatcherServlet请求拦截:重写HttpServlet的HttpServletBean没重写doGet/doPost有继承的子类FrameworkServlet实现doGet/doPostFrameworkServlet实现的方案都指向processRequest(request, response);processRequest中指向doService方法,然而并没有直接实现doService衍生到子类DispatcherServlet的doS

2021-01-21 13:35:35 477

原创 文件上传 参数设定 源码分析

dispatcher接到请求判断请求是否是multipart文件请求是就转为StandardMultipartHttpServletRequest调用handle处理请求已转为multipartFiles由于使用POJO封装来接收参数所以使用ServletModelAttributeMethodProcessor去解析参数,否则单纯的文件标注@RequestPart注解的就调用RequestPartMethodArgumentResolverattribute = cre..

2021-01-09 13:50:25 163

原创 mysql一列多值多属性设计-乱穿马路

乱穿马路需求:每个产品都可能有多个联系人简单方案:将单值存储改为逗号分隔存储多值常用逗号分隔的列表来避免在多对多关系中创建交叉表,这是一种反模式,称为乱穿马路(Jaywalking),因为可以避免十字路口目标:存储多值属性如何在一列中存储一系列相关数据的集合一个账号对应多个产品每个产品对应一个联系人但每个产品可能对应多个联系人反模式:格式化的逗号分隔列表查询指定账号的产品查询异常困难,不能再用等号不得不借助模式匹配困难出错且无法带来性能的优势查询指定产品的账号多表连接也不

2020-12-25 19:52:54 930

空空如也

空空如也

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

TA关注的人

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