spring
servlet生命周期
1、init()初始化
2、service()响应请求
3、destory()销毁
IOC
1、也叫控制反转,依赖注入
2、容器实例化对象时,将它的依赖类注入给它
3、容器初始化,创建容器,加载bean的定义,加载bean的配置资源,解析bean存放在hashmap中
4、构造方法注入,setter方法注入,接口注入
@Autowired按类型注入@Resource按ID注入@Value注入基本类型和String
AOP
1、@Aspect切面Bean@Before前置通知@After后置通知
@AfterReturning返回后通知@AfterThrowing异常通知@Around环绕通知
2、面向切面变成,将代码重复的部分抽取,在执行的时候使用动态代理对方法增强
3、实现接口使用JDK动态代理,否则使用CGLib动态代理,final类不能使用CGLib
4、权限、缓存、错误处理、日志、事务
springBean的生命周期
1、实例化 Instantiation InstantiationAwareBeanPostProcessor接口作用于前后
2、属性赋值 Populate
3、初始化 Initialization BeanPostProcessor接口作用于前后
4、销毁 Destruction
Aware类型的接口在初始化之前,可以拿到spring的资源
InitializingBean对应初始化阶段自定义
DisposableBean对应销毁阶段自定义
(1、IOC容器初始化时对Bean资源定位,加载解析Bean配置,把Bean信息放入一个HashMap中;
2、IOC容器初始化后对Bean实例化创建和依赖注入,以及设置各种属性值;
3、初始化时可自定义初始化方法,初始化完成达到可用状态;
3、使用Bean后调用destory方法销毁,销毁时可自定义销毁方法;
4、Bean被销毁并从容器中移除)
@PreConstruct定义初始化方法、@PostConstruct定义销毁方法
Bean的作用范围
1、singleton 单例模式
2、prototype 原型模式,每次bean请求都会创建一个
3、request 每一个requset一个
4、session 每一个session一个
5、global session 所有session共享
创建Bean的方式
1、@Component value属性指定id,默认类名首字母小写
2、@Controller @Service @Repository都是@Component的衍生注解有更明确的语义
3、@Bean name属性指定id
创建配置的方式
1、@Configuration用于指定当前类是一个spring配置类
2、@ComponentScan指定spring容器初始化扫描的包
3、@PropertySource用于加载.properties文件
4、@Import导入其它配置类
BeanFactory和FactoryBean的区别和ApplicationContext
1、BeanFactory负责生产和管理bean的一个工厂,IOC容器的核心接口
2、FactoryBean是一个工厂Bean,当在IOC容器中的Bean实现了FactoryBean后,
通过getBean(String BeanName)获取实现类中getObject()方法返回的对象
通过getBean(&BeanName)获取实现类
3、ApplicationContext接口,它由BeanFactory接口派生而来,
ApplicationContext包含BeanFactory的所有功能
spring使用三级缓存解决循环依赖
1、循环依赖A持有B的引用,B持有A的引用
2、spring无法解决构造器中的循环依赖
3、spring解决没有被代理的单例,且显示指明需要解决循环依赖
4、循环依赖发送在实例化和填充属性阶段,原理是获取对象引用时,属性可以延后设置
5、分别尝试从一级,二级,三级缓存中获取BeanName对应的bean
bean实例的cache,提前曝光的未初始化实例的cache,bean和bean工厂的cache。
A实例化后的ObjectFactory放入三级缓存,填充A的属性,发现有B的引用,创建B;
B填充属性发现有A的引用从二级缓存获取A未初始化的bean,B属性填充完;
将B放入一级缓存,删除二三级缓存,继续填充A,初始化后放入一级缓存,删除二三级缓存。
日志
1、log4j,日志记录器(Loggers)、输出端(Appenders)、日志格式化器(Layout)
2、 DEBUG、INFO、WARN、ERROR 和 FATAL
3、logBack
4、ELK
网络
1、物理层-接口光纤
2、数据链路层-交换机
3、网络层-路由器
4、传输层-协议和端口号
5、会话层-建立传输端口和接收端口的通路
6、表示层-对数据解释,加解密,转换为人可识别的语音图片文字
7、应用层-浏览器qq等终端
TCP 三次握手/四次挥手
1、TCP 在传输之前会进行三次沟通,一般称为“三次握手”,
传完数据断开的时候要进行四次沟通,一般称为“四次挥手”。
HTTP 是一个无状态的协议
1、个客户端向服务器端发出请求,然后服务器返回响应(response),连接就被关闭了
2、地址解析,
http://localhost.com:8080/index.htm 从中分解出协议名、主机名、端口、对象路径等部分
在这一步,需要域名系统 DNS 解析域名 localhost.com,得主机的 IP 地址。
3、封装 HTTP 请求数据包
以上部分结合本机自己的信息,封装成一个 HTTP 请求数据包
4、封装成 TCP 包并建立连接
封装成 TCP 包,建立 TCP 连接(TCP 的三次握手)
5、客户机发送请求命
6、服务器响应
7、服务器关闭 TCP 连接
如果浏览器或者服务器在其头信息加入了这行代码 Connection:keep-alive,TCP 连接在发送
后将仍然保持打开状态
8、状态码200成功、300重定向、400客户端错误、500服务端错误
HTTPS即 HTTP 下加入 SSL 层
1、客户端建立连接获取证书
2、客户端证书验证
3、数据加密和传输
SpringBoot
@CrossOrigin作用类方法解决跨域
实现 WebMvcConfigurer 接口中的 addCorsMappings() 方法来实现跨域
Nginx配置解决跨域
location / {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
if ($request_method = 'OPTIONS') {
return 204;
}
}
1、简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yml文件)
2、嵌入的Tomcat 无需部署war文件
3、简化maven配置
4、自动配置spring添加对应功能starter自动化配置,约定大于配置
5、独立的spring应用程序 main方法运行
6、使用JavaConfig有助于避免使用XML,配置Spring loC容器的纯Java方法,面向对象的配置
7、没有web.xml文件。只需添加用@Configuration注释的类
8、重新加载 Spring Boot上的更改,产环境中被禁用
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
9、SpringBoot的核心配置文件有application和bootstarp配置文件
application文件主要用于Springboot自动化配置文件
bootstarp文件主要有以下几种用途:
使用Spring Cloud Config注册中心时 需要在bootStarp配置文件中添加链接到配置中心的配置属性来加载外部配置中心的配置信息。
一些固定的不能被覆盖的属性
一些加密/解密的场景
10、SpringBoot的核心注解@SpringBootApplication
@SpringBootConfiguration 表示是springboot配置类
@EnableAutoConfiguration 开启自动化配置
@ComponentScan 扫描
@Configuration 标注是一个配置类 也是一个组件@Component
11、SpringBoot启动会加载大量的自动配置类
12、自动配置类添加组件的时候,会从properties类中获取某些属性
13、Spring Boot中的监视器 Spring boot actuator
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
server.tomcat.uri-encoding=UTF-8
# 程序运行端口
server.port=8888
# 监视程序运行端口
management.server.port=8090
# 激活所有的内置Endpoints
management.endpoints.web.exposure.include=*
# 开启shutdown这个endpoint
management.endpoint.shutdown.enabled=true
#management.security.enabled=false 禁用断点安全性
14、实现Spring Boot的安全性,我们使用spring-boot-starter-security
15、集成Spring Boot和ActiveMQ,我们使用spring-boot-starter-activemq
16、Spring Profiles 允许用户根据配置文件(dev,test,prod等)来注册 bean
17、Spring Boot实现异常处理,实现一个ControlerAdvice类,来处理控制器类抛出的所有异常
18、spring-boot-maven-plugin 提供了一些像 jar 一样打包或者运行应用程序的命令
19、Spring Boot 将使用 Logback 作为默认日志框架
SpringCloud
1、Spring Cloud Config外部配置管理,默认使用Git来存储配置,
可以支持客户端配置的刷新及加密、解密操作
2、Spring Cloud Netflix
Eureka:服务治理组件,包括服务端的注册中心和客户端的服务发现机制;
Ribbon:负载均衡的服务调用组件,具有多种负载均衡调用策略;
Hystrix:服务容错组件,实现了断路器模式,为依赖服务的出错和延迟提供了容错能力;
Feign:基于Ribbon和Hystrix的声明式服务调用组件;
Zuul:API网关组件,对请求提供路由及过滤功能。
3、Spring Cloud Bus 动态刷新集群中的服务配置
4、Spring Cloud Zookeeper 基于Apache Zookeeper的服务治理组件。
5、Spring Cloud Security 对Zuul代理中的负载均衡OAuth2客户端及登录认证进行支持。
6、Spring Cloud Sleuth 分布式请求链路跟踪,
支持使用Zipkin、HTrace和基于日志(例如ELK)的跟踪
7、Spring Cloud Stream 声明式模型来发送及接收消息,主要实现为Apache Kafka及RabbitMQ。
8、Spring Cloud Task 快速构建短暂、有限数据处理任务
9、Spring Cloud Gateway API网关组件,对请求提供路由及过滤功能
10、Spring Cloud OpenFeign 基于Ribbon和Hystrix的声明式服务调用组件,
动态创建基于Spring MVC注解的接口实现用于服务调用,
在Spring Cloud 2.0中已经取代Feign成为了一等公民。
11、SpringBoot专注于快速、方便的开发单个微服务个体,
SpringCloud关注全局的服务治理框架。
12、负载均衡策略
轮询策略、随机策略、最大可用策略、带有加权的轮询策略、可用过滤策略、区域感知策略
13、CAP理论:一个分布式系统不可能同时满足C (一致性),A(可用性),P(分区容错性)
.由于分区容错性P在分布式系统中是必须要保证的,因此我们只能从A和C中进行权衡.
Zookeeper保证了CP(C:一致性,P:分区容错性)
当master节点因为网络故障与其他节点失去联系时,剩余节点会重新选leader
且选取期间zk集群都不可用,这样就会导致选取期间注册服务瘫痪
Eureka保证了AP(A:高可用)
Eureka保证了可用性,Eureka各个节点是平等的
在15分钟内超过85%的节点没有正常的心跳,
那么Eureka就认为客户端与注册中心发生了网络故障
1、Eureka不在从注册列表中移除因为长时间没有收到心跳而应该过期的服务
2、Eureka仍然能够接受新服务的注册和查询请求,
但是不会被同步到其他节点上(即保证当前节点仍然可用)
3、当网络稳定时,当前实例新的注册信息会被同步到其他节点
14、Eureka的工作原理?
Eureka:服务注册中心(可以是一个集群),对外暴露自己的地址
提供者:启动后向Eureka注册自己信息(地址,提供什么服务)
消费者:向Eureka订阅服务,Eureka会将对应服务的所有提供者地址列表发送给消费者,并且定期更新
心跳(续约):提供者定期通过http方式向Eureka刷新自己的状态(每30s定时向EurekaServer发起请求
15、zuul的工作流程?
在Eureka的帮助下,API网关已经维护了系统中所有serviceId与实例地址的映射关系。
当有外部请求到达API网关的时候,根据请求的URL找到最匹配的path,
API网关就可以知道要将该请求"路由"到哪个具体的serviceId上去。
最终通过Ribbon的负载均衡策略实现请求的路由
16、什么是feign?
1.feign采用的是基于接口的注解
2.feign整合了ribbon,具有负载均衡的能力
3.整合了Hystrix,具有熔断的能力
17、feign的工作流程?
1、通过动态代理生成实现类
2、根据接口类的注解生命规则,解析出底层的methodhandler
3、拦截器负责对请求和返回进行包装和处理
4、通过均衡负载http去访问远程服务
18、Hystrix流程?
1、构造一个 HystrixCommand或HystrixObservableCommand对象,用于封装请求,并在构造方法配置请求被执行需要的参数;
2、执行命令,Hystrix提供了4种执行命令的方法;
3、判断是否使用缓存响应请求,若启用了缓存,且缓存可用,直接使用缓存响应请求。Hystrix支持请求缓存,但需要用户自定义启动;
4、判断熔断器是否打开,如果打开,跳到第8步;
5、判断线程池/队列/信号量是否已满,已满则跳到第8步;
6、执行HystrixObservableCommand.construct()或HystrixCommand.run(),如果执行失败或者超时,跳到第8步;否则,跳到第9步;
7、统计熔断器监控指标;
8、走Fallback备用逻辑
9、返回请求响应
19、服务熔断:
熔断机制是应对雪崩效应的一种微服务链路保护机制。
当失败的调用到一定阈值,缺省是5秒内调用20次,如果失败,就会启动熔断机制。
服务降级:
当某个服务熔断之后,服务器将不再被调用,
此时客户端可以自己准备一个本地的fallback回调,返回一个缺省值。
20、服务雪崩
雪崩效应是在大型互联网项目中,当某个服务发生宕机时,
调用这个服务的其他服务也会发生宕机,大型项目的微服务之间的调用是互通的,
这样就会将服务的不可用逐步扩大到各个其他服务中,从而使整个项目的服务宕机崩溃。
21、ZuulFilter常用有哪些方法?
Run():过滤器的具体业务逻辑
shouldFilter():判断过滤器是否有效
filterOrder():过滤器执行顺序
filterType():过滤器拦截位置
22、如何实现动态Zuul网关路由转发?
通过path配置拦截请求,通过 Serviceld到配置中心获取转发的服务列表,
zuul内部使用 Ribbon实现本地负载均衡和转发。
23、Zuul网关如何搭建集群?
使用Nginx的 upstream设置Zuul服务集群,通过location拦截请求并转发到 upstream,
默认使用轮询机制对Zuul集群发送请求。