自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(62)
  • 问答 (1)
  • 收藏
  • 关注

原创 Failed to execute goal ...:compile (default-compile)无效的目标发行版: 17

Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project FtxServer: Fatal error compiling: 无效的目标发行版: 17 -> [Help 1]

2022-10-15 21:07:41 1015 1

原创 通过两种方式手写一个消息队列

文章目录1.基于多线程的方式实现MQ(极简纯享版)2.基于网络通讯的方式实现MQ参考每特教育蚂蚁课堂1.基于多线程的方式实现MQ(极简纯享版)MQ就是在消费者服务和生产者服务传递信息的通道,生产者向队列中投递消息,然后消费者过来取。所以我们可以这样设计,用一个队列作为中间件,然后开启两个线程,一个是生产者线程,一个是消费者线程,生产者线程向队列中插入json串,消费者线程过来取这个就是一个简单的MQ的实现。 private static LinkedBlockingDeque<JSONO

2022-05-28 16:26:30 3062 1

原创 万字简析Netty启动流程源码

文章目录前言0.NIO中服务器是如何启动的1.Netty启动流程2.initAndRegister方法2.1 init2.2 Register3.启动流程阶段性总结4. NioEventLoop分析4.1NioEventLoop的组成4.2 selector的创建4.3 两个selector成员变量5. NioEventLoop线程何时启动6. eventLoop wakeup 方法7. EventLoop进入select分支7.1讨论什么时候进入select方法7.2进入select方法7.3 Netty

2022-05-14 16:00:01 713

原创 Netty协议的设计与解析

文章目录1.协议的引入2. HTTP协议的编解码实现3. 自定义协议3.1自定义协议的要素3.2 自定义协议通过Netty进行编解码4. 啥时候用@Sharable参考黑马程序员1.协议的引入协议就是客户端向服务端发送消息的时候,双方约定俗成的一套规矩,比如我在redis中创建一个key,value。按理说要用到这个命令,set key value。这个命令在发送的时候会被解析成redis服务器能看懂的形式。比如说set name zhangsan你看到的只是一条命令,实际上向服务端发送的是这样的

2022-05-06 13:31:15 958

原创 Netty应用之粘包半包问题

文章目录1.粘包现象演示2.半包现象演示3.粘包半包现象分析3.1 粘包3.2 半包4.粘包半包解决方案4.1短连接4.2 定长解码器4.3 行解码器4.4 LengthFieldBasedFrameDecoder4.5 LengthFieldBasedFrameDecoder演示参考黑马程序员1.粘包现象演示我们通过一段代码演示一个这个粘包现象,首先我们来看服务端 void start() { NioEventLoopGroup boss = new NioEventLoop

2022-05-05 09:35:14 2272

原创 SpringBoot整合RabbitMQ

文章目录1.简介2.准备工作2.1生产者2.2邮件消费者参考蚂蚁课堂1.简介我们的生产者向消息队列中投递消息,不用非得把他转化成json格式,可以直接投递对象,因为SpringBoot已经帮你实现了序列化,你投递的对象只要实现Seralized接口就行了。同时SpringBoot还可以帮你自动创建交换机,队列这些组件,你不用SpringBoot的话你不创建他就会报错。SpringBoot就相当于一个小女友,十分的贴心处处为你着想。2.准备工作我们大概要实现一个这样的效果,一个生产者,通过fano

2022-05-04 23:38:50 1345

原创 消息队列(MQ)简介

1.引入——传统的Http请求的缺点Http请求是同步的,也就是说必须和服务端建立连接,当服务端接收的请求过大时,给客户端的响应就不够及时如下图所示每当客户端向tomcat服务器发送一个请求,tomcat服务器当中就会创建一个线程,而且这个线程不是无限的,有一个最大线程数。当我的请求数量大于这个最大线程数的时候,多余的请求就要缓存到队列里。这就有可能导致客户端长时间得不到响应。客户体验非常差。如果客户端一直等着没有收到服务端的响应的话那么可能引起超时重传,同一个请求传好几遍,有可能引发幂等性问题。2

2022-05-03 19:23:48 923

原创 RabbitMQ简介及简单使用

文章目录1.RabbitMQ基本介绍2.RabbitMQ简单使用案例2.1在RabbitMQ平台上创建一个队列2.2编写生产者代码2.3编写消费者代码3.RabbitMQ如何保证消息不丢失4.RabbitMQ工作队列5.RabbitMQ交换机(exchange)5.1RabbitMQ Fanout 发布订阅5.2 Direct交换机5.3 Topic主题模式6.MQ如何获取消费者消费结果7.rabbitmq死信队列7.1原理7.2演示7.3应用场景8.RabbitMQ重试策略与幂等性问题8.1重试8.2幂等

2022-05-02 19:35:10 1893

原创 Netty简介

文章目录1.什么是Netty?2.一个简单地Netty程序3.Netty执行流程简析3.1服务端准备工作3.2客户端准备工作3.3交互过程4.一些概念的再明确5. EventLoop组件5.1 EventLoop用法5.1.1执行普通任务5.1.2 执行定时任务5.2 eventLoop分工细化5.3源码分析——不同工人之间如何交接6.Channel6.1 ChannelFuture6.1.1 sync()同步处理结果6.1.2 addListener异步处理结果6.1.3 close存在的问题7.在net

2022-05-01 22:39:25 699

原创 ThreadLocal底层原理

文章目录1.什么是ThreadLocal?2.ThreadLocal基本用法3.ThreadLocal的应用场景4.ThreadLocal底层原理5.强软弱引用之间的区别5.1强引用5.2软引用5.3弱引用5.4虚引用6.ThreadLocal内存泄漏问题7.如何防止ThreadLocal内存泄漏问题8.ThreadLocal采用的是弱引用9.ThreadLocal与Synchronized区别参考蚂蚁课堂1.什么是ThreadLocal?ThreadLocal提供了线程本地变量,它可以保证访问到的变

2022-04-13 19:34:49 522

原创 线程池常见的面试题

文章目录1.什么是线程池2.为什么使用线程池3.线程的作用4.如何创建线程池5.线程池底层是如何实现复用的6.手写一个简易线程池7.ThreadPoolExecutor构造函数原理8.线程池创建的线程会一直运行吗?9.线程池队列满了任务会丢失吗?参考蚂蚁课堂1.什么是线程池线程池和数据库连接池类似,可以统一管理维护线程,减少没有必要的开销,就是说你在需要启动线程的时候没有必要自己创建了,只需要从线程池拿就行了,如果用完了还回去就行了没必要创建一个新的,比如说我需要100个线程,我如果说直接创建100个

2022-04-11 19:45:15 11054 2

原创 Zookeeper集群的数据一致性问题

1.Zookeeper不同节点的作用?首先介绍一下zk集群中的leader节点和follower节点都是干啥的。每个follower节点都保存了leader节点的副本数据,全局保证了数据一致性,分布式读写分开,写的请求统一交给Leader实现,Follower或者是ObServer节点主要实现读的操作。如果你连接的是Follower节点或者ObServer节点然后你还要写的话,他会把这个写的请求转发给Leader节点,然后leader节点写完之后同步给Follower或ObServer节点。2.ZAB原

2022-04-10 18:04:08 1953

原创 zkObesever节点介绍

文章目录1.Zookeeper集群存在的问题2.Zookeeper节点类型3.在Zookeeper中配置ObServer节点参考蚂蚁课堂1.Zookeeper集群存在的问题假如说我现在有一个集群,里面原来有3个节点,1个Leader两个Follower,这个时候假如说Leader积劳成疾,死而后已,出师未捷身先死,那么这个团队需要一个新的领导者,这个领导者必须得从剩余的两个Follower里面选择。在假如说这个团队发展壮大了,有1个Leader和4个Follower,这个时候Leader英年早逝之后,

2022-04-10 17:51:44 1351

原创 Zookeeper集群与分布式理论

文章目录1.分布式理论之强一致性概念2.分布式理论之最终一致性概念3. Zookeeper集群选举原理策略4.构建Zookeeper集群环境5.为什么zookeeper集群节点最好要是奇数参考蚂蚁课堂1.分布式理论之强一致性概念假如说有一个mysql集群,然后数据库表中有一个字段name。如图所示name原来的值都是张三,然后这个时候突然name被更改为李四。这个时候你查MySQL1一定会查到name值为李四,你查MySQL2,name值也为李四,这就是数据库强一致性。但是由于在数据同步的过程中网络

2022-04-08 21:32:15 2440

原创 Zookeeper实现分布式锁

文章目录1.Zookeeper实现事件监听通知2.分布式锁的概念2.1分布式锁应用场景2.2实现方案2.3基于zookeeper实现分布式锁的思路2.3.1创建分布式锁的原理2.3.2释放锁的原理3. zk分布式锁的实现4.如何防止死锁问题参考蚂蚁课堂1.Zookeeper实现事件监听通知zookeeper可以实现对节点不同行为进行监听比如说之前payment-service下面有两个节点一个是8080一个是8081。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k9

2022-04-07 22:00:38 956

原创 Zookeeper作为服务注册中心

文章目录1.服务注册的简单介绍2.使用zookeeper注册服务3.服务发现4.Eureka与Zookeeper作为注册中心的区别参考蚂蚁课堂1.服务注册的简单介绍这个微服务之间的相互调用和上面的图类似,首先会有一个注册中心,生产者把自己的IP地址与端口号注册到注册中心上,然后消费者从注册中心获取生产者的IP地址和端口号,然后通过本地RPC远程调用生产者服务。如果我们用zookeeper实现服务注册的话那就是在zookeeper下面创建节点比如说/payment-service(服务名称),如果是

2022-04-05 19:27:00 1618

原创 Zookeeper简介

文章目录1. Zookeeper的应用场景有哪些?2. Zookeeper用Java语言连接3.通过CountDownLatch优化上述代码4.zookeeper的四种节点类型5.ACL权限控制参考蚂蚁课堂1. Zookeeper的应用场景有哪些?Zookeeper 简称zk相当于分布式领域的协调者。主要应用场景:1.分布式锁2.Dubbo服务注册3.分布式配置中心4.分布式消息中间件5.发布订阅(事件通知)6.Master选举zookeeper类似于文件系统,zookeeper把文件定

2022-04-04 14:56:16 1400

原创 手把手教你搭Redis Cluster集群——Redis Cluster的搭建与原理解析

本文介绍了RedisCluster的原理,较为详细的介绍了搭建的完整过程,同时还演示了扩容和缩容操作

2022-03-28 20:27:46 2458 2

原创 手把手教你搭哨兵——哨兵的概念搭建原理解析

Redis哨兵机制实现原理1.Redis主从机制1.1主从复制的概念我们在实际应用中不可能只有一台redis服务器,因为如果这一台redis服务器宕机了,那么就可能导致redis不可用,同时还有可能发生数据丢失。所以这时候我们必须要有从redis做备份。Redis主机既能读又能写,而Redis的从机只能读不能写,当向Redis主机写入数据时必须将数据同步到Redis从服务器上,从而保证数据的一致性。这里要注意一下,保证数据一致性一定是弱一致性,不是强一致性。强一致性要求我向主机写入数据之后数据必须

2022-03-28 20:15:03 3683

原创 Redis淘汰策略过期回调和事务

文章目录1.Redis淘汰策略简介2.Redis六种淘汰策略3.Redis中的自动过期机制3.1简介3.2开启回调监听机制3.3SpringBoot整合redis实现key失效监听4.Redis事务操作4.1Redis事务和mysql事务有什么区别?4.2Redis的watch操作4.3为什么Redis不支持回滚参考蚂蚁课堂1.Redis淘汰策略简介Redis数据存放在内存里面内存有可能撑爆,为了不让内存撑爆所以Redis必须得有一些淘汰策略。一旦达到Redis缓存阈值就会触发淘汰策略。在redis

2022-03-28 20:03:53 1468

原创 Redis缓存穿透,击穿,雪崩

1.缓存穿透1.1缓存穿透的概念众所周知Redis数据是放在内存里面的,MySQL里的数据是放在磁盘里的访问MySQL需要做的是IO操作,所以我们一般查询数据都是这样的一个流程首先我先查Redis,如果Redis里面有数据直接拿出来就行了,如果没有就去查MySQL同时我把查到的数据写到Redis里面。但是如果黑客写个脚本故意去查Redis没有的东西,比如说我写个死循环里面随机生成一个Redis不可能有的东西,这样就会不断的访问MySQL严重的话会给MySQL打崩。这就是缓存穿透。1.2如何解决缓存穿透

2022-03-28 19:58:40 2287

原创 Redis分布式锁的设计与实现

Redis分布式锁的设计与实现文章目录Redis分布式锁的设计与实现1.什么是分布式锁?2.分布式锁的实现方案3.基于Redis实现分布式锁的方案4.Redis分布式锁的代码实现4.1获取锁4.2释放锁4.3分布式锁测试参考蚂蚁课堂1.什么是分布式锁?本地锁:在多个线程中,保证只有一个线程执行(线程安全的问题)分布式锁:在分布式中,保证只有一个JVM执行(多个JVM线程安全问题)举个例子比如说有两台服务器A和B,然后代码打包发布到两台服务器上,万一代码里面有个定时任务调度,这些任务调度和业务逻辑

2022-03-28 19:57:32 598

原创 Redis持久化机制RDB与AOF

参考:蚂蚁课堂Redis因为某种原因的情况下宕机之后,数据是不会丢失的。原理就是持久化。EHCACHE(一级缓存,JVM中的)也会有持久化机制。缓存框架一般情况下都有基本的淘汰策略,持久化机制。Redis持久化机制AOF,RDB(默认)。1.RDBRDB他的本质上是全量同步。下面我们看一下RDB同步方案的图解在redis中一共有两个进程一个是主进程它是专门监听我们redis请求的,另一个是fork子进程专门处理RDB数据同步的,它采用的方式是定时执行,在一段时间内他会将写入Redis文件的数据保

2022-03-23 22:34:20 989

原创 Redis与MySQL一致性解决方案

文章目录1.使用Redis二进制形式存储对象2.SpringBoot整合Redis注解3.MySQL与Redis的数据不同步问题3.1现象3.2解决方案4.全量同步和增量同步的区别4.1全量同步4.2增量同步参考蚂蚁课堂1.使用Redis二进制形式存储对象我们之前使用redis存储对象的时候都是把对象转化成json形式然后放到redis里我们每次获得对象都是将json转化成对象,类似于这样。String json = JSONObject.toJSONString(entity);redisUti

2022-03-23 22:29:36 1281

原创 Redis基本介绍

文章目录1.Redis简介2.Redis应用场景3.Redis单线程模型4.Redis常用命令5.Redis数据结构6.SpringBoot整合Redis框架参考蚂蚁课堂1.Redis简介Redis属于No-sql数据库类似于MongoDB,是一个完全开源免费的一个高性能的key-value数据库。它是基于内存的数据库,非关系型数据库不同于mysql,sqlserver,Oracle他们都是存放在硬盘的,我们每次操作都相当于IO操作性能非常低,非关系型数据库的数据都是存放在内存中的,如果redis一旦

2022-03-23 22:25:49 3598

原创 Seata概念以及简单应用

文章目录SpringCloud Alibaba Seata处理分布式事务1.分布式事务问题由来2.什么是Seata?3.分布式事务的相关概念4.Seata Server的安装和使用4.1 Seata修改配置文件4.2seata的启动5.Seata实例5.1业务声明5.2数据库准备5.3业务逻辑编写5.3.1 seata-order-service5.3.2 seata-storage-service5.3.3seata-account-service6.Seata@GlobalTranscational验证

2022-03-21 06:50:14 15428 64

原创 SpringCloudAlibaba Sentinel概念及简单应用

1.为什么要有Sentinel?之前我们对微服务进行监控,速率控制,服务熔断,服务降级等等都是通过Hystrix来进行的,而Hystrix需要我们程序员自己手工搭建监控平台没有一套Web界面来给我们进行更加细粒度化的配置流控速率控制,服务熔断,服务降级。。。。。现在Sentinel的出现解决了这些问题,它提供了直接界面化的细粒度统一配置。2.Sentinel下载安装运行到他的官网github上下载,https://github.com/alibaba/Sentinel/releases/tag/1.

2022-03-14 21:39:44 1476

原创 阻塞队列及方法介绍

1.BlockingQueue简介阻塞队列实际上就是个队列,只不过当队列里面东西是空的时候,当从队列中拿数据的时候会阻塞,当队列满了的时候,向队列中添加元素也会阻塞。当我不断取元素直到队列里的元素为空,会自动挂起线程,当我队列里面突然有元素了,会自动唤醒取元素的线程。这个阻塞队列的好处是我们不需要关心什么时候需要阻塞线程,什么时候需要唤醒线程,因为这一切BlockingQueue都一手给我包办了。2.常见的BlockingQueue2.1ArrayBlockingQueue基于数组的阻塞队列实现,在

2022-03-13 11:39:27 2476

原创 synchronized原理及优化

1.Java对象头以32位虚拟机为例普通对象的对象头一共有64位前面的32为是Mark Word后面的32位是Klass Word,这个Klass Word是一个指针他指向了这个对象所从属的Class。MarkWord的32位(普通)包括了25位的hashcode,4位的GC分代年龄,1位标识是否偏向锁,最后两位标识了加锁状态。2. synchronized工作原理Monitor被翻译成监视器或管程当有一个线程进入synchronized代码块中这个obj对象的对象头中MarkWord的头

2022-03-11 14:30:02 1374

原创 数据量不断增大的几种简单的优化方案

1.需求分析有这样一个需求做一个类似于资产的查询统计,并且可以通过条件进行查询。这里面涉及到的一共有两张表一个是委托表我们称之为WeiTuo,一个表是成交表我们称之为ChengJiao。我们看一下这个两张表的字段create table WeiTuo( wei_tuo_id bigint auto_increment primary key, link_account varchar(255)

2022-03-11 09:56:06 2835

原创 集合不安全小总结

1.集合不安全之并发修改异常ArrayList是线程不安全的集合,他的所有方法都没有加synchronized锁进行修饰,所以容易出现线程不安全的问题我们看一下下面的例子。public class ContainerNotSafeDemo { public static void main(String[] args) { List<String> list = new ArrayList<>(); for (int i = 1; i &

2022-03-09 11:05:05 292

原创 线程安全简单分析

1.成员变量,静态变量,局部变量是不是线程安全的?1.1成员变量和局部变量如果他们没有被共享那么他们是线程安全的如果他们被共享那要看他们的状态是否被改变也就是说只有读不会引起线程安全问题,既有读又有写会导致线程安全问题。1,2局部变量的线程安全问题局部变量是安全的,但是局部变量的引用不一定,如果该对象没有逃离方法的作用访问,它是线程安全的,如果该对象逃离方法的作用范围,需要考虑线程安全。下面我们来看这一段代码。1.2.1局部变量public class Test1 { public

2022-02-28 08:52:35 96

原创 线程进程管程概念介绍

1.什么是进程?总结一句话就是系统中正在运行的程序;应用程序一旦运行就是进程;进程——资源分配的最小单位。比如说你现在打开哔哩哔哩,哔哩哔哩就是运行的程序,即进程。里面的各种操作比如看视频之类的就是进程中的一个线程。一个进程里面可以有一堆线程。2.线程?2.1线程的概念系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。线程——程序执行的最小单位。2.2线程的状态这是线程类中的状态枚举类,枚举了线程中的各种状态 public enum State {

2022-02-25 12:39:31 685

原创 Java枚举的简单使用

来先看这样一个背景,比如说我想把我今天想做的事情依次列举出来,我们可以把它们标一个号这个可以用map映射然后遍历出来比如说这样。public class EnumTest { public static void main(String[] args) { HashMap<Integer,String> map = new HashMap<>(); map.put(1,"起床"); map.put(2,"洗漱");

2022-02-21 22:17:52 378

原创 SpringCloud Alibaba Nacos服务注册与配置中心

Nacos概念介绍以及简单应用

2022-02-20 22:27:30 379

原创 SpringCloud Sleuth 分布式请求链路跟踪

本文介绍了SpringCloud Sleuth分布式请求链路跟踪的概念以及他的简单使用,还有他在开发当中的意义。

2022-02-18 21:40:05 175

原创 volatile详解

volatile的三大特性,以及应用场景

2022-02-15 14:16:52 5401 2

原创 SpringCloud Stream消息驱动

1.为什么引入Stream?一提到消息想到的肯定是消息中间件,市面上用的最多的有四种MQ,分别是ActiveMQ,RabbitMQ,RocketMQ,Kafka。一般一个项目前端是vue,中台是JavaEE,后台是大数据,大数据最常用的消息中间件是Kafka,JavaEE可能用的是RabbitMQ,这就存在着一个问题,在中台和后台的交互过程中,两种不同MQ的切换,维护和开发十分繁琐,对于程序员的要求很高。比如说你今天被调到大数据组了,大数据那边用的是kafka,然后你不会kafka,然后那边告诉你兄弟学一

2022-02-14 22:43:08 1019

原创 SpringCloud Config分布式配置中心从概念到简单案例

1.什么是Config?为什么要有Config?一个大的项目或者系统中会有大量的微服务,每个服务都会有application.yml文件,如果你想更改一些配置,你需要对每个微服务进行修改但是要是有上百个微服务那就完了,你一天不用干别的了,就改配置文件玩儿了。所以我们需要一个东西能够让一些配置一次修改处处生效。 SpringCloud提供了ConfigServer来解决这个问题。SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了

2022-02-12 13:54:50 276

原创 SpringCloud Bus消息总线

文章目录1.什么是Bus为什么需要Bus?1.1触发一个客户端进而刷新所有客户端1.2触发一个服务端进而刷新所有客户端2.触发一个服务端进而刷新所有客户端3.Bus动态刷新之定点刷新(精准打击)1.什么是Bus为什么需要Bus?在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有的微服务实例都连接上来。由于该主题中产生的消息会被所有实例监听和消费,所以称它为消息总线。在总线上的各个实例都可以方便地广播一些需要让其他连接在该主题上的实例都知道的消息。它一共有两种设计思想

2022-02-12 13:51:25 1109

空空如也

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

TA关注的人

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