自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(150)
  • 资源 (3)
  • 收藏
  • 关注

原创 008-shiro使用token认证

实际开发中,我们的项目大多数都采用前后端分离或者集群的方式部署。在这些情况下,往往会有些问题,比如前后端分离的跨域问题、跨域携带cookie的问题、分布式应用下的session共享等问题,虽然这些问题都能得到相应的解决,但总是觉得没有直接使用token或者jwt方便。接下来我们来对我们目前实现的shiro功能进行一些修改,让它能直接使用token的方式进行认证。编写axios异步请求当然JQuery或直接AJAX请求也可以现象:重新DefaultWebSessionManager的getRe.

2021-05-25 18:24:32 8299 2

原创 CXF统一异常处理

关于CXF的其他介绍,此处不做讨论,本文主要考虑CXF的统一异常处理。目录CXF默认的异常处理异常出现的地方ExceptionMapper接口CXF默认的异常处理CXF的中的异常,最终都会被包装成Fault对象,在CXF自定义的拦截器中,常常见到如下代码:throw new Fault(new RuntimeException("异常信息"));默认情况下,CXF使用xml返回,那么默认的异常处理应该没有问题(我主要使用的是Json方式处理,所以在默认情况下异常..

2017-09-27 18:03:53 7279

原创 JUC ThreadLocal

在此,请大家先回顾一下我们在 JVM 专栏《JVM GC 垃圾收集器》一章中提到的几种引用的类型(强软弱虚),以及它们在 GC 时的特点,这样有助于理解该问题。其实 ThreadLocal 在我们上面的示例中的引用关系,除了在线程中(我们上面总结的引用关系图),还有就是在我们的 car 对象中,所以最终我们的引用图是这样的。

2024-02-07 08:39:30 1052

原创 JUC CompletableFuture

几乎所有的方法都返回了 CompletionStage ,这是链式调用的特性所有的方法参数都使用了函数式接口,一是可以 Lambda 表达式,二是根据不同的函数式接口的特性达到不同的执行要求不带 Async 的方法为同步方法,带 Async 的方法为异步方法这些方法分为 3 大类阶段成功才执行函数式接口(函数式接口的参数为当前阶段的结果)阶段失败才执行函数式接口(函数式接口的参数为当前阶段出现的异常)

2024-01-31 07:30:00 988

原创 JUC Future 与 ForkJoin

工作窃取指的是允许空闲线程从繁忙线程的工作队列中窃取任务。对于 CPU 密集型的任务,并不是设置越多的线程性能越高,因为在计算时需要使用 CPU,极端情况下,CPU 是没有空闲时间的,如果线程数设置过多,反而由于线程之间对 CPU 资源的争抢造成不必要的上下文切换导致性能下降。在 Fork/Join 之前,我们在线程池中执行的线程之间是没有直接的关联的,这种情况下,如果我们某一个线程的执行需要另一个线程的执行结果,就没有办法实现,所有 JDK1.7 引入了 Fork/Join 框架。3. 造轮胎(1s);

2024-01-26 09:56:42 694

原创 JUC BlockingQueue(阻塞队列)

(这里要注意:出队是出的根元素,之后的元素会按出队规则进行移动,形成新的、符合其规则的完全二叉树)我们可以把它当做一个线程安全的容器,有了它,我们可以更简单且安全的进行在多线程下存取“数据”存取操作。补充说明:Delayed 的 getDelay 方法,其实就是判断是否到了执行时间,只要 getDelay 返回小于等于 0,则任务出队执行,否则继续阻塞等待。BlockingQueue 这么多方法,其实就两个操作,存和取。由于这里的知识太过零散,用文字的方式不好表达,这里总结为思维导图,通过图片分享出来。

2024-01-23 16:48:58 384

原创 JUC 线程池

日志反应的比较清楚,我们的线程池只有2个线程,线程2 执行了两个提交的任务,f1 的结果为任务返回的结果,f2 的结果为我们提交任务是传的结果,f3 不返回结果(因为 Runnable 接口的 run 方法返回值为 void)这里的线程名称格式为:pool-[虚拟机中线程池编号]-thread-[线程编号],如 pool-1-thread-1,在实际使用时我们最好自定义线程名称,以提高日志的可读性,避免日后排查日志无法第一时间确定执行的线程。如果没有则继续等待,直到有空闲线程执行。

2024-01-17 16:59:51 911

原创 JUC CAS 和 原子操作类

AtomicStampedReference 引入了 stamp (版本号)来区别每次的修改,即便修改后的值与之前的某个状态的值一致,其版本号也是不同的。compareAndSet(int expect, int update) :expect 表示修改时的原值,update 表示要修改为的值,如果修改成功 方法返回 true,如果修改失败,方法返回 false。其是一种乐观锁的算法实现,本身不加锁。比如原值为 V=10,线程1修改值为 B = 5,线程2修改值为 b = 3,CAS 操作的过程为。

2024-01-15 09:22:15 964

原创 JUC Lock 计数锁

Semaphore 在实际应用中其实使用得并不多,因为当资源较少的时候,可能造成大量线程阻塞。而且我们使用线程池的方式也可以达到这些效果,而且线程池的使用更简单。

2024-01-09 09:46:20 829

原创 JUC Lock 读写锁

文章目录ReentrantReadWriteLock^1.5+^ 读写锁ReentrantReadWriteLock 继承关系图示例 1示例 2先获取读锁再获取写锁先获取写锁再获取读锁锁降级总结StampedLock^1.8+^ (邮戳锁)基本使用示例1示例2示例3StampedLock 源码文档上的示例ReentrantReadWriteLock1.5+ 读写锁对共享数据的查看、查询就是读,对共享数据的修改就是写,读时不会涉及共享数据的修改,不修改意味着多个线程读取的数据就不会变化,那么在此情况下多

2024-01-09 09:41:10 1061

原创 JUC AQS(AbstractQueuedSynchronizer)

1.5+/*** 等待队列的头,懒初始化的,在初始化后,只能通过 setHead 方法修改* 如果 head 节点的存在,则 head 的状态 waitStatus 不会是 Node.CANCELLED 的* 出队,就是从 head 出/*** 等待队列的尾部,懒初始化,初始化后只能通过 enq 方法添加新的等待节点/*** 同步器的状态* 通过 getState、setState、compareAndSetState 方法操作/** 标识节点为共享模式 */

2024-01-04 19:00:00 919

原创 JUC Lock 锁入门

每一个锁关联一个线程持有者和计数器,当计数器为 0 时表示该锁没有被任何线程持有,那么任何线程都可能获得该锁而调用相应的方法;而该持有锁的线程如果再次请求这个锁,就可以再次拿到这个锁,同时计数器会递增;t1 线程优先获得锁,所以会打印,t2 线程尝试获得锁且等待5秒,t1线程在2秒后就会释放锁,所以t2获得了锁。简单的说就是当持有该锁的线程再次尝试获取该锁时,不会被阻塞(因为他已经持有该锁),而另外的线程尝试获取该锁时将被阻塞。比如:t1线程已经获得A锁,进而请求B锁,t2线程已经获得B锁,进而请求A锁。

2023-12-31 18:00:00 1001 1

原创 JUC JMM Java 内存模型

(就是存储在堆内存的变量:如 对象的字段、static 静态变量等都是多线程共享),数据就从内存向上,先到 L3,再到 L2,再到 L1,最后到寄存器进行 CPU 计算。如我们在 JMM 可见性中的示例,volatile 关键字可解决可见性问题,用于保证某个共享变量被某个线程操作后,其操作后的结果对其他线程立即可见(重新从主内存获取更新后的值到副本),我们在上面的 JMM 可见性中的示例就是 volatile 保证可见性的一个示例。是指同一个操作不可打断,在多线程情况下,操作不能被其他线程锁干扰。

2023-12-28 13:30:00 799

原创 JUC Thread 基础回顾

文章目录并行与并发进程与线程线程切换上下文创建线程的方法用户线程和守护线程Thread 常用方法实例方法类方法线程打断示例线程的状态线程安全怎样尽可能的避免线程安全问题线程同步synchronized经典示例错误写法添加 synchronized 关键字最小化同步块最小化同步块,并进行重入判断Monitor 监视器(管程)Monitor 的核心组成部分锁优化轻量级锁自旋优化偏向锁偏向锁和轻量级锁锁消除wait 和 notify/notifyAll示例:点外卖并行与并发并发(concurrent):是指

2023-12-26 10:05:07 986

原创 JVM 监控命令详解

但并不是所有的选项参数都能修改,需要是标记为 manageable 的才能修改。注意:动态修改职能针对当前的进程,当我们的应用重启之后进程其实就变了,所以这里的动态修改也就是在线排查或在线调优的时候用一用。导出 JVM 内存映射,它可以获取 dump 文件,还可以获取进程的内存相关信息,包括各区域的使用情况等。这里的进程id和操作系统的进程id是一致的。第二列是显示的当前正在执行的 Java 程序的名称。从以上信息我们可以知道,当前进程中,大部分对象都在老年代,说明我们的很多对象生命周期过长了。

2023-11-22 11:03:55 1329

原创 JVM GC 垃圾收集器

区域化分代式垃圾收集器,G1 是并行收集器,它把内存分割为很多不想关的区域(Region),每个Region可能是 Eden区,幸存者1区或幸存者0区,老年代等,这样可以避免在整堆中进行垃圾收集,将整个堆化整为零,一次回收其中一个或一些 Region,G1 进行垃圾回收时,会优先收集价值比较大的Region(可以认为当前不可达对象比较多的 Region 为价值比较大)。但实际使用中,由于各种疏忽,导致某些对象的生命周期超长,长时间无法释放,最后导致这种对象越来越多,最后 OOM,目前也称之为内存泄漏。

2023-11-09 20:45:00 230

原创 JVM 内存和 GC 算法

垃圾是指在运行程序中没有任何指针指向的对象。如果不及时堆垃圾进行清理,这些垃圾会一直占用内存空间,直到程序运行结束,在这期间这些对象所占用的内存无法使用,造成极大的资源浪费。

2023-11-03 12:05:45 599

原创 JVM 运行时数据区

当 Eden 区内存空间不足(满了),没有空间存放新 new 的对象时,JVM 会进行垃圾回收(此时的垃圾回收称为 YGC或 Minor GC),此时会将 Eden 区不再使用的对象(有多种判断方式,这个我们后面再说)进行销毁,还在使用的对象移动到 Survivor 0 区,并为其标记年龄(初次放入幸存者区的对象年龄标记为 1)不同的垃圾回收器,可能有所不同,可根据具体情况而定。本地方法栈用于管理本地方法,由线程私有,可以被设定为固定大小或者动态扩展的内存,本地方法在本地方法栈中记录,由执行引擎调用。

2023-10-26 09:20:39 163

原创 JVM 类的加载子系统

一般的 Java 程序中,使用引导类加载器、扩展类加载器、系统类加载器相互作用,即可。几乎不需要自定义类的加载器,我们可以在某些情况下进行自定义加载器。修改类的加载方式还比如我们对编译的源码进行了加密,在类加载时需要解密等继承 ClassLoader 重写 findClass(String name) 方法按照 URLClassLoader.FactoryURLClassLoader 继承 URLClassLoader 的方式继承 URLClassLoader 来实现即可。

2023-10-23 14:06:19 497 1

原创 JVM 入门

JVM (Java Virtual Machine),Java 虚拟机,我们的 Java 代码需编译为 .class 字节码文件,经过 JVM 来执行。如今的 JVM 其实可以不止执行 Java 代码,任何语言,只要编译为 JVM 支持的字节码,就可以使用 JVM 来执行。Java 之所以可以垮平台执行,其实是因为在不同的平台上都有对应版本的 JVM 可以执行 Java 编译之后的字节码。上图为 Java 8 的官方文档中的图片,其清晰的表达了JDK、JRE、JVM 之间的包含关系。

2023-10-12 10:33:18 368

原创 RocketMQ 消息过滤、存储和ACL

使用消息过滤的方式,即可在 MQ 服务端进行消息的过滤,将消息投递给特定的消费者,使每个消费者只需关注与自身相关的消息进行消费。tag 标签过滤方式为,生产者发送消息时为消息设置一个 Tag 标签,消费者在消费时匹配该 Tag ,如果匹配则消费发送给该消费者,如果不匹配则不发送。注2:对于某个资源(比如:topic),如果有其对应的权限配置,则使用配置的权限,如果没有配置则使用默认的权限。注意:IP 白名单如果通过,则不会验证签名,如果你要使用签名方式认证,最好就不要设置对应的 IP 白名单。

2023-10-07 09:46:29 753

原创 String 进阶

大量的 String 对象使用的时候,比如:String 数组或大的集合中存放 String 对象,可以对String对象先调用 intern 方法返回常量池引用后存放。这样的好处是,最后这些大量的引用都引用的常量池的对象,堆中的对象可以正常 GC 释放。,在调用 intern 方法的时候,不是在常量池中创建一个新的对象 “ab”,而是将当前堆中 new 的 “ab” 的引用赋值给了常量池的引用,导致堆和常量池中的引用都指向了同一个地址。如果常量池中有对应字符串对象,则返回已有的字符串对象地址。

2023-10-02 10:47:20 118

原创 RocketMQ 消息重试机制

RocketMQ 消息重试分为发送重试(生产者)和消费重试(消费者)

2023-09-25 10:10:07 2123 1

原创 RocketMQ 消费者分类与分组

在消费过程中,前面的消息M1、M2被消费者Consumer A1处理时,只要消费状态没有提交,消费者A2是无法并行消费后续的M3、M4消息的,必须等前面的消息提交消费状态后才能消费后面的消息。消费者获取某条消息后,服务端会将该消息加锁,保证这条消息对其他消费者不可见,直到该消息消费成功或消费超时,因此,即使多个消费者同时消费同一队列的消息,服务端也可保证消息不会被多个消费者重复消费。使用此命令,我们可以添加消费者分组,并且可以设置分组相关信息,比如-o 顺序消费,-r 最大重试次数等。

2023-09-22 09:02:32 742 1

原创 RocketMQ 发送事务消息

在断网或者是生产者应用重启的特殊情况下,若服务端未收到发送者提交的二次确认结果,或服务端收到的二次确认结果为Unknown未知状态,经过固定时间后,服务端将对消息生产者即生产者集群中任一生产者实例发起消息回查。此图我们还是按照用户订单支付操作的例子来说明,订单支付操作是订单系统的操作,其对应一个本地事务(branch 2),其余下游系统都是在这个支付事务之后需要执行的事务(branch 2.1、branch 2.2、branch 2.3)。我们的消费者代码和普通消息的消费者是一样的,无需特殊的处理。

2023-09-20 10:07:33 321

原创 RocketMQ 发送顺序消息

MessageQueueSelector 意为队列选择器,Remoting 协议客户端中没有 消息组的概念,所以需要我们手动的为消息进行分组(将需要严格顺序的消息放在同一个队列),这个接口就是完成此任务的,而且分组的逻辑需要我们自己实现。RocketMQ 顺序消息的顺序关系通过消息组(MessageGroup)判定和识别,发送顺序消息时需要为每条消息设置归属的消息组,相同消息组的多条消息之间遵循先进先出的顺序关系,不同消息组、无消息组的消息之间不涉及顺序性。要保证生产的顺序,需要满足以下条件。

2023-09-18 09:33:10 549

原创 RocketMQ 发送延时消息

Remoting 协议客户端关于延时消息与gRPC协议客户端有不一样的地方,gRPC客户端只允许设置24小时内的延时(推荐使用方式),Remoting 协议客户端关于延时消息的设置更多,但是真不建议设置过长的延时时长,这样可以有效的避免消息的堆积。如果真的需要设置5天或者10天的延时消息,可以使用定时任务扫描 + 发送延时消息的方式来实现细粒度的延时任务,比如:2023-10-1 9:00 下单,在10 天后,2023-10-11 9:00 时需要撤销订单。延时消息:消息在特点的时间之后触发消费。

2023-09-15 13:45:50 246

原创 RocketMQ 发送普通消息

因此,大部分场景下,单一进程内同一个消费分组只需要初始化唯一的一个消费者即可,开发过程中应避免以相同的配置初始化多个消费者。普通消息一般应用于微服务解耦、事件驱动、数据集成等场景,这些场景大多数要求数据传输通道具有可靠传输的能力,且对消息的处理时机、处理顺序没有特别要求。对于生产者的创建和初始化,建议遵循够用即可、最大化复用原则,如果有需要发送消息到多个主题的场景,无需为每个主题都创建一个生产者。主题的类型与消息的类型要对应,所以普通消息的主题类型为 Normal。

2023-09-12 16:25:26 98

原创 RocketMQ 主题(Topic)管理

Topic 是 RocketMQ 中消息传输和存储的顶层容器,用于表示同一类业务逻辑的消息。比如:我们将通知类消息和业务类消息进行隔离,就可以使用不同的主题。也可以通过主题的分隔来做身份识别和鉴权等。RocketMQ 5.x 版本开始,不建议使用自动添加主题,主题作为 RocketMQ 的顶层容器,需要严格合理的创建与管理,而且主题的创建与管理会占用一定的系统资源,所以特别是在生产环境下增删改查都不要随意进行。

2023-09-04 15:01:36 1610

原创 RocketMQ 安装与入门

Apache RocketMQ 自诞生以来,因其架构简单、业务功能丰富、具备极强可扩展性等特点被众多企业开发者以及云厂商广泛采用。历经阿里十余年的大规模场景打磨,RocketMQ 已经成为业内共识的金融级可靠业务消息首选方案,被广泛应用于互联网、大数据、移动互联网、物联网等领域的业务场景。

2023-09-01 14:17:41 347

原创 Elasticsearch 快照生命周期管理(自动化快照)

在我们实际工作中,常常是需要定期快照,定期保存的,避免数据丢失。retention 中的配置表示,快照有效期3天,最大个数为50个(大于50即便没过期最旧的也会被删除),最小个数为5个(即便过期了,也不会被删除)human 表示以人类可以看懂的方式回显(虽然直接看也费劲),比如我们的结果中时间就会显示为年月日的方式,而不是直接的毫秒数。快照名称是动态的,按时间格式生成的。结果中的时间都是UTC时间,es 中好像不支持配置时区,所以这些时间查询出来需要做时区处理。如果策略已经存在,则此请求会增加策略的版本。

2023-08-04 20:00:00 503

原创 Elasticsearch 快照和恢复

快照是正在运行的Elasticsearch集群的备份。定期备份群集,无需停机删除或硬件故障后恢复数据在群集之间传输数据等默认情况下,集群的快照包含集群状态、所有常规数据流和所有常规索引快照必须存储在存储库中,存储库的内容不能修改,否则会造成快照损坏或导致数据不一致等一系列问题。所以在创建快照之前,需要先创建存储库。

2023-08-02 16:29:22 1678

原创 linux 安装FTP

yum安装FTP服务器

2023-07-31 16:19:59 746 1

原创 Elasticsearch 分片策略

和数据库中的表空间类似,不过分片是为每个索引设置,一个索引可以有多个分片,分片分为主分片和副本分片,主分片和副本分片类似于数据库中的主库和备库。注:主分片并不等于主节点,主分片可能存在于 ES 集群的非主节点上。这是由分片分配功能决定的。这个我们下面会说。

2023-07-25 10:06:10 2037

原创 Elasticsearch 集群安装

第一次启动 Elasticsearch 集群需要在集群中的一个或多个符合主资格的节点上显式定义一组初始符合主资格的节点,这称为集群引导。对于整个集群来说,主节点非常重要,主节点负责的集群事物也很多,意味着主节点要消耗更多的资源,为避免主节点因其他事物而过载,我们可以设置主节点为专用主节点。仅投票的主节点是参与 主节点选举但不会充当集群选举主节点的节点。注意:新节点启动之后,还会有集群间的分配平衡过程,此过程会消耗一定的时间,所以在一定的时间范围内,我们可能得到yellow 的状态,这是正常现象。

2023-07-19 16:07:44 1199

原创 Elasticsearch 脚本编写基础

脚本语言painlessES 的脚本语言可以通过 lang 来设置,如果不设置,默认为 Painless。Painless 专为 Elasticsearch 构建,可用于脚本 API 中的任何目的,并提供最大的灵活性。而且 Painless 是 ES 内置的,无需安装其他插件来支持,而且Painless 使用 Java 语法的子集, Painless 实现了任何具有基本编码经验的人都自然熟悉的语法。expressionsLucene 的表达式语言将javascript表达式编译为字节码。脚本使

2023-06-30 13:30:00 526

原创 Elasticsearch 聚合查询(下)

查询 10 ~ 20 岁 和 20 ~ 30 岁 和 其他年龄段的年龄统计数据(max、min、sum、avg、count),并筛选平均年龄大于20的桶。查询 10 ~ 20 岁 和 20 ~ 30 岁 和 其他年龄段的年龄统计数据(max、min、sum、avg、count),并查询平均年龄最小的桶。注意我们的示例其实没有实际的意义,只为了讲解 bucket_selector 的用法而已,实际中,可能是计算商品总金额超过800w的某些类型的商品。由于我们数据的特殊原因,此处计算出的男女的年龄差都是40。

2023-06-29 20:00:00 181

原创 Elasticsearch 聚合查询(上)

是以内存换取准确性的做法。比如我们的实际数量为1003,如果我们设置 precision_threshold 为 100 或更小,将得到不一样的值。我们示例是使用的字段中的id值,此值是不重复的值,所以计数为文档总数。示例表示查询索引 person ,按 age 分组,分组结果按照 年龄 升序排列。索引 person 中 “age” 年龄字段的平均值,字段结果 为 “avg_grade”,“size” 为0,表示不查询具体的文档结果。entropy:是一个负责的计算,是对聚合收集的所有项计算的香农熵值。

2023-06-29 13:44:15 141

原创 Elasticsearch 查询进阶

特别当我们使用 search_after 进行分页查询时,数据到变化可能导致分页的结果不准确,这时候我们常常创建一个时间点,让 search_after 的请求都使用该时间点的索引状态来进行查询,用以避免分页结果不准确的问题。2:如果当前只迭代到第10页,我们要直接跳转查询第282页的数据,也是比较困难的)除了使用带有 PIT 参数的 search_after 查询分页之外,ES 还支持滚动搜索查询(scroll),但新版本的 ES 已经不再建议使用该方式进行分页查询,所以我们就不再讨论这个问题了。

2023-06-19 16:37:48 1012

原创 Elasticsearch 中文分词器

下载时注意和es的版本对应,我们es版本为:8.6.2。在 ik 的文件的 config 目录下有 ik 分词的配置文件(IKAnalyzer.cfg.xml)以及相关的 dic 字典文件。在ES home/plugins 目录下创建目录 ik,并将我们下载下zip包解压到 es_home/plugins/ik 目录下。远程扩展字典的方式无需重启 ES 服务,只是在字典管理上来说,扩展字段文件独立于 ES 服务了,可能带来不便。查看结果,最终的分词中一定会有“科比布莱恩特”这样完整的词语。

2023-06-09 11:27:15 1697

JUC AQS(AbstractQueuedSynchronizer)

ReentrantLock Lock 加锁过程源码分析图,AQS 源码分析

2023-12-28

jdk1.8.0_181

jdk8,最新版的JDK8u271在win10系统下安装没反应

2021-01-19

TortoiseSVN-1.9.3.27038-x64-svn-1.9.3+中文语言包

TortoiseSVN-1.9.3.27038-x64-svn-1.9.3+中文语言包

2016-02-05

空空如也

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

TA关注的人

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