转载自:https://juejin.im/post/5d214639e51d4550bf1ae8df前端
Spring 做为当前 Java 最流行、最强大的轻量级容器框架,了解熟悉 spring 的生命周期很是有必要;java
首先容器启动后,对 bean 进行初始化程序员
按照 bean 的定义,注入属性算法
检测该对象是否实现了 xxxAware 接口,并将相关的 xxxAware 实例注入给 bean,如 BeanNameAware 等spring
以上步骤,bean 对象已正确构造,经过实现 BeanPostProcessor 接口,能够再进行一些自定义方法处理。如:postProcessBeforeInitialzation。数据库
BeanPostProcessor 的前置处理完成后,能够实现 postConstruct,afterPropertiesSet,init-method 等方法, 增长咱们自定义的逻辑,数组
经过实现 BeanPostProcessor 接口,进行 postProcessAfterInitialzation 后置处理缓存
接着 Bean 准备好被使用啦。服务器
容器关闭后,若是 Bean 实现了 DisposableBean 接口,则会回调该接口的 destroy() 方法微信
经过给 destroy-method 指定函数,就能够在 bean 销毁前执行指定的逻
tcp 的三次握手四次挥手是每一个程序员都应该熟悉的。
三次握手:
第一次握手(SYN=1, seq=x),发送完毕后,客户端进入 SYN_SEND 状态
第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1), 发送完毕后,服务器端进入 SYN_RCVD 状态。
第三次握手(ACK=1,ACKnum=y+1),发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态,TCP 握手,便可以开始数据传输。
第一次挥手(FIN=1,seq=a),发送完毕后,客户端进入 FIN_WAIT_1 状态
第二次挥手(ACK=1,ACKnum=a+1),发送完毕后,服务器端进入 CLOSE_WAIT 状态,客户端接收到这个确认包以后,进入 FIN_WAIT_2 状态
第三次挥手(FIN=1,seq=b),发送完毕后,服务器端进入 LAST_ACK 状态,等待来自客户端的最后一个ACK。
第四次挥手(ACK=1,ACKnum=b+1),客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT状态,等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)以后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭链接,因而本身也关闭链接,进入 CLOSED 状态。服务器端接收到这个确认包以后,关闭链接,进入 CLOSED 状态。
线程池:一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和总体性能。
而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务,这避免了在处理短期任务时建立与销毁线程的代价。线程池执行流程是每一个开发必备的。
提交一个任务,线程池里存活的核心线程数小于线程数 corePoolSize 时,线程池会建立一个核心线程去处理提交的任务。
若是线程池核心线程数已满,即线程数已经等于 corePoolSize,一个新提交的任务,会被放进任务队列 workQueue 排队等待执行。
当线程池里面存活的线程数已经等于 corePoolSize 了,而且任务队列 workQueue 也满,判断线程数是否达到 maximumPoolSize,即最大线程数是否已满,若是没到达,建立一个非核心线程执行提交的任务。
若是当前的线程数达到了 maximumPoolSize,还有新的任务过来的话,直接采用拒绝策略处理。
AbortPolicy (抛出一个异常,默认的)
DiscardPolicy (直接丢弃任务)
DiscardOldestPolicy(丢弃队列里最老的任务,将当前这个任务继续提交给线程池)
CallerRunsPolicy(交给线程池调用所在的线程进行处理
JVM 内存结构是 Java 程序员必须掌握的基础。程序计数器(PC 寄存器)
程序计数器是一块较小的内存空间,能够看做当前线程所执行的字节码的行号指示器。
在虚拟机的模型里,字节码解释器工做时就是经过改变这个计数器的值来选取下一条须要执行的字节码指令,分支、循环、异常处理、线程恢复等基础功能都须要依赖计数器完成。
与程序计数器同样,Java 虚拟机栈也是线程私有的,它的生命周期与线程相同
每一个方法被执行的时候都会建立一个"栈帧",用于存储局部变量表(包括参数)、操做数栈、动态连接、方法出口等信息。每一个方法被调用到执行完的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
局部变量表存放各类基本数据类型 boolean、byte、char、short 等
与虚拟机栈基本相似,区别在于虚拟机栈为虚拟机执行的 java 方法服务,而本地方法栈则是为 Native 方法服务。
GC 堆是 java 虚拟机所管理的内存中最大的一块内存区域,也是被各个线程共享的内存区域,在 JVM 启动时建立。
其大小经过 -Xms (最小值)和 -Xmx (最大值)参数设置,-Xms 为 JVM 启动时申请的最小内存,-Xmx 为 JVM 可申请的最大内存。
因为如今收集器都是采用分代收集算法,堆被划分为新生代和老年代。新生代由 S0 和 S1 构成,可经过 -Xmn 参数来指定新生代的大小。
全部对象实例以及数组都在堆上分配。
Class 文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各类符号引用,这部份内容将在类加载后放到方法区的运行时常量池中。
也称”永久代” ,它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。能够经过 -XX:PermSize 和 -XX:MaxPermSize 参数限制方法区的大小。
运行时常量池:是方法区的一部分,其中的主要内容来自于 JVM 对 Class 的加载。
Class 文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各类符号引用,这部份内容将在类加载后放到方法区的运行时常量池中。
Java 的多线程之间是经过共享内存进行通讯的,在通讯过程当中会存在一系列如可见性、原子性、顺序性等问题,而 JMM 就是围绕着多线程通讯以及与其相关的一系列特性而创建的模型。
JMM 定义了一些语法集,这些语法集映射到Java语言中就是 volatile、synchronized 等关键字。
有兴趣能够看看个人另一篇笔记:www.jianshu.com/p/3c1691aed…
Java 内存模型规定了全部的变量都存储在主内存中,每条线程还有本身的工做内存,线程的工做内存中保存了该线程中是用到的变量的主内存副本拷贝,线程对变量的全部操做都必须在工做内存中进行,而不能直接读写主内存。
不一样的线程之间也没法直接访问对方工做内存中的变量,线程间变量的传递均须要本身的工做内存和主存之间进行数据同步进行。
User 向服务器发送 request,前端控制 Servelt DispatcherServlet 捕获;
DispatcherServlet 对请求 URL 进行解析,调用 HandlerMapping 得到该Handler 配置的全部相关的对象,最后以 HandlerExecutionChain 对象的形式返回.
DispatcherServlet 根据得到的 Handler,选择一个合适的 HandlerAdapter.
提取 Request 中的模型数据,填充 Handler 入参,开始执行 Handler(Controller)
Handler 执行完成后,返回一个 ModelAndView 对象到 DispatcherServlet
根据返回的 ModelAndView,选择一个适合的 ViewResolver
ViewResolver 结合 Model 和 View,来渲染视图
将渲染结果返回给客户端。
链接数据源
为数据库传递查询和更新指令
处理数据库响应并返回的结果
Spring Cloud 是一个基于 Spring Boot 实现的云原生应用开发工具,它为基于 JVM 的云原生应用开发中涉及的配置管理、服务发现、熔断器、智能路由、微代理、控制总线、分布式会话和集群状态管理等操做提供了一种简单的开发方式。
Eureka 负责服务的注册与发现。
Hystrix 负责监控服务之间的调用状况,起到熔断,降级做用。
Spring Cloud Config 提供了统一的配置中心服务。
全部对外的请求和服务,咱们都经过 Zuul 来进行转发,起到 API 网关的做用
最后咱们使用 Sleuth+Zipkin 将全部的请求数据记录下来,方便咱们进行后续分析。
Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡的工具。它是一个基于 HTTP 和 TCP 的客户端负载均衡器。
Feign 是一个声明式的 Web Service 客户端,它的目的就是让 Web Service 调用更加简单。
Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的远程服务调用方案,这容易和负载均衡弄混,负载均衡是对外提供一个公共地址,请求过来时经过轮询、随机等,路由到不一样 server。
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。
·END·
程序员的成长之路
路虽远,行则必至
本文原发于 同名微信公众号「程序员的成长之路」,回复「1024」你懂得,给个赞呗。
回复 [ 520 ] 领取程序员最佳学习方式
回复 [ 256 ] 查看 Java 程序员成长规划