Improve Robustness (2)
Improve Robustness (1)
Proxy
代理模式是一种经典的设计模式,代理的意义在于生成代理对象,在服务提供方和使用方之间充当一个媒介,控制真实对象的访问。
代理分为静态代理和动态代理两种。
静态代理需要通过手动或工具生成代理类并编译,代理类和委托类的关系在编译期就已经确定。动态代理允许开发人员在运行时动态的创建出代理类及其对象。
Thread Pool
a Lock Based on ReentrantLock
基于 ReentrantLock实现一个锁
1 | package aqsLock; |
基本功能实现,测试:
CAS&AQS
Head First Map
Spring Cyclic Ependencies
Spring是怎么解决循环依赖的?
首先站在Spring整个Framework体系而言的话,Spring的Bean是由一个BeanDefinition来的,就是在Spring当中,有一个叫建模的类BeanDefinition,Spring的Bean有一系列比较复杂的生命周期:
首先,Spring容器启动。
spring进行扫描
反射后封装成beanDefinition对象,放入beanDefinitionMap
遍历map
验证(是否单例、是否延迟加载、是否抽象)
推断构造方法( 把当前这个Spring Bean所代表的类当中的构造方法得到一个最佳的一个构造方法 )
准备开始进行实例
去单例池中查,没有——》去二级缓存中找,没有提前暴露——》生成一个objectFactory对象暴露到二级缓存中——》属性注入,发现依赖Y——》此时Y开始它的生命周期直到属性注入,发现依赖X->X又走一遍生命周期,当走到去二级缓存中找的时候找到了->往Y中注入X的objectFactory对象->完成循环依赖。
Head First Nginx
公司产品出现瓶颈?
我们公司项目刚刚上线的时候,并发量小,用户使用的少,所以在低并发的情况下,一个jar包启动应用就够了,然后内部tomcat返回内容给用户。
但是慢慢的,使用我们平台的用户越来越多了,并发量慢慢增大了,这时候一台服务器满足不了我们的需求了。
于是我们横向扩展,又增加了服务器。这个时候几个项目启动在不同的服务器上,用户要访问,就需要增加一个代理服务器了,通过代理服务器来帮我们转发和处理请求。
我们希望这个代理服务器可以帮助我们接收用户的请求,然后将用户的请求按照规则帮我们转发到不同的服务器节点之上。这个过程用户是无感知的,用户并不知道是哪个服务器返回的结果,我们还希望他可以按照服务器的性能提供不同的权重选择。保证最佳体验!所以我们使用了Nginx。