- 博客(14)
- 收藏
- 关注
原创 SpringCloud配置动态更新原理解析
注:从SpringCloud配置动态更新的原理可知,诸如数据库连接配置,在配置中心修改了配置后只是会更新@RefreshScope注解Bean中的@Value属性,如果要动态修改数据库信息,则还需要重建DataSource对象、清除旧连接等操作。1、对于使用@Value注解获取配置的属性,不会随配置数据的更新而更新,因为Bean对象已经创建完成,配置变化时只是更新Environment中的数据,并没有更新Bean属性值的动作发生。这里的name变量值直接来自于Environment对象。
2025-01-12 18:26:56
370
原创 SPI和API,SpringBoot自动装配原理解析
SpringBoot的设计是基于Spring的,所以其实SpringBoot的启动流程包括的Spring的启动流程,SpringBoot在启动Spring(refresh方法)之前,提前做了spring.factories文件的解析,并把对应的类注册到了Spring容器中。对于纯Spring来说是不行的,因为这总得把druid中的那些类告诉Spring吧,xml中没配,包扫描的话druid的包又和我项目的包结构不一样,总之就是必须开发人员通过一种方式手动配置上druid的相关类。
2024-11-24 22:08:42
675
原创 Netty-TCP服务端开发解析
1、Java领域诸多大名鼎鼎的项目在网络通讯框架方面几乎都使用了netty,包括SpringCloudGateway、Dubbo、Zookeeper、Kafka、Spark、Hadoop、ElasticSearch、RocketMQ、gRpc等等。因为netty可靠性高、性能好、开发简单、功能丰富、bug修复及时。本篇对使用Netty开发TCP服务端的代码和工作原理做简要介绍。2、tcp服务端的io操作主要有:Listen:监听端口、accept:接收连接、read:读数据、write:写数据。
2024-09-17 18:32:07
2292
1
原创 线程池工作原理和参数调优
对于jdk的线程池,这是一个很容易理解错的参数,假如核心线程数为10,队列数为10,最大线程数为20,则当我们向线程池提交21个任务时,会先安排10个线程来执行前10个任务,第11至20个任务则会被放到阻塞队里暂存,当提交第21个任务时,由于核心数用尽、队列也用尽,此时会产生第11个线程,来执行第21个任务。那么如何让一个线程一直存活,并执行一个又一个的任务?核心线程数->阻塞队列->最大线程数都用尽了,再提交任务,就触发拒绝策略,常见的拒绝策略如抛异常、交给提交任务的线程去执行(任务变成同步了)等。
2024-08-04 23:51:54
1106
原创 BIO和NIO
显然,NIO编程难度远大于BIO,不仅需要熟悉非阻塞io、多路复用相关的api,还需要熟练掌握多线程,甚至可能需要解决应用层的问题,不像BIO每个连接有自己独立的线程,如果用NIO开发类似http这种请求响应类的协议,请求和响应的对应关系必须仔细设计一番。以tcp为例,主要的io操作包括建立连接、读、写,服务端监听一个端口,多个客户端可以来连接,同一个主机也可以通过多个端口来连接服务端,只要保证客户端的ip和端口不完全相同即可建立一条连接。,多路复用器执行select方法筛选出有io事件的socket,
2024-06-27 21:05:36
661
原创 Java应用内存区域
附:OOM的问题排查,在java应用启动时可以添加参数-XX:+HeapDumpOnOutOfMemoryError和-XX:HeapDumpPath=来设置当应用出现OOM时自动生成内存快照,也可以在运行时使用jmap -dump:format=b,file= 命令来生成当前内存快照dump文件,使用工具 VisualVM或MAT分析dump文件可以看出在当时各类型对象的数量和大小,找到大对象等,从而推测出内存泄露的位置。6、直接内存:记得释放。
2024-06-16 17:43:27
669
原创 Java锁和分布式锁用法浅析
这里的num自增自减虽然在java层面只有一行代码,但是在cpu执行时其实是多个步骤,至少包括读取数值、计算加1、写回内存,而这中间便可能发生线程切换,例如:线程一读取了num的值为0,然后线程二也读取了num的值为0,线程一计算+1再写回内存值为1,线程二再计算-1然后写回内存值为-1,所以明明应该得到结果为0,但是这里得到的值却是-1,这里最本质的问题就是。的,即由一个线程来执行从外部传进来的诸多命令,一个命令一个命令排着执行,先到的先执行,后到的后执行。Java代码层面最简单的方法就是加锁,
2024-04-26 23:53:26
1171
3
原创 JDK动态代理用法简介
答案是自己想办法提供原始类的对象,图示中我自己new了一个原始类对象obj,然后在invoke方法中直接用反射调用,invoke方法的第二个参数method,就是对应的原始方法,第三个参数就是这个method的实参,这两个参数值都是在proxyInstance调用方法时才动态确定。c、一个InvocationHandler对象,我这里用了匿名内部类,当然可以专门单独写一个类。时,实际都是执行我们的InvocationHandler对象的invoke方法,这就相当于把原始的方法全都给替换了。
2024-04-15 15:06:53
391
原创 Spring启动流程解析
主要是准备工作,在后面执行BF后置的时候,我们会发现context有的属性莫名奇妙的已经有值了,比如beanFactory对象,那么他们的值很可能就是在这里产生的,但是SpringBoot的话是在context构造器中new出的beanFactory,这些逻辑根据context的类型不同而异,有些xml类的context在这里解析了xml并生成beanDefinition存入beanDefinitionMap中。,SpringBoot的tomcat是在这里启动的,端口在此正式监听。
2024-04-10 17:46:33
1004
原创 SpringBoot配置文件优先级解析
其实以上的优先级介绍并没有覆盖所有的配置文件类型和配置形式,譬如我们还可以在classpath的config目录中放一个application.yaml,这个文件的优先级应该在哪个位置呢?来自各个地方的配置,最终都存在了这个List中,所以我们会得到一个有序的配置文件列表,其中每一个元素对应一个配置文件。所以其实一共有几种类型的配置文件并不确定,我们可以自行增加,如果项目使用了配置中心,可以查看到其配置数据在List中的位置相对靠前,也就是为什么我们配置中心里的配置优先级高于jar包中的配置。
2024-02-15 23:37:00
2226
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人