Java基础之常用框架核心思想解读

框架的本质

框架是一个简化我们日常开发的工具,实际上框架是封装了很多JDK中提供的的功能。

框架学习的思想

  • 找到逻辑基点:
    示例:例如Spring的核心思想是控制反转,需要我们把自己创建的java对象交给Spring管理,既然要放对象,那就得要有容器,这个容器时什么。
  • 大胆假设:
    示例:利用application.getBean()这个方法可以获得bean对象,而在调用这个API的时候发现它需要传一个字符串,既然通过一个字符串能获得一个对象,那么我们想到的容器有map和properties,而map比较常用,而且需要考虑线程安全性,猜想这个容器可能是CurrentHashMap。
  • 反向推论:
    既然认为容器是一个map,那么如果让我们自己去实现它,要怎么实现?

分析一下常见的框架

Spring分析:
Java基础之常用框架核心思想解读
SpringBoot分析:
Java基础之常用框架核心思想解读
SpringCloud注册中心分析:
Java基础之常用框架核心思想解读
SpringCloud之负载均衡器Ribbon分析:
Java基础之常用框架核心思想解读

一致性Hash算法

了解一致性hash算法前我们得先了解什么是hash算法

  • 哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。
    hash算法在分布式的应用中存在不足
    比如,在分布式的存储系统中,要将数据存储到具体的节点上,如果我们采用普通的hash算法进行路由,将数据映射到具体的节点上,如key%N,key是数据的key,N是机器节点数,如果有一个机器加入或退出这个集群,则所有的数据映射都无效了,如果是持久化存储则要做数据迁移,如果是分布式缓存,则其他缓存就失效了。
    接下来画图来理解:
    Java基础之常用框架核心思想解读
    Java基础之常用框架核心思想解读

下面我们来了解一致性hash算法

  • 一致性哈希提出了在动态变化的Cache环境中,哈希算法应该满足的4个适应条件:
  1. 均衡性(Balance)
    平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。
  2. 单调性(Monotonicity)
    单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲区加入到系统中,那么哈希的结果应能够保证原有已分配的内容可以被映射到新的缓冲区中去,而不会被映射到旧的缓冲集合中的其他缓冲区。(这段翻译信息有负面价值的,当缓冲区大小变化时一致性哈希(Consistent hashing)尽量保护已分配的内容不会被重新映射到新缓冲区。)
  3. 分散性(Spread)
    在分布式环境中,终端有可能看不到所有的缓冲,而是只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓冲上时,由于不同终端所见的缓冲范围有可能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。这种情况显然是应该避免的,因为它导致相同内容被存储到不同缓冲中去,降低了系统存储的效率。分散性的定义就是上述情况发生的严重程度。好的哈希算法应能够尽量避免不一致的情况发生,也就是尽量降低分散性。
  4. 负载(Load)
    负载问题实际上是从另一个角度看待分散性问题。既然不同的终端可能将相同的内容映射到不同的缓冲区中,那么对于一个特定的缓冲区而言,也可能被不同的用户映射为不同的内容。与分散性一样,这种情况也是应当避免的,因此好的哈希算法应能够尽量降低缓冲的负荷。

接下来画图来理解:

Java基础之常用框架核心思想解读