java
文章平均质量分 78
神雕大侠mu
侠之大者,为国为民
展开
-
SaaS化多租户实现的两种方法
mybatis-flex 多数据源动态切换原创 2024-09-13 23:05:53 · 502 阅读 · 0 评论 -
单点登录:cas单点登录实现原理浅析
CAS Server 和 CAS Client。CAS-Server 需要独立部署,主要负责对用户的认证工作;CAS-Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS ServerSSO单点登录访问流程步骤:访问服务:SSO客户端发送请求访问应用系统提供的服务资源。定向认证:SSO客户端会重定向用户请求到SSO服务器。用户认证:用户身份认证。发放票据:SSO服务器会产生一个随机的Service Ticket。原创 2024-09-07 19:20:42 · 707 阅读 · 0 评论 -
Spring Event如何优雅实现系统业务解耦
Spring事件(Spring Event)是Spring框架的一项功能,它允许不同组件之间通过发布-订阅机制进行解耦的通信。在Spring中,事件是表示应用程序中特定事件的对象,例如用户注册、订单创建、数据更新等。当这些事件发生时,可以通知其他组件来执行相应的操作。事件是一个普通的POJO类,用于封装与应用程序状态变化相关的信息。通常情况下,事件类继承自ApplicationEvent抽象类,Spring中提供了一些内置的事件,也可以自定义事件。事件发布者是一个接口,用于发布事件。原创 2024-06-09 00:15:12 · 813 阅读 · 1 评论 -
ArrayBlockingQueue与LinkedBlockingQueue底层原理
ArrayBlockingQueue是一个阻塞的队列,继承了AbstractBlockingQueue,间接的实现了Queue接口和Collection接口。底层以数组的形式保存数据,所以它是基于数组的阻塞队列。ArrayBlockingQueue是有边界值的,在创建ArrayBlockingQueue时就要确定好该队列的大小,一旦创建,该队列大小不可更改。内部的全局锁是使用的。方法做法put如果队列满了,就阻塞,当队列不满的时候,会再执行入队操作offer如果队列满了,返回false。原创 2024-03-15 22:29:28 · 608 阅读 · 0 评论 -
sentinel整合nacos在gateway中实现限流
OverrideR error = R.error(500, "限流啦 别在试啦");});原创 2024-02-24 16:10:01 · 1584 阅读 · 0 评论 -
并发控制工具类CountDownLatch、CyclicBarrier、Semaphore
让一些线程阻塞直到另一些线程完成一系列操作后才被唤醒,CountDownLatch主要有2个方法,当一个或多个线程调用await方法时,调用线程会被阻塞,其他线程调用countDown方法时计数器减一(调用countDown方法不会阻塞线程),当计数器的值变为0时,因为调用方法被阻塞的线程会被唤醒,继续执行。N个线程相互等待,任何一个线程没有到达或完成时,所有的线程都必须互相等待。(信号量)可以用来限制能同时访问共享资源的线程上限,它内部维护了一个许可的变量,也就是线程许可的数量。1 收集到:1颗龙珠。原创 2023-12-22 23:13:37 · 499 阅读 · 0 评论 -
java常见的锁的类型
每个线程在获取锁时会先查看此锁维护的等待队列,如果为空或当前线程是等待队列的第一个,就占有锁,否则就加入到等待队列中,以后会FIFO的规则来从队列获取锁ReentrantLock的创建可以指定构造函数的boolean类型来指定得到公平锁或非公平锁,如果不写默认是false-非公平锁。读写锁的内部包含两把锁:一把是读(操作)锁,是一种共享锁;指的是同一线程外层函数获得锁之后,内层递归函数仍然能获取该锁的代码,在同一个线程在外层方法获取锁的时候,在内层方法会自动获取锁。非公平锁吞吐量比较大。原创 2023-12-22 22:51:17 · 616 阅读 · 0 评论 -
CAS原理浅析
CAS 比较并交换 compareAndSwap。CAS是一种乐观锁机制,也被称为无锁机制。全称:它是并发编程中的一种原子操作,通常用于多线程环境下实现同步和线程安全。CAS操作通过比较内存中的值与期望值是否相等来确定是否执行交换操作。如果相等,则执行交换操作,否则不执行。由于CAS是一种无锁机制,因此它避免了使用传统锁所带来的性能开销和死锁问题,提高了程序的并发性能。原创 2023-12-22 14:41:23 · 402 阅读 · 0 评论 -
常见数据结构浅析
往一个容器添加元素时,不直接往Object[]添加,而是先将当前容器Object[]进行copy 复制出一个新得容器,Object[] newElements,然后往新的容器newElements里添加元素,添加完元素后再将原容器的引用指向新得容器setArray(newElements)。这样做的好处是可以对CopyOnWrite容器进行并发读,而不需要加锁,因为当前容器不添加任何元素。把原数组的第index+1后面的数据复制到原数组的index位置复制长度为size - index - 1。原创 2023-12-22 16:21:29 · 476 阅读 · 0 评论 -
网络通信与TCP.IP协议
在TCP协议中,通信双方将通过三次TCP报文实现对以上信息的了解,并在此基础上建立一个TCP连接,而通信双方的三次TCP报文段的交换过程,也就是通常所说的TCP连接建立实现的三次握手(Three-WayHandshake)过程。2次的话客户端收到了服务端的SYN号(同步序列编号(Synchronize Sequence Numbers)),服务端无法确认客户端是否收到自己的同步序列编号。HTTP 协议是基于应用层的协议,并且在传输层使用的 TCP的可靠性通信协议。表示资源的地点(互联网上所处的位置)。原创 2023-11-29 21:51:29 · 658 阅读 · 0 评论 -
redis与分布式锁浅谈
背景:最近遇到一个生产问题,分布式部署了十几条服务器,有个业务过期的定时任务会每天发邮件提醒用户,然而用户最近反馈,每天收到好几封提醒邮件,于是排查多发的原因。指查询一个一定不存在的数据,由于缓存是不命中,将去查询数据库,但是数据库也无此记录,我们没有将这次查询的null写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。加锁大量并发只让一个去查,其他人等待,查到以后释放锁,其他人获取到锁,先查缓存,就会有数据,不用去db。设置锁的自动过期,即使没有删除,会自动删除。原创 2023-06-08 22:46:21 · 1796 阅读 · 0 评论 -
设置接口调用超时时间的N种办法
接口超时时间设置原创 2022-10-30 22:33:23 · 16136 阅读 · 0 评论 -
mybatis使用interceptor实现字段加解密
mybatis使用interceptor实现数据入库加密,查询解密的过程原创 2022-09-22 21:40:12 · 3373 阅读 · 11 评论 -
saas化多租户-动态数据源
多数据源AbstractRoutingDataSource原创 2022-09-06 22:55:13 · 1459 阅读 · 6 评论 -
springboot参数校验的三种方式
springboot校验请求参数的3种方法原创 2022-08-13 00:10:08 · 7368 阅读 · 0 评论 -
java大事记
java踩坑日记原创 2022-02-10 21:48:14 · 1357 阅读 · 0 评论 -
反射与类加载机制总结
反射与类加载机制总结原创 2021-12-28 22:22:20 · 601 阅读 · 0 评论 -
JSR303参数校验与commons-lang3的常见验证
JSR303参数校验与commons-lang3的常见验证一、JSR303参数校验1.1、JSR303参数常用校验,使用的如下的包 在springboot项目中, validation的两个包已经包含在spring-boot-starter-web里面(可自己点进去看),无须再引包,如果不是springboot项目需要引入validation校验的包 <dependency> <groupId>org.springframework.boot&l原创 2021-11-03 22:46:51 · 481 阅读 · 0 评论 -
分布式任务调度xxl-job的简单使用
分布式任务调度xxl-job的简单使用描述:XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用使用步骤:一、下载xxl-job地址:https://gitee.com/xuxueli0323/xxl-job,我目前最新分支是2.3.0用IDEA打开项目,配置好maven和jdkxxl-job-admin:调度中心xxl-job-core:公共依赖xxl-job-executor-samples是原创 2021-10-28 22:59:07 · 1178 阅读 · 0 评论 -
Map集合按value值排序、与javaBean互转以及jdk8的时间操作
Map集合按value值进行排序最近遇到业务是es聚合查询后把返回的数据在前端按柱状图显示,这里就需要按map的value值排序。这里写一个能迅速给map<String,Integer>的数据进行按value排序的方法:public static void main(String[] args) { Map<String,Integer> m = new HashMap<>(); m.put("Pa001",3);原创 2021-07-23 14:24:26 · 499 阅读 · 0 评论 -
jasypt-spring-boot-starter实现加解密和数据返显
jasypt-spring-boot-starter实现加解密和数据返显一、jasypt-spring-boot-starter在springboot中的加解密(默认加密法)①、导包 <!--实现自动 加密解密--> <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-sprin原创 2021-06-26 23:33:50 · 16560 阅读 · 17 评论 -
自定义一个starter
自定义一个starter一、意义starter是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置。starter让我们摆脱了各种依赖库的处理,需要配置各种信息的困扰。SpringBoot会自动通过classpath路径下的类发现需要的Bean,并注册进IOC容器。经常会有一些独立于业务之外的配置模块,我们经常将其放到一个特定的包下,然后如果另一个工程需要复用这原创 2021-06-10 22:44:55 · 1748 阅读 · 0 评论 -
对微服务的监控的两种办法(springbootAdmin、prometheus+grafana)
springboot-admin实现对服务的监控一、actuator客户端(即每一个需要监控的微服务)1、在业务微服务中引入jar包 <!-- 引入Actuator监控依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator<原创 2021-04-28 15:37:35 · 9847 阅读 · 3 评论 -
JMM内存模型与volatile的理解
JMM内存模型理解一、JMM即Java Memory Model,也就是java内存模型。由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),工作内存是每个线程的私有数据区域,而java内存模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作(读取、赋值等)都必须在工作内存中进行,首先要将变量从主内存拷贝到自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,各线原创 2021-04-08 11:05:31 · 328 阅读 · 0 评论 -
JVM调优(jdk8)与垃圾回收器详解
JVM调优与垃圾回收器详解这张是jdk8的jvm模型:红框的是线程共享区域、黑色框的是线程私有(也就是每个线程单独一份)一、JVM内存模型#1、名词解释虚拟机栈描述的是java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stack Frame),用于存储 局部变量、操作数栈、动态链接、方法出口等信息.生命周期与线程相同。栈里面存放着各种基本数据类型和对象的引用本地方法栈:本地方法栈则为虚拟机使用到的Native方法服务(非java代码的接口,比如C++的方法:Runti原创 2021-04-02 16:23:03 · 12644 阅读 · 1 评论 -
alibaba的druid连接池的监控的两种方法
alibaba的druid连接池的监控1、导包(版本自选)这里省略了数据库的其他包只关注druid的相关 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.5</version> </dependen原创 2021-03-30 11:30:22 · 3426 阅读 · 0 评论 -
IDEA配合码云实现代码的git管理
IDEA配合码云实现代码的git管理自己平时开发代码放的很乱,现在整理了一下使用git管理代码,从0开始创建到管理代码的拉去提交。1、自己电脑安装git查看是否安装git(右键鼠标如果有Git GUI Here和Git Bash Here就安装了),如果安装了就下一步了https://git-scm.com/全部点下一步安装到本地,安装完成后右键鼠标会有 Git GUI Here和Git Bash Here一直下一步,给自己电脑安装git安装完后右键鼠标是否有Git GUI Here和Git原创 2021-03-23 11:01:39 · 446 阅读 · 0 评论 -
dom4j读取xml文件的一个小例子
dom4j读取xml文件的一个小例子准备好xml,我准备了一个(记得xml前面不能有空格)<?xml version="1.0" encoding="UTF-8"?><Logs count="8" src="测软件" srcIp="192.168.40.43" srcNO ="SZRJ"><Log code = "Operation_Log" description="软件有害成都检测" id="1" version="0.1"><Item key="lo原创 2021-01-21 20:54:45 · 185 阅读 · 0 评论 -
获取服务器端的ip和浏览器端的ip
记一次获取服务器ip的经历这本书个小事,但遇到了,折腾了好久才解决,浪费时间成了大事获取服务器的ip的方法是:InetAddress localHost = InetAddress.getLocalHost(); String ip= localHost.getHostAddress(); log.info("=========ip======="+ip);但是有的时候获取不到:或者获取出来成了127.0.0.1,这…………还是来看获取真实服务器的原创 2020-12-01 22:32:52 · 2515 阅读 · 0 评论 -
使用Runtime.getRuntime().exec动态的的管理es集群
使用Runtime.getRuntime().exec动态的的管理es集群最近在项目中做了一个使用 界面来控制es的启停,加入、退出集群。现将原理及做法一一记录:在正式做之前先积累点linux的知识做铺垫:1、linux下获取所有用户,只要用户名 String getUser = "awk -F':' '{ print $1}' /etc/passwd"; Process exec0 = Runtime.getRuntime().exec(new String[]{"/bin/sh"原创 2020-11-30 23:19:25 · 343 阅读 · 0 评论 -
堆叠柱状图的后端返回数据格式
堆叠柱状图的后端返回数据格式在开发中常遇到堆叠柱状图,他比普通柱状图复杂,例如:类似这种图,多条折线图等,都是一个意思。这个并不是多高深的技术,但是留下一个模板,遇到了可以回过头来找,找模板写,可以节约时间,就当积累了。首先看数据库:这里以时间和告警类型两个字段分堆叠柱状图,即,每天的每种告警柱状图① 主类 @Override public R getCategorys() { /** * SELECT * ID,date_format(CRE原创 2020-11-25 21:17:05 · 1760 阅读 · 0 评论 -
接口的幂等性与分布式锁redisson
springboot集成分布式锁redisson分布式锁解决本地锁部属中的,分布式部署多服务会同时访问redis。例如:某服务分布式部署了3份,那么在redis为null,至少有3个请求会进入数据库(已使用本地锁的情况下)。理论应该一个区数据库查出来在放入redis。所以,为了解决这个问题,引入redisson①导包 <!--分布式锁redisson--> <dependency> <groupId>org.redisson原创 2020-09-20 16:27:40 · 3032 阅读 · 0 评论 -
分布式事务seata(AT模式)
分布式事务seata(AT模式)seata模式适用于一般场景,不适用于高并发场景。因为锁太多导致串行,没法并发。①给每个微服务加一个undo_log表– 注意此处0.3.0+ 增加唯一索引 ux_undo_logCREATE TABLE `undo_log` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `branch_id` bigint(20) NOT NULL, `xid` varchar(100) NOT NULL, `context原创 2020-08-30 16:00:55 · 1153 阅读 · 0 评论 -
spring-cloud alibaba关于nacos和网关gateway的使用
spring-cloud alibaba关于nacos和网关gateway的使用使用nacos作注册中心和配置中心nacos的注册中心使用①下载nacos : https://github.com/alibaba/nacos/releases,使用java -jar 启动 默认在8848端口② 微服务注册。导包 <!--注册发现--> <dependency> <groupId>com.alibaba.cloud<原创 2020-08-30 11:57:33 · 2648 阅读 · 0 评论 -
spring-cloud使用sleuth+zipkin实现链路追踪步骤
spring-cloud使用sleuth+zipkin实现链路追踪步骤sleuth+zipkin实现链路追踪的作用:它可以帮助收集服务的时间数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现每个服务向zipkin报告计时数据,zipkin会根据调用关系通过Zipkin UI生成依赖关系图,展示多少跟踪请求经过了哪些服务,该系统让开发者可通过一个web前端轻松地收集和分析数据,可非常方便的监测系统中存在的瓶颈使用步骤:① 导包这个放在公共微服务的pom中: <!--链路原创 2020-08-29 23:19:28 · 571 阅读 · 0 评论 -
spring-cloudAlibaba使用sentinel实现熔断限流的步骤
spring-cloudAlibaba使用sentinel实现熔断限流的步骤一、sentinel的熔断、降级a、远程调用熔断是要结合远程调用来实现的(Feign或者openFeign),OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等等。①导包:<dependency> <groupId>org.springframework.cloud</groupId>原创 2020-08-29 23:01:25 · 889 阅读 · 0 评论 -
自定义pageHelper方言
自定义pageHelper方言最近遇到一个业务问题:我们的数据要去impala上去查找,但是呢,impala不支持pageHelper的分页,怎么办?,那么解决办法有两种:一、原生分页自己写PageUtils 。前面有讲过,这里不是重点,不赘述。二、修改pageHelper的方言,让它支持impala的分页。在pageHelper底层注册支持15种数据库的分页(PageAutoDialect),这里需要手动写一个impala 的方言,注册到pageHelper中就可以了。package com.原创 2020-08-15 22:02:53 · 2744 阅读 · 6 评论 -
统计一段时间内的连续时间,每天的数据,无数据则补0
统计一段时间内的连续时间(以天为单位)无数据则补0。项目中常用到这种统计,类似柱状图,或者曲线趋势图,要求时间连续。数据若无则补0 /** * 获取连续的时间,比如统计近一周的数据,返回时间集合(这里以每天作单位) */ public static List<String> getTimeList(){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); List&l原创 2020-08-11 22:22:06 · 1234 阅读 · 0 评论 -
自定义注解记录日志
java使用注解记录日志到数据库最近做了一个注解记录日志,经过反复打磨自觉比较严谨,同时也复习了自定义注解。现记录,方便以后调用。注解部分@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface SysLogRecord { String value() default ""; String describe() default "";}切面记录逻辑部原创 2020-07-20 22:10:46 · 456 阅读 · 0 评论 -
文件夹下文件读取并在内存中模糊查询
文件夹下文件读取并模糊查询最近遇到一个业务需求,觉得有点意思遂记录。需求如此:查询指定文件夹下的所有文件,并获取文件信息,支持分页、模糊查询等。分析:文件在文件夹下,不在数据库,因此读取文件夹所有文件,获取文件信息,在内存中实现分页、模糊查询等功能。首先得引入一个包:<dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artif原创 2020-07-19 16:23:37 · 573 阅读 · 0 评论