自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Minor的Java技术博客

Java系列知识点

  • 博客(102)
  • 收藏
  • 关注

原创 MySQL中的各种锁(行锁、间隙锁、临键锁等等LBCC)

MySQL默认就是使用的临键锁,当在非唯一索引下如果SQL没有命中记录则就是间隙锁,命中了记录就是临键锁。如果用唯一索引且SQL命中了记录,那么加的就是普通记录锁,否则就是间隙锁。,这段语句就会对该记录进行加S锁,允许其它事务的读取,其它事务也可以继续加S锁,但是不允许其它事务加X锁,否则会阻塞,直到当前事务提交后释放了S锁,其它线程才能加X锁。和间隙锁不同的是,临键锁是SQL命中了部分记录的场景,除了会锁定间隙外还会锁定命中记录的下一个区间,是一个。...

2022-08-01 21:58:01 2036 3

原创 Kafka设计原理

对于Leader新写入的消息,consumer不能立即消费,Leader会等待该消息被所有的ISR节点同步后更新HW,此时消息才能够被消费者消费,这样就保证了如果Leader所在的Broker节点挂了,该消息仍然可以从新选举的Leader中获取。当Kafka集群启动的时候,会自动选举一个Broker作为控制器,选举的过程就是让每一个Broker去zookeeper中创建一个/controller的临时节点,创建成功的Broker就成为控制器。kafka定期清理topic里的消息,最后保留最新的数据。...

2022-07-31 17:02:18 400

原创 Skywalking入门

Skywalking是国产开源并且加入了Apache的一个分布式链路追踪框架,为分布式应用程序提供性能监控、链路追踪、可视化等服务。常见的链路追踪框架还有SpringCloudZipkin、Pinpoint、CAT等。skywalking的优势是利用了Java的Agent探针技术使得效率十分高。Skywalking通过探针技术来监控应用数据。并且支持多种语言的探针技术,例如Java、.Net、NodeJs等,并且提供了UI可视化平台,操作上手难度低。...

2022-07-30 11:27:09 393

原创 Sentinel入门

Sentinel组件和其它微服务组件一样,SpringBoot只需要引入一个sentinel的starter即可。Sentinel提供了一个可视化的UI控制台界面,在上面可以直观的看到微服务的状态和配置信息。Sentinel是阿里开源的一款分布式服务流控组件,主要以流量为切入点,从限流、流量塑形、熔断降级、负载保护、热点防护等多个维度来进行服务的稳定性保障。在分布式环境下,多个服务之间会存在频繁的依赖调用,在流量洪峰面前可能会造成某一个节点的资源耗尽或者是由于调用链依赖关系导致全链路发生故障、不可用。...

2022-07-29 21:46:31 325

原创 Gateway入门

一般情况下我们习惯用GlobalFilter,覆盖它的filter方法来实现请求的自定义操作,例如日志、认证授权、添加Header等操作。SpringCloud推出的一款基于WebFlux+Netty的Reactor响应式编程网关组件,性能相当于Zuul的一倍多。网关在分布式微服务架构中可以做很多事情流控、日志监控、统一认证权限校验等。Gateway的过滤器支持Pre前置处理和Post后置处理两种模式,我们也可以实现Filter接口来自定义Gateway的过滤器,通过Order接口可以实现过滤器排序。...

2022-07-28 11:05:19 804

原创 MySQL高可用和主从同步

Manager节点一般是独立部署一台机器,Node节点一般是部署在每台MySQL机器上的,Node节点通过解析MySQL的日志来进行工作。MySQL主从集群默认采用的就是异步复制方式,Master的事务提交后,写入binlog然后就给客户端返回成功的响应了。相比于异步复制,半同步复制就是说事务的提交后binlog要保证至少将数据同步给一个从库才算完成,但是半同步复制并不保证从库对数据的提交是否成功。日志上的,通过对Binlog的实时同步来实现主从数据的同步。常见的分库分表手段有客户端插件、数据库代理。...

2022-07-27 23:06:13 674

原创 面试必问Spring的核心概念

在Context初始化的时候通过参数(xml或者类等)解析扫描路径,遍历所有的class文件,找出类上标有@Component等注解的类,封装成对应的BeanDefinition对象放入容器的一个Map中。负责生产Bean的Bean,它是一个接口,需要覆盖它的getObject方法,里面可以返回我们具体要返回实例化的Bean。7.当Bean创建完毕以后,如果Bean是单例的,就放入容器的单例池Map中,如果是原型的则不放入,下次getBean()的时候重新走流程创建新的Bean。...

2022-07-27 11:36:44 125

原创 面试常问Future、FutureTask和CompletableFuture

CompletableFuture就是为了多个异步任务编排而诞生的强大JUC包下的工具,CompletableFuture是对Future的扩展和增强。不同的是,join方法抛出的是未受检异常,get抛出的是受检异常需要手动处理。CompletableFuture提供有2种异步任务的执行方式runAsync、supplyAsync他们的区别就是后者支持有返回值的场景。需要注意的是,FutureTask的任务状态是单向的,一旦任务完成以后,他的状态就不可逆。...

2022-07-26 21:26:31 735

原创 分布式事务和Seata的AT模式原理

Try-Confirm-Cancel,本质也是业务服务化的两阶段提交协议,TCC一共有3个步骤,第一阶段需要由应用程序来进行对资源的预留,当所有参与者的try接口都成功了,那么事务管理器就会提交事务进行confirm,否则进行cancel回滚资源释放。Seata支持多种分布式事务模式,官方主推的是AT模式,AT模式是一种无侵入式的、类似于自动化的隐式TCC模式。2PC一共有2个阶段预提交和commit。在分布式系统架构中,复杂的业务需要跨库操作,要保证全局的事务一致性问题就得需要解决分布式事务问题。...

2022-07-25 13:56:10 307

原创 OAuth2和JWT

这种模式需要客户端、服务端、三方服务器共同协调完成,这种模式需要三方应用客户端通过授权得到一个Code码,客户端拿着这个code请求自己公司的服务端,服务器通过code去三方应用获取一个Access_Token,得到三方的Access_Token以后,服务器就可以调用API获取用户的一些非敏感信息了,例如可以拿到用户的头像、用户名、账号ID、open_id、union_id等。目前主流的版本是OAuth2。这种模式抛弃了用户的概念,客户端以自己的名义发起授权请求,这种模式适用于命令行的一些基础应用。...

2022-07-25 13:53:35 1518

原创 SpringBoot启动流程简要

SpringBoot启动流程简要。

2022-07-24 19:02:55 1824

原创 SpringBoot自动装配原理@EnableAutoConfiguration

1.命名规范问题,官方的starter一般命名风格是`spring-boot-starter-xxx`,我们自定义的一般换一个写法更好容易区分。1.POM中引入spring-boot-configuration-processor,以便提供配置文件处理功能提示。1.编写自己satrter的service逻辑等。...

2022-07-24 19:01:53 465

原创 SpringCloud Ribbon

通过实现IRule接口可以自定义负载策略,主要的选择服务逻辑在choose方法中实现。

2022-07-23 17:53:50 144

原创 Nacos

微服务架构是由单体架构向SOA服务化架构之后提出的一种去中心化、服务化的架构模式。微服务的特点是业务边界划分明确、独立的部署、服务之间通过RPC进行通信。我们将Namespace作为隔离开发、生成环境的标准,groupId作为隔离项目,dataId就是我们具体的配置了。Nacos除了可以作为注册中心以外,还可以作为配置中心,我们公司现在也在用Nacos作为配置管理中心,Nacos提供了服务发现与路由、健康检查、配置中心、动态DNS服务等。...

2022-07-23 17:51:56 168

原创 面试常问K8s概念Kubernetes

K8s提供的配置中心服务,使用时可以作为Pod容器的环境变量、配置信息数据,例如可以将应用程序服务所需要的yml、jvm等参数放到configMap中,等应用程序启动的时候通过K8s的API来解析获取。Pod是K8s编排容器的最小逻辑单元,Pod也相当于是一个逻辑主机的概念负责管理具体的应用实例,包括1个或多个Docker容器,一般是一对一关系。Service是K8s里面的一个抽象的概念,Service是一组Pod的逻辑集合,给这些Pod提供服务发现、负载的能力。...

2022-07-22 17:06:52 283

原创 Docker常用命令

现在主流的公司并没有采用这种DockerCompose编排技术,而是使用K8s去做,但是DockerCompose也是提供了一个通过一个编排文件,在文件里面编写编排Docker容器的docker命令,然后就会自动的启动协调各个容器的启动功能。Docker容器相当于一个轻量级的操作系统,容器之间是资源隔离的,但是都可以同时运行在同一个宿主机上。最后,通过dockerbuild-t应用程序名来构建Docker镜像,然后通过dockerrun镜像名就可以启动容器并启动了我们的应用程序。...

2022-07-21 22:01:52 265

原创 Dubbo的SPI机制和服务暴露

Dubbo是阿里开源的一款RPC框架,现在已经是Apache的顶级项目,Dubbo的设计定位是一款高性能的RPC框架,随着Dubbo的发展,Dubbo还提供了服务治理、服务监控、服务网关等功能,所以Dubbo现在已经不单单是一款RPC框架了,还是一个具有不错生态的服务框架,但是单论服务生态能力还是和SpringCloud有所不足。Dubbo的SPI机制主要封装在一个叫。Dubbo的服务暴露的本质就是将服务端提供的接口服务告诉给客户端或者注册中心怎么访问具体的服务,就是将服务的请求路径URL暴露出来。...

2022-07-19 21:08:03 427

原创 Zookeeper实现分布式锁的两种方案

就是一旦发生了加锁失败,大量的客户端都来watch同一个节点,这样可能会导致一旦锁被释放也就是临时节点被删除,那么zk就会通知所有的监听者。因为zk提供了watch监听机制,且zk同一个目录下的节点名字是不能重复的,基于这两个特性可以用来做分布式锁。这种方式相比于第一种而言,可以优化羊群效应。但是这种方式是一种公平锁的实现方式。但是这种实现方式有一个缺陷,类似于。...

2022-07-18 20:41:10 578

原创 Zookeeper的应用和ZAB协议简单总结

客户端的写事务请求,都转交给Leader接受,Leader将该写事务请求发送给所有的Follower,然后根据集群内Follower的反馈来决定是否执行事务提交的命令发放(过半原则如果Follower超过半数得到ack回应就认为这次写事务可以做提交准备了)。Zookeeper是ApacheHadoop旗下的一款开源的分布式协调框架,它是一个分布式的kv存储系统,他类似于文件系统的目录的方式存储数据,还可以对数据进行监听和管理。zk的目录节点可以按照两个维度来划分是否有序、是否持久。...

2022-07-18 20:40:04 466

原创 Netty基础组件和常见面试问题(粘包、半包)

对于Selector的#select()进行周期性的计数,当发生依稀空转就进行一次计数,如果在某一个周期内连续法身了n次空转,说明就发生了epoll的空转问题。当Channel被创建时,它将会被自动地分配一个新的ChannelPipelint,每一个Channel都有自己专属的ChannelPipeline,这个关联关系是永久的。半包的发生情况就是一个完整语义的数据包被分成了多次的数据包接收,就存在半包的问题,如果不做控制,服务端并不知道接收到的数据包是一个不完整的。......

2022-07-18 20:27:57 365

原创 Linux对网络通信的实现原理(select、poll、epoll)

当被监控的文件描述符上有可读写事件发生时,epoll_wait()会通知应用程序去读写,如果这次读写没有处理完数据,那么下次调用epoll_wait()是,OS还会继续通知应用程序继续读写,如果你一直不处理完数据,OS会一直通知你。select的优点是跨平台支持,缺点是单个进程的文件描述符是有OS控制的,Linux最大是1024个,但是可以修改。Linux的5种IO模型阻塞IO、非阻塞IO、IO多路复用、信号驱动IO、异步IO,前面四种都是同步的模式,只有最后一种是异步的。...

2022-07-18 20:24:41 567

原创 IO多路复用和Reactor模型

虽然这种模式下引入了线程池,效率得到了一定的提升,但是毕竟是采用单Reactor架构,所有的事件都是交给单个Reactor负责,在面对瞬间的高并发连接场景,单Reactor多线程模型仍然性能不佳。Reactor模型是对事件处理流程的一种模式抽象,是对IO多路复用模式的一种封装,Reactor又叫反应器,在这里特指的是对各种事件的反应处理。为了优化单Reactor模型的性能瓶颈,将原来单独的Reactor的功能进行分解为连接处理器和通信处理器,由多个不同的Reactor共同完成网络通信任务。...

2022-07-18 20:22:44 1228

原创 Tomcat架构组件原理和生命周期LifeCycle

上层容器的初始化会触发子容器的初始化,上层容器的启动会触发子容器的启动。Connector连接器中的Adapter适配器组件将封装好了的ServletRequest对象传递给Service的Engine容器,Engine处理完毕后继续将请求传递给子容器Host,Host继续处理交给子容器Context,如此下去形成了一个。在Tomcat中,容器的概念就是来装载Servlet的一个管理器,Tomcat基于分层架构的思想,设计了4种容器Engine、Host、Context、Wrapper。...

2022-07-15 23:19:52 247

原创 总结一下Tomcat的IO模型和Tomcat调优

对象池技术的目的就是对象的缓存和复用,以空间换时间。同步队列来进行生产-消费模式进行通信,Poller的本质就是一个Selector,由一个单独的线程while(true)监测Channel的就绪状态,一旦有Channel可读,就会生成一个SocketProcessor任务对象给Executor线程池处理。Tomcat里面NIO的实现是交给Endpoint组件完成的,NioEndpoint是基于JDK的NIO实现的多路复用的IO模型,并且Tomcat的网络模型是。Acceptor和Poller是通过。...

2022-07-15 23:16:13 1004

原创 RocketMQ的NameServer原理

RocketMQ的路由注册是通过Broker和NameServer的心跳功能实现的,Broker启动时向集群中所有的NameServer发送心跳请求,每隔30s向集群中所有NameServer发送心跳包,NameServer收到Broker的心跳包时会更新BrokerLiveTable中的时间戳信息,然后NameServer每隔10s扫描这个BrokerLiveTable,如果连续120s没有更新这个时间戳的Broker,NameServer就会移除该Broker的路由信息同时关闭Socket连接。...

2022-07-14 20:56:03 328

原创 RocketMQ的生产、消费高可用和Reblance、堆外内存等问题

例如,TopicA分布在2个Broker节点上,每一个Broker节点都有默认4个这个TopicA的队列,如果此时只有1个消费者,那么这个消费者就会分摊8个队列的任务,如果此时加入一个消费者,那么每一个消费者就会平均分配4个。当队列数量和消费者数量持平的时候,此时再加入消费者,是不会触发Reblance的,多出来的消费者没有任何任务负担。(这种方式的缺点是有可能重试会再一次失败,因为如果第一次失败了大部分情况是这个Broker有问题了,所以当第二次选择这个Broker的其他队列时,大概率也会失败。.....

2022-07-14 20:54:27 1063

原创 RocketMQ存储设计CommitLog和零拷贝等

RocketMQ操作CommitLog、ConsumeQueue是基于内存映射MMAP技术实现的,在Broker启动的时候就会加载这两个目录下的所有文件,所以不可能消息永久性的保存在服务器上。RocketMQ清除过期文件的方法是如果某个文件在一定间隔时间内没有被更新,则认为是过期的文件,可以被删除,默认每个文件的过期时间是72小时,可以配置。每个ConsumeQueue中存储的消息条目都不是全量数据,而是消息的一部分信息,包括消息在CommitLog中的偏移量、消息大小、消息Tag的哈希值。...

2022-07-14 20:50:40 432

原创 RocketMQ物理架构和消息

对于生产者而言,分组用来标识同一类消息的Producer,仅做标识使用,没有特别的意义,RocketMQ的生产者Group更多是在事务消息会用到(Broker回查,遇到Producer宕机可以选择Producer同一个组的生产者回查消息是否提交or回滚。管理消息的物理单元,一个Topic主题有若干个消息队列,如果一个Topic创建在不同的Broker上,则不同的Broker上都有若干个消息队列。组间共享,组内竞争。RocketMQ本身没有提供顺序消息的功能,但是可以借助一个方式来实现消息的顺序性。.....

2022-07-14 20:48:44 214

原创 面试常问MyBatis原理和二级缓存

MyBatis的二级缓存还可以自定义实现,通过引入ehcache的包来实现二级缓存。

2022-07-14 20:39:37 234

原创 SpringMVC流程和父子容器

SpringWebMVC是基于Servlet构建的Web应用框架。web开发领域的MVC架构是基于JSP+Servlet的模式进行开发。Servlet模式的开发效率十分低下,需要配置一堆XML文件,还要做各种参数解析、JSP页面等等。SpringMVC是对Servlet的MVC模式进行了升级,SpringMVC就是将一个前端控制器拿来作为调度控制中心,负责调度和委托各种组件来解析请求,例如委托映射解析器、视图解析器等等。......

2022-07-14 20:37:39 288

原创 Spring事务@Transactional注解原理

这个注解的作用不言而喻,就是开启Spring对事务管理的支持。和其他的Enable注解类似,他的底层原理就是通过ImportSelector接口向IOC容器中放入了2个Bean:1.1 AutoProxyRegistrar(AOP的支持)这个Bean的作用就是向IOC容器中注册了一个的实现类,这个抽象类就是AOP的核心实现。所以这个Bean说白了也就是,在Spring Bean初始化后会进行对Advisor的寻找,然后判断当前Bean是否需要进行AOP并且是否有符合的切点,然后进行AOP的操作。这也是一

2022-07-12 16:40:11 953

原创 Spring AOP原理

基于Proxy类的#newInstance( )方法来获取目标对象的代理对象,JDK的动态代理必须实现,因为Java语言不支持多继承,但是支持多实现。实现机制:2.Cglib动态代理Cglib是一个第三方代码生成库,是对ASM字节码技术的二次封装,在运行时动态生成代理对象,它的特点是基于子类继承的关系来实现。特点:基于子类的继承、无法对final修饰的类和方法进行代理、效率高、额外引入Jar包。实现机制:3.ASM字节码技术ASM是一个操纵字节码的工具框架,ASM可以直接生成二进制的class

2022-07-12 16:36:38 157

原创 浅谈一下Spring构造推断

这种场景,Spring很好处理,直接通过无参构造实例化得到Bean对象即可。Spring别无选择,只能使用这个构造作为实例化的选择。

2022-07-12 16:31:05 99

原创 Spring循环依赖问题和三级缓存

Spring默认是支持的,不过也可以通过容器设置关闭。Spring的循环依赖是基于三级缓存的三个Map来完成的,三个Map各自有各自的作用。传统的循环依赖,不依靠外力干扰肯定是不能实现的,需要一些Map进行实例化过程中的外力干扰。Spring提出了的概念,其实就是3个Map:3.1 循环依赖的解决流程A在实例化过程中,会提前将暴露出来,这个Lamda表达式有可能用不上,也有可能用得上。将这个Lamda表达式缓存在三级缓存这个Map中。如果发生了循环依赖,B在获取A的时候,先去一级缓存拿,拿不到就去二级

2022-07-12 16:28:32 214

原创 Spring依赖注入主流程

在XML配置的形式下,在标签中可以手动注入属性的ref引用关系或者指定构造的注入,称之为手动注入的形式(set注入、构造注入)。在标签中可以配置的自动注入方式是byType还是byName还是构造等,在创建Bean的过程中Spring将这个类的所有方法解析出来通过一定的规则进行筛选(例如set方法)然后进行属性注入。它是byType和byName的结合,注解可以使用在:3.2 寻找注入点(postProcessor机制实现)在Bean的实例化阶段时,Spring利用拓展机制调用方法来对Autowired

2022-07-12 16:26:36 372

原创 简单梳理下SpringBean生命周期

1.通过ResourcePatternResolve扫描指定包路径下的所有文件。2.每一个class文件在Spring中都抽象成Resource对象。1.利用MetadataReaderFactory解析Resource对象得到MetadatarReader对象。2.解析过程采用的是ASM字节码技术,没有加载类。1.MetadataReader拥有类的所有信息,通过判断类上是否带有@Conditional注解来筛选。2.如果类上有条件注解,或者有excludeFilters等过滤表达式,则匹配的类就直

2022-07-12 16:21:44 149

原创 Redis实现可靠的分布式锁

不管是单机的锁还是分布式锁,要达成锁的功能一定要有原子性、互斥性的能力,Redis提供了好几个命令可以选择,其中使用最常用的就是命令:如果key不存在,就设置,否则就什么也不做。在分布式环境下,多个线程都来对某个key执行SETNX命令,Redis能够保证只有1个线程能够执行成功,这样就可以基于这个特点来做一个分布式锁。如果单纯用Redis的SETNX命令来实现分布式锁,还有很多问题。例如某个线程加锁成功,如果这个线程发生了永久性的阻塞或者进程结束,那么Redis里面的这个Key就永远无法释放,这样就发生了

2022-07-09 23:42:19 308

原创 面试必问Redis五大数据结构的底层编码实现(RedisObject、压缩列表、跳跃表、SDS等)

Redis虽然是通过C语言编写,但是他的字符串类型并没有采用C语言的字符串,而是自己定义了一个字符串类型叫SDS来作为Redis字符串类型的默认实现。例如执行,name作为key也是使用的SDS,value张三仍然是一个SDS对象作为底层实现。再例如,student作为key使用的是SDS,键值对的值是Redis五大结构中的List列表对象,列表对象底层也有对应的底层实现,那么列表的元素张三、李四仍然是通过SDS存储的。SDS除了用来保存数据库中的字符串值以外,SDS还用来作为一些缓冲区Buffer,例

2022-07-09 23:41:25 695

原创 MySQL双写缓冲区DoubleWrite Buffer和ChangeBuffer

InnoDB的索引一般使用B+Tree的数据结构,但是InnoDB还支持一种索引的方式:哈希索引。InnoDB底层会实时监控索引,如果某个索引使用十分频繁,就会被认定为这个索引是热点数据,然后在InnoDB的Buffer Pool内存中创建一个Hash索引,称之为自适应Hash索引。创建以后,如果下次的查询又命中索引,那么就可以利用这个Hash索引直接O(1)的时间复杂度就能查询结果。但是,自适应hash索引只能提供的查询,做范围、模糊查询是不支持的。而且InnoDB的自适应Hash索引使用的是拉链法解决

2022-07-09 23:36:33 410

原创 Redis底层机制(RESP协议、IO模型、淘汰策略和删除策略)

RESP(redis serialization protocol)redis序列化协议,底层采用的是TCP的连接方式,通过tcp进行数据传输,然后根据解析规则解析相应信息,它具有着实现简单、解析极快、人类可读的特点。RESP可以序列化不同的数据类型,如整数,字符串,数组,还有一种特定的错误类型,它是二进制安全的,因为它使用前缀长度来传输数据。RESP虽然是为Redis设计的,但是同样也可以用于其他C/S的软件,但是Redis Cluster集群模式,节点间通信协议不是resp而是基于Gossip方式。

2022-07-09 23:30:09 815

空空如也

空空如也

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

TA关注的人

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