Java并发编程 01:线程基础
JDK核心知识 02:进阶特性
Map源码
Map是集合里一个非常重要的数据结构,面试也是会经常问到源码的。
HashMap
简单描述一下HashMap的原理,它的结构就是数组+链表+红黑树。
put的时候,对key进行hash,找到对应的数组位置放在里面,然后hash冲突了就组成链表往后追加。查询的时候也是一样,对key进行hash,然后用equals去比较链表上key的值。
JDK1.8优化了hashmap的数据结构,如果链表过长,达到8以后,就会转变成红黑树。
数据结构
这个数组的初始化长度,是16,和ArrayList不一样。
1 | // 数组变量 |
JDK核心知识 01:基础概念
JDK集合源码
准备写一些文章,把集合、并发、网络相关的JDK工具的使用和源码都在这里记录一下。首先从简单的集合源码开始。
List
ArrayList
基于数组的集合,默认的构造函数,给了一个空数组,Object[], {},默认的初始化大小为10。
1 | /** |
一般在构造ArrayList,建议指定一个大小,避免频繁扩容带来的开销。
每次往ArrayList中插入数据的时候,都会判断当前数组的元素是否塞满了,如果塞满的话,此时就会扩容这个数组,然后将老数组中的元素拷贝到新数组中去,确保说数组一定是可以承受足够多的元素的。
Spring Cloud健康检查陷阱:线上故障排查实录
Spring Cloud Netflix生产实践指南
服务注册生产实践
服务注册的时效性(毫秒级)
服务在启动后,会向eureka server发起注册,应该是在1秒以内的。
会通过SpringCloud额外封装的EurekaAutoServiceRegistration#start()发起注册,这个类的实例被EurekaClientAutoConfiguration定义。
服务发现的时效性(毫秒级和分钟级)
一个服务启动后,发现其他所有的服务需要多长时间?如果其他服务新增了机器,那么又需要多长时间才能发现。
- 服务启动后,会主动拉取全量注册表,可以发现已经注册的服务列表(毫秒级)
- 服务每隔30秒会拉取增量注册表(先走ALL_APPS_DELTA缓存,读不到查queue)
- eureka server 二级缓存,定时任务30秒从readWriterCacheMap同步到readOnlyCacheMap
- 一个服务启动注册后,要30秒才会被其他服务发现(1分钟以内)
Zuul网关实战 02:核心流程与源码分析
Zuul网关实战 01:介绍与基本使用
Hystrix实战 06:源码分析
HystrixCommand.execute源码细节
HystrixCommand会将任务丢到异步线程池里去执行,通过Future获取执行完毕的结果。
1 | // HystrixCommand.java |
queue()方法,是用来异步执行的command逻辑的,他会将command扔到线程池里去执行,但是这个方法不会等待线程执行完毕command,他会拿到一个Future对象,通过Future对象去获取command执行完毕的响应结果。
Spring Cloud组件MaxTotalConnections配置详解
背景
在zuul网关中,有关于配置连接数量的配置:
1 | zuul: |
这个是只是的zuul调用静态路由配置的Http连接池数量,按照实际情况设置就好(请注意不要和Tomcat的maxConnections搞混了)。
这个配置并不会对基于Ribbon的下游服务访问生效,如果要配置Ribbon相关的配置,需要配置以下的配置:
1 | ribbon: |
