- 博客(18)
- 收藏
- 关注
原创 使用RabbitMq推模式,消费者调用Dubbo服务踩坑记录
问题描述:需求开发中需要使用到队列,且对实时性要求比较高,因此选择推模式,也就是mq主动向消费者投递消息,为此需要使用SimpleMessageListenerContainer,作为bean初始化注入ioc容器中,用来监听队列,配置了消费方法consumeTags(),消费者会调用该方法消费我的消费方法中,需要远程调用LogService服务的方法,这时候坑就出现了:因为我前面实现推模式用的@Bean去初始化对象,而@DubboReference的初始化在这之后,这样就导致了我消费的时候,logSe
2022-06-16 17:57:20
550
原创 JAVA策略模式(释放技能)
策略模式:定义了算法族,分别封装起来,让它们之间可相互替换,此模式让算法的变化独立于使用算法的客户。源码地址:https://gitee.com/yang-kairui/design-pattern我们需要定义一个抽象策略,然后实现一系列的具体策略,在我们执行的时候可以运行特定策略的类。以释放技能为例:先创建使用算法的客户,角色public class Role { /** * 名字 */ private String name; /** * 技能.
2022-04-07 12:33:16
317
原创 JAVA状态模式(打boss案例)
定义:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。源码地址:https://gitee.com/yang-kairui/design-pattern状态模式实际上就是模拟一个有限状态机,不同状态采取不同的处理方式,我们以一个打boss的小案例为例:先创建一个Boss实体类public class Boss { /** * 名称 */ private String name; /** * 生命值 */ private.
2022-04-06 16:11:29
1100
原创 JAVA工厂模式(手写Spring IOC案例)
通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。通过简单模拟spring的IoC容器来尝试工厂模式的使用:先请出主角ObjectFactory,他只有一个方法getObject(),用来生产对象@FunctionalInterfacepublic interface ObjectFactory<T> { /** * 返回由该工厂管理的对象的一个实例(可能是共享的或独立的)。 * @return 对象的一个实例 */ T.
2022-04-01 17:25:30
1056
原创 JAVA观察者模式(买彩票案例)
定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。JAVA的JDK和很多框架都用到了观察者模式,最典型的比如说spring mvc中的DispatcherServelet以及Zookeeper的动态监控注册中心,感兴趣的话可以去阅读一下源码如上图所示,服务号就是我们的主题,使用者就是观察者。现在我们明确下功能:1、服务号就是主题,业务就是推送消息2、观察者只需要订阅主题,只要有新的消息就会送来3、当不想要此主题消息时,取消订阅4、只要服务号还.
2022-04-01 11:16:25
2436
原创 23种设计模式JAVA案例
设计模式JAVA案例源码地址:https://gitee.com/yang-kairui/design-pattern设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。设计模式分为三种类型,共23种:行为型模式:1、观察者模式定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。JAVA的JDK和很多框架都用到了观察者模式,最典型的比如说spring mvc中的DispatcherSe
2022-03-31 15:28:48
1446
原创 linux下安装java常用docker环境(持续更新)
1、安装jdk1、进入 Oracle 官方网站 下载合适的 JDK 版本,准备安装。注意:这里需要下载 Linux 版本。这里以jdk-8u321-linux-x64.tar.gz为例,你下载的文件可能不是这个版本,这没关系,只要后缀(.tar.gz)一致即可。2、创建目录在/usr/目录下创建java目录,mkdir /usr/local/javacd /usr/local/java把下载的文件 jdk-8u321-linux-x64.tar.gz 放在/usr/local/java/目录下
2022-03-28 15:17:49
496
原创 Java8新特性之consumer的用法
consumer是一个函数式接口(可以采用lambda写法),它的源码如下@FunctionalInterfacepublic interface Consumer<T> { void accept(T t); default Consumer<T> andThen(Consumer<? super T> after) { Objects.requireNonNull(after); return (T t) -&
2022-02-10 18:36:12
17238
原创 java外部比较器排序空指针错误,sort(Comparator.comparing())
当我们需要对某个集合依据某个属性进行排序时,可以采用java的外部比较器排序,生产案例如下: for (ReversingRespDtoV2.Item item : collect) { item.getSearchesTrend().sort(Comparator.comparing(StatDto.Trend::getMonth)); }这种用法如果如果没有判空处理,会报空指针错误,解决方案如下:
2022-01-18 15:22:10
3910
原创 多线程环境下的读写分离思想
一、场景当我们在多线程的环境下操作一个集合,比如 ArrayList或者Hashmap,这些集合默认情况下肯定是线程不安全的,如果说多个线程同时去读和写这些集合就会有线程安全问题。好,问题来了,我们应该怎么让一个集合变成线程安全的呢?二、synchronized 或者lock锁有一个非常简单的办法,对这些集合的访问都加上线程同步的控制,或者说是加锁。这里可以去另一篇文章看一下Synchronized和lock锁的原理简述synchronized和lock锁最简单的做法就是加一个Synchroni
2021-10-20 12:55:28
1302
原创 简述synchronized、lock和原子类的原理
一、Synchronizedsynchronized是一个基于jvm的重量级的锁,他可以保证线程的绝对安全,但是也有一些问题:比如它是非公平的,它的性能不高。它的底层原理实际上是在jvm有一个是类似于计数器的东西叫做monitor,它默认情况下是0,但我们加锁的时候就+1变为1,解锁就是-1变为0,由于Synchronized是一个对象锁,所以它只能允许带有对象头的对象来进行加锁解锁操作,当对象进行加锁时会执行指令monitor enter,当解锁时执行monitor exit。除此之外它还有一些特性
2021-10-20 11:56:00
279
原创 java基础之HashMap刨根问底
数据结构hm的数据结构是数组加链表,插入数据的话,先对数据计算一个哈希值,然后用这个哈希值去对数组的大小减1来取模,算出来的数就是存在数组里的位置,如果这个位置已经有数据了,这就是哈希碰撞问题,hm会用equls方法对这个数据的值和数组里的值进行比较,如果这个数据已经做了链表,就挨个比较,只有equls结果全为false,才会进行插入,1.8之前呢就是直接用一个链表来保存这种碰撞的数据,jdk1.8做了优化,当链表长度超过8的时候就会升级为红黑树,时间复杂度为O(logn),这个就是hm的数据结构的情况。
2021-09-12 18:55:22
358
2
原创 布隆过滤器是什么?
布隆过滤器通过多个哈希函数生成多个哈希值,把生成的哈希值所在的bit位变为1,这样相对于hashmap,布隆过滤器存储占用更小的内存,但是缺点也很明显,就是去查一个值,如果算出来的每个bit位上都为1,也只能说它是可能存在,不能确定它一定存在,因为这些1可能是很多别的数据存储所生成的1。还有一个缺点就是传统的布隆过滤器不支持删除操作。...
2021-09-12 14:57:59
111
原创 如何用redis实现分布式锁
redis实现分布式锁,可以采用setnx,给它设置过期时间避免死锁,也可以用lua脚本实现redis分布式锁需要满足五个条件:1.互斥性不能去解锁别人的分布式锁2.容错性可以主从复制配合哨兵模式实现一个高可用,就是当哨兵监控的主库宕机,我们就把一个slaver升级成master3.不能死锁我们可以设置过期时间,当过期时间到了就去删除这个锁4.一致性只有同一个客户端才能执行加锁和解锁5.自动续期当我们的程序还没执行完,但是锁到期了,就会被导致这个锁被别人拿到,为了解决这个问题,我们可以
2021-09-10 08:58:50
238
原创 nacos注册中心的注册原理深度解析
注册流程整个注册中心的注册和发现流程主要有三个方面来完成:服务的提供方(以下简称server)、服务的消费者(以下简称client)、注册中心(nacos)。首先我们来探讨server与nacos的交互过程。server需要通过nacos官方的OpenApi提供的接口来发起服务注册请求,随后server会定时向nacos发送心跳信息来进行心跳检测,对于使用者来说这一步可以采用ScheduledExecutorService创建定时任务来完成。nacos会异步的处理注册请求任务和心跳任务。nacos心
2021-09-09 14:54:47
17035
3
原创 spring aop动态代理
aop的底层是动态代理,spring aop使用的动态代理有两种,如果指定对接口进行动态代理,默认使用jdk动态代理,如果指定对类使用动态代理则采用cglib,然后我们需要实现一个叫MethodInterceptor的拦截器,实现方法前后的拦截//创建一个代理对象工厂ProxyFactory proxyFactory = new ProxyFactory();//指定对接口进行代理(接口默认用jdk动态代理,类用cglib动态代理)proxyFactory.addInterface(interfa
2021-09-06 20:51:28
167
原创 Mybatis-Spring源码解析 —— mybatis与Spring是如何整合的?
Mybatis-Spring源码解析 —— mybatis与Spring是如何整合的?1.原生创建mapper的方式String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
2021-07-22 23:16:14
184
1
原创 模拟代理对象动态注册到spring容器中
模拟代理对象动态注册到spring容器中1、接口2、使用jdk实现动态代理3、创建一个代理类工厂4、把我们的代理对象动态注入到IoC容器中5、写一个congtoller测试效果1、接口创建一个用于测试的接口/** * 用来模拟动态注入的测试接口 * @author YKR * @Describe * @date 2021/7/16 */public interface MyMapper { public String sayHello();}2、使用jdk实现动态代理
2021-07-16 18:44:53
519
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人