- 博客(231)
- 资源 (14)
- 问答 (8)
- 收藏
- 关注
原创 OpenFeign动态代理、源码分析
OpenFeign 组件的前身是 Netflix Feign 项目,由 Netflix 公司开发。后来 Feign 项目被贡献给了开源组织,随后Feign退出历史舞台。OpenFeign是Spring Cloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类。
2022-12-02 17:23:41 1420 1
原创 Spring Cloud Loadbalancer是什么、作用是什么
Loadbalancer是Spring Cloud 的负载均衡器,取缔Netflix的Ribbon。是客户端的负载均衡负载均衡客户端的负载均衡:每个发起服务调用的客户端都存有完整的目标服务地址列表,根据配置的负载均衡策略,由客户端自己决定向哪台服务器发起调用。网络开销小:由客户端直接发起点对点的服务调用,没有中间商赚差价;配置灵活:各个客户端可以根据自己的需要灵活定制负载均衡策略。服务端负载均衡(网关层负载均衡):经过真实的API Gateway 服务,到达对应的服务端。会带来网络消耗(大约增加1
2022-11-30 12:25:36 840
原创 Redis 缓存回收的7种策略volatile设置过期时间及allkeys所有数据范围内
8 种数据淘汰策略:它们分别是noeviction、volatile-random、volatile-ttl、volatile-lru、volatile-lfu、allkeys-lru、allkeys-random 和 allkeys-lfu 策略。LRU 策略更加关注数据的时效性,而 LFU 策略更加关注数据的访问频次。当缓存污染不严重时,只有少量数据占据缓存空间,此时,对缓存系统的影响不大。如果这时数据占满了缓存空间,我们再往缓存中写入新数据时,
2022-10-16 15:17:16 2823
原创 Redis 先写数据库及先写缓存一致性问题
从图中可以看到,Tomcat 上运行的应用,无论是新增(Insert 操作)、修改(Update 操作)、还是删除(Delete 操作)数据 X,都会直接在数据库中增改删。当然,如果应用执行的是修改或删除操作,还会删除缓存的数据 X。如果是新增数据,数据会直接写到数据库中,不用对缓存做任何操作,此时,缓存中本身就没有新增据,而数据库中是最新值,此时,缓存和数据库的数据是一致的。如果发生删改操作,应用既要更新数据库,也要在缓存中删除数据。这两个操作如果无法保证原子性。假设线程 A 删除缓存值后,还没有来得及更
2022-10-16 14:19:53 1032
原创 设计模式-代理模式(静态代理、动态代理、cglib动态代理)AOP的底层动态代理
代理模式分为静态代理和动态代理,动态代理又分为基于接口实现的动态代理和基于子类实现的动态代理;创建线程的方式之一实现Runnable接口就使用了静态代理模式Spring框架最为重要的AOP的实现是基于动态代理模式Subject:抽象主题角色,抽象主题类可以是抽象类,也可以是接口,是一个最普通的业务类型定义,无特殊要求。RealSubject:具体主题角色,也叫被委托角色、被代理角色。是业务逻辑的具体执行者。Proxy:代理主题角色,也叫委托类、代理类。
2022-10-10 22:54:02 452
原创 Java1.8+ JUC包的ConcurrentSkipListMap
跳跃表是基于链表扩展实现的一种特殊链表,类似于树的实现,跳跃表不仅实现了横向链表,还实现了垂直方向的分层索引。一个跳跃表由若干层链表组成,每一层都实现了一个有序链表索引,只有最底层包含了所有数据,每一层由下往上依次通过一个指针指向上层相同值的元素,每层数据依次减少,等到了最顶层就只会保留部分数据了。跳跃表的这种结构,是利用了空间换时间的方法来提高了查询效率。程序总是从最顶层开始查询访问,通过判断元素值来缩小查询范围。如图。
2022-09-17 12:52:37 181
原创 Java1.8+ JUC包的ConcurrentHashMap源码分析
concurrentHashMap是一个支持高并发更新与查询的哈希表(基于HashMap)。在保证安全的前提下,进行检索不需要锁定。与hashtable不同,该类采用为什么get方法不需要加锁,可以保证线程安全的?因为 Node 的元素 val 和指针 next 是用 volatile修饰保证可见性和有效性,在多线程环境下synchronization+CAS的的方式保证线程操作的安全,同时synchronization锁的颗粒度更小,hashtable是方法级而synchronization是对象级别。
2022-09-16 16:45:05 884
原创 设计模式-享元模式、享元模式示例
享元模式是运用共享技术有效地最大限度地复用细粒度对象的一种模式。该模式中,以对象的信息状态划分,可以分为内部数据和外部数据。内部数据是对象可以共享出来的信息,这些信息不会随着系统的运行而改变;外部数据则是在不同运行时被标记了不同的值。享元模式一般可以分为三个角色,分别为 Flyweight(抽象享元类)、ConcreteFlyweight(具体享元类)和 FlyweightFactory(享元工厂类)。抽象享元类通常是一个接口或抽象类,向外界提供享元对象的内部数据或外部数据;
2022-09-04 13:16:33 260
原创 设计模式-原型模式、原型模式示例
指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。使用这种方式创建新的对象的话,就无需再通过 new 实例化来创建对象了。在创建多个实例时,对创建过程的性能进行调优;相对new来说,clone少了调用构造函数。如果构造函数中存在大量属性初始化或大对象,则使用clone的复制对象的方式性能会好一些。性能提高。逃避构造函数的约束。配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。
2022-09-04 12:41:40 258
原创 设计模式-装饰模式(包装模式Wrapper)、装饰模式示例
装饰者模式又名包装模式(Wrapper),是一种对象结构型模式。是一种用于替代继承的技术,他通过一种无需定义子类的方式来给对象动态增加职责,使用对象之间的关联关系取代类之间的继承关系实际就是动态地给一个对象添加一些额外的功能,比生成子类要灵活优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。缺点:多层装饰比较复杂。使用场景: 1、扩展一个类的功能。2、动态增加功能,动态撤销。
2022-09-04 00:15:30 1536
原创 设计模式-策略模式、策略示例、策略模式对比工厂模式
策略模式是对算法的封装,是一种行为模式,将每个算法封装到具有共同接口的独立类中,是算法本身和使用算法的客户端分离开,相互独立,从而使得他们可以相互替换。我们真实开发中会有很多这样类似的代码,这些不同的优惠方式,实际就是策略,使用策略模式就可以更优雅的实现代码。策略模式是一种策略一种行为,并不是一层不变的写法,主要内容:抽象策略类,具体策略。,创建具体对象,对象的具体创建和具体客户使用无关。虽然工厂模式与策略模式相似,工厂模式是一种。...
2022-09-01 02:30:28 162
原创 Java 独占锁ReentrantLock、读(悲观读)写锁ReentrantReadWriteLock、读(乐观读/悲观读)写锁StampedLock
锁必然要知道AbstractQueuedSynchronizer(AQS),AQS提供了一个框架,用于实现依赖于先进先出(FIFO)等待队列的阻塞锁和相关同步器(信号量、事件等)。独占,只有一个线程能执行,如ReentrantLock(悲观锁:除非线程1全部运行完后才会释放锁,否则其他线程无法拿到锁。可重入,公平与非公平特征 )Lock是juc中实现的锁接口,定义了锁的一些行为规范,他的设计目的是为了解决synchronized关键字在一些并发场景下不适用的问题,相对synchronized更灵活。....
2022-08-28 10:53:08 547
原创 MongoDB单值索引、复合索引、数组索引、地理空间索引、唯一索引、TTL索引、条件索引、稀疏索引、文本索引、模糊索引
索引主要表现为一种目录式的数据结构,用来实现快速数据查询。索引是对数据库表(集合)中的某些字段进行抽取、排列后,形成一种非常易于遍历读取的数据集合。使用WiredTiger存储引擎: B+ 结构注意在 3.0.0 版本前创建索引方法为 db.collection.ensureIndex(),之后的版本使用了 db.collection.createIndex() 方法,ensureIndex() 还能用,但只是 createIndex() 的别名。
2022-08-21 22:27:07 1258
原创 netty黑白名单RuleBasedIpFilter、同一个 IP 只能有一个连接UniqueIpFilter
根据netty中io.netty.handler.ipfilter包下实现。netty先建立链接之后通过pipeline中handler过滤cidr(无分类域)原理实现的
2022-08-17 23:08:04 1203
原创 netty根据业务场景(IO密集型、CPU密集型)优化线程模型
CPU 密集型:运算型(科学计算等,不需要`依赖太多的外部资源`)IO 密集型:等待型(调用微服务、数据库、远程服务等需要等待服务端返回)整改线程模型:独立出 “线程池”来处理业务,`不在和NioEventLoopGroup做共享,解决IO抢占资源的问题`,如果IO处理不及时就会影响业务处理效率。所以采用线程池提升业务效率......
2022-08-17 00:17:12 847
原创 netty内存泄露检测
netty检测内存泄漏的核心:引用计数器(buffer.refCnt())+弱引用DefaultResourceLeak(WeakReference)ResourceLeakDetector(内存泄露检测工具类)new ByteBuf时会调用此方法。
2022-08-16 22:34:13 645
原创 netty 完善线程及Handler名称、netty的日志
2-1:代表的是bossGrup,3-1:代表的是workerGrup。netty代码时经常会遇到这种奇怪的线程名字,到底是什么?Handler中#0,$1#0又是什么鬼?设置netty日志级别查看LoggingHandler构造方法如图。netty源码是如何编译过的呢,如图,添加日志handler。...
2022-08-15 23:40:31 1107
原创 Netty注解@Sharable、@Skip、@UnstableApi、@SuppressJava6Requirement、@SuppressForbidden
在jdk10一下,使用docker容器初始化Group时获计算cpu核数时Runtime.getRuntime().availableProcessors()),获取的是宿主机的cpu核数。如果非共享的Handler重复加入就会抛出异常,提示非共享Handler不能重复加入,在cash中同时会断开链接。https://github.com/policeman-tools/forbidden-apis/去除 “禁用” 报警,forbidden组件会在编译(maven compile)阶段。...
2022-08-15 22:05:24 1250
原创 MongoDB 添加、查询(条件查询、排序、分页、返回指定字段)、修改、删除数据、聚合aggregate
MongoDB内部支持JavaScript语法,使用SpiderMonkey作为内部的JavaScript解释器引擎。
2022-08-13 16:21:52 4279
原创 MongoDB是什么、有哪些优势、对比mysql,es、docker安装
MongoDB是面向文档的NoSQL数据库(是一个介于关系数据库和非关系数据库之间的产品),用于大量数据存储的分布式文件存储型数据库。基于灵活的json文档模型(BSON),非常适合敏捷式快速开发。具有高可用,高水平扩展能力,处理海量、高并发的数据应用时非常有优势。C++语言开发的数据库排行榜。......
2022-08-11 23:28:48 1591
原创 Netty 心跳机制及断线重连
netty 的服务端一般情况下不需要断线重连,应为服务端服务宕机就只能重新启动服务;空闲检测就是每隔一段时间检测子通道是否有数据读写,如果有,则子通道是正常的;如果没有,则子通道被判定为假死,关掉子通道。心跳检测是在TCP长连接中,客户端和服务端定时向对方发送数据包通知对方自己还在线,保证连接的有效性的一种机制。添加IdleStateHandler心跳检测处理器,并添加自定义处理Handler类。断线重连是指由于发生网络故障而导致服务中断的情况,客户端就需要从重新连接服务端;方法作为超时事件的逻辑处理;..
2022-08-02 23:05:36 3046 1
原创 Netty粘包拆包、自定义Protostuff编解码器
TCP是一个“流”协议,所谓流,就是没有界限的一长串二进制数据。TCP作为传输层协议并不了解上层业务数据的具体含义,会根据TCP缓冲区的实际情况进行数据包的划分;所以在业务上认为是一个完整的包,可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。protostuff是一个开箱即用的序列化库,使用非常简单。protostuff是二进制的,因此性能比json等方式高。...
2022-08-02 21:42:58 1906
原创 Netty 编解码与自定义编解码
实现一个解码器,首先要继承ByteToMessageDecoder抽象类,然后实现其基类的decode()抽象方法。继承ByteToMessageDecoder抽象类。实现基类的decode()抽象方法,将ByteBuf到目标POJO的解码逻辑写入此方法,以将ByteBuf中的二进制数据解码成一个一个的JavaPOJO对象。解码完成后,需要将解码后的JavaPOJO对象放入decode()方法的List实参中,此实参是父类所传入的解码结果收集容器。......
2022-08-01 17:10:01 1629
原创 Netty的零拷贝(Zero-Copy)
Netty提供CompositeByteBuf组合缓冲区类,可以将多个ByteBuf合并为一个逻辑上的ByteBufer,避免了各个ByteBufer之间的拷贝,将几个小buffer合并成一个大buffer的繁琐操作。Netty中的零拷贝和操作系统层面上的零拷贝是有区别的,不能混淆,Netty零拷贝完全是基于Java层面或者说用户空间的,它更多的是偏向于应用中的数据操作优化,而不是系统层面的操作优化。Netty的零拷贝(Zero-Copy)主要体现在五个方面。,使用堆外直接内存进行Socket读写,...
2022-07-31 22:17:07 2785 1
原创 Reactor模式、Netty线程模型、Netty基本类说明
当然,服务器的监听线程也是独立的,任何socket连接的输入和输出处理都不会阻塞到后面新socket连接的监听和建立,这样服务器的吞吐量就得到了提升。这种方法的最大问题是如果前一个网络连接的handle(socket)没有处理完,那么后面的新连接无法被服务端接收,于是后面的请求就会被阻塞,导致服务器的吞吐量太低。单线程Reactor模式是基于Java的NIO实现的。相对于传统的多线程OIO,Reactor模式不再需要启动成千上万条线程,避免了线程上下文的频繁切换,服务端的效率自然是大大提升了。.......
2022-07-25 21:05:15 664
原创 Netty是什么、为什么用Netty、为什么Netty选择NIO而非AIO
基于Netty,可以快速轻松地开发网络服务器和客户端的应用程序。与直接使用JavaNIO相比,Netty给大家造出了一个非常优美的轮子,它可以大大简化网络编程流程。Netty是一个异步的、事件驱动的、用来做高性能高可靠性的网络应用框架。Netty是一个JavaNIO客户端/服务器框架,是一个为了。Netty支持的功能及特性如图。......
2022-07-23 22:26:35 643
原创 Java NIO 缓冲区Buffer、通道Channel、选择器Selector
缓冲区Buffer、选择器Selector、通道Channel是JavaNIO的三个核心对象。
2022-07-23 15:40:05 456
原创 JAVA IO模型BIO、NIO、AIO、Linux操作系统中文件句柄数的限制
NIO整个调用流程就是Java调用了操作系统的内核函数来创建Socket,获取到Socket的文件描述符,再创建一个Selector对象,对应操作系统的Epoll描述符,将获取到的Socket连接的文件描述符的事件绑定到Selector对应的Epoll文件描述符上,进行事件的异步通知,这样就实现了使用一条线程,并且不需要太多的无效的遍历,将事件处理交给了操作系统内核(操作系统中断程序实现),大大提高了效率。我们应用程序是跑在用户空间的,它不存在实质的IO过程,真正的IO是在操作系统执行的。......
2022-07-20 23:24:01 669
原创 docker安装kafka集群
ALLOW_PLAINTEXT_LISTENER=yes:允许使用PLAINTEXT侦听器KAFKA_CFG_ZOOKEEPER_CONNECT:zookeeper集群地址,多节点,分割KAFKA_BROKER_ID:节点id,唯一值KAFKA_ADVERTISED_LISTENERS:配置的是kafka的broker ipKAFKA_LISTENERS:配置的是kafka的tcp侦听ip地址-v /home/kafka/data4:/bitnami/kafka/data:挂载数据......
2022-07-13 23:55:37 1027
原创 什么是kafka、kafka的应用场景、Kafka基本知识
Kafka 最初由LinkedIn公司开发的,并于 2010 年贡献给了 Apache 基金会,之后成为 Apache 顶级项目。目前 Kafka 已经定位为一个分布式流式处理平台,它以高吞吐、可持久化、可水平扩展、支持流数据处理等多种特性而被广泛使用。目前越来越多的开源分布式处理系统如 Cloudera、 Storm、 Spark、 Flink 等都支持与 Kafka 集成 。Kafka之所以受到越来越多的青睐,与它所“扮演 ”的三大角色是分不开的 :消息系统: Kafka 和传统的消息系统(也称作消息中
2022-07-13 00:30:27 1772
原创 Docker运行命令报错Error response from daemon: Bad response from Docker engine
Docker运行命令报错Error response from daemon: Bad response from Docker engine可能是因为占用内存太大导致的
2022-07-12 09:32:38 2480
原创 RocketMQ docker集群搭建多Master多Slave模式
每个Master配置一个Slave,有多对Master-Slave,HA(双机集群)采用异步复制方式,主备有短暂消息延迟(毫秒级),这种模式的优缺点如下:优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,同时Master宕机后,消费者仍然可以从Slave消费,而且此过程对应用透明,不需要人工干预,性能同多Master模式几乎一样;缺点:Master宕机,磁盘损坏情况下会丢失少量消息。安装模块NameServer是一个非常简单的,其角色类似Dubbo中的zookeeper,。主要包括两个功能:Br
2022-07-06 23:15:50 655
原创 SpringBoot整合RabbitMQ 消息可靠投递、手动ack、延迟队列、死信队列、消息幂等性保障、消息积压
在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式。rabbitmq 整个消息投递的路径为:producer—>rabbitmq broker—>exchange—>queue—>consumer消息从 producer 到 exchange 则会返回一个 confirmCallback 。消息从 exchange–>queue 投递失败则会返回一个 returnCallback 。将利用这两个 callb
2022-07-03 23:58:48 2255
原创 SpringBoot整合RabbitMQ Direct、Topic、Fanout模式
P:生产者,向 Exchange 发送消息,发送消息时,会指定一个routing keyX:Exchange(交换机),接收生产者的消息,然后把消息递交给与 routing key 完全匹配的队列C1:消费者,其所在队列指定了需要 routing key 为 error 的消息C2:消费者,其所在队列指定了需要 routing key 为 info、error、warning 的消息模式说明:队列与交换机的绑定,不能是任意绑定了,而是要指定一个 RoutingKey(路由key)消息的发送方在向 Excha
2022-07-03 01:40:53 409
原创 RabbitMQ 管理界面说明
RabbitMQ 管理界面描述都附属到图片中方便查看。在RabbitMQ中可以虚拟消息服务器Virtual Host,每个Virtual Hosts相当于一个相对独立的RabbitMQ服在RabbitMQ中可以虚拟消息服务器Virtual Host,每个Virtual Hosts相当于一个相对独立的RabbitMQ服务器,每个 VirtualHost之间是相互隔离的。exchange、queue、message不能互通。 相当 于mysql的db。Virtual Name一般以/开头。
2022-06-30 01:13:24 652
原创 RabbitMQ 基本概念、docker安装
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路
2022-06-27 23:19:33 330
原创 zookeeper 是什么、应用场景有哪些?docker 部署zookeeper、zookeeper命令
ZooKeeper 是一个分布式的,开放源码的分布式应用程序协同服务。ZooKeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。ZooKeeper 适用于存储和协同相关的关键数据(基于内存的数据库),不适合用于大数据量存储。有两个核心的概念:文件系统数据结构+监听通知机制。Zookeeper维护一个类似文件系统的数据结构:每个子目录项都被称作为 znode(目录节点),和文件系统类似,我们能够自由的增加、删除 znode
2022-06-13 00:14:22 658 2
原创 redis 缓存雪崩、穿透、击穿、脑裂问题
缓存雪崩是指大量的应用请求无法在 Redis 缓存中进行处理,紧接着,应用将大量请求发送到数据库层,导致数据库层的压力激增,造成存储层也可能会级联宕机的情况。一般来说,一个 Redis 实例可以支持数万级别的请求处理吞吐量,而单个数据库可能只能支持数千级别的请求处理吞吐量,它们两个的处理能力可能相差了近十倍。由于缓存雪崩,Redis 缓存失效,所以,数据库就可能要承受近十倍的请求压力,从而因为压力过大而崩溃。预防和解决缓存雪崩问题:保证缓存层服务高可用性,比如使用Redis Sentinel或Redis C
2022-06-08 23:22:12 1412 3
原创 reids 缓存与数据库数据不一致、缓存过期删除问题
假设线程 A 删除缓存值后,还没有来得及更新数据库(比如说有网络延迟),线程 B 就开始读取数据了,那么这个时候,线程 B 会发现缓存缺失,就只能去数据库读取。这会带来两个问题:解决方案:有一些公共数据修改的机会比较少,而读的机会却是非常多的,此公共数据的操作基本都是读,如果每次操作都给此段代码加锁,太浪费时间了而且也很浪费资源,降低程序的效率。因为读操作不会修改数据,只是做一些查询,所以在读的时候不用给此段代码加锁,可以共享的访问,只有涉及到写的时候,互斥的访问就行......
2022-06-07 23:43:54 620
原创 redis 分布式锁的几种实现方式
Jedis、RedisTemplate一般情况下分布式锁足够了;高并发情况下Redission锁的逻辑更加安全,采用lua脚本语言的方式一次性获取或释放锁
2022-06-06 19:05:48 667
elasticsearch-analysis-dynamic-synonym-master
2020-11-10
pinyin4j.jar中文转拼音及多音字配置文件
2018-09-26
json-lib-2.4-jdk15.jar
2017-10-23
kaptcha-2.3.2.jar 文件及教学
2017-02-09
Mybatis Generator插件的手动安装及插件使用教程
2016-10-28
Mybatis Generator插件的手动安装及插件教程
2016-10-19
Maven配置SSM(Spring SpringMVC Mybatis)框架 细到极致!一秒看懂.
2016-09-29
Jad 3.3.0反编译插件附带exe文件
2016-09-20
根据节点获取所有input的值
2018-11-20
Stringboot druid框架搭建的时候报错 代码及报错如下,请大佬解答感激不尽
2018-10-30
求一款支持jquery2.2以上版本的 表格插件
2016-11-17
c:foreach标签对象取不到值
2016-11-15
Spring mvc kaptcha验证码 报错
2016-10-11
TA创建的收藏夹 TA关注的收藏夹
TA关注的人