Spring

Spring
两大原则:
    高低原则:高内聚,低耦合
    开闭原则:对扩展开放,对修改封闭
两大核心:IOC、AOP
 
一、IOC和AOP的介绍
IOC:(Inverse of Control)控制反转,也叫DI依赖注入,指的是将对象的创建权交给 Spring 容器去创建,利用了工厂模式将对象交给容器管理,只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。不需要我们手动new去创建对象,大大降低了代码间的耦合度,使资源更加容易管理。
AOP:(Aspect Oriented Programming)面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 AOP可以分离业务代码和关注点代码(重复代码),在执行业务代码时,动态的注入关注点代码。切面就是关注点代码形成的类。Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口
 
AOP是基于动态代理实现的, 分为两种代理,jdk动态代理(基于接口)和cglib代理(基于类的),如果目标对象实现了接口,就用jdk动态代理,如果未实现接口就用cglib动态代理.
1.基于jdk的动态代理
程序运行的过程中,通过jdk提供代理技术动态的为某个类产生动态代理对象的过程。
开发代理对象的原则:
1)代理对象,不需要实现接口,但是目标对象要实现接口,否则不能用JDK动态代理。
2)代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象。 
2.基于CGLib的动态代理
开发代理对象的原则:
1.代理对象无需和原始类对象实现相同的接口
2.代理对象和原始类对象要存在父子类关系
概念定义:
Aspect(切面): Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。
Joint point(连接点):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。
Pointcut(切点):表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
Advice(增强):Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。
Target(目标对象):织入 Advice 的目标对象.。
Weaving(织入):将 Aspect 和其他对象连接起来, 并创建 Adviced object 的过程
Aop的5种通知类型
1)前置通知:before advice
2)返回通知: after return advice
3)后置通知:after(final) advice
4)异常通知: after throwing advice
5)环绕通知: around advice
前置通知
在方法执行之前,执行通知。
后置通知
在方法执行之后, 无论是正常退出还是发生了异常,执行通知。
返回通知
在方法执行之后,只有在方法成功完成时,才能执行通知。
异常通知
在方法执行之后,只有在方法退出抛出异常时,才能执行通知。
环绕通知
在方法调用之前和之后,执行通知

Spring Cloud

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。
 
Spring Cloud 的核心组件
1. Eureka(注册中心)
Eureka 是 Spring Cloud 微服务架构中的注册中心,专门负责服务的注册与发现,里面有一个注册表,保存了各个服务器的 机器和端口。
            Eureka服务端:也称服务注册中心,同其他服务注册中心一样,支持高可用配置。如果Eureka以集群模式部署,当集群中有分片出现故障时,那么Eureka就转入自我保护模式。它允许在分片故障期间继续提供服务的发现和注册,当故障分片恢复运行时,集群中其他分片会把它们的状态再次同步回来
            Eureka客户端:主要处理服务的注册与发现。客户端服务通过注解和参数配置的方式,嵌入在客户端应用程序的代码中,在应用程序运行时,Eureka客户端想注册中心注册自身提供的服务并周期性地发送心跳来更新它的服务租约。同时,它也能从服务端查询当前注册的服务信息并把它们缓存到本地并周期性地刷新服务状态
Eureka Server 的高可用实际上就是将自己作为服务向其他注册中心注册自己,这样就可以形成一组互相注册的服务注册中心,以实现服务清单的互相同步,达到高可用效果。
2. Zuul(服务网关)
Zuul网关负责转发请求给对应的服务,这个组件是负责网络路由的。
Spring Cloud Zuul通过与Spring Cloud Eureka进行整合,将自身注册为Eureka服务治理下的应用,同时从Eureka中获得了所有其他微服务的实例信息
对于路由规则的维护,Zuul默认会将通过以服务名作为ContextPath的方式来创建路由映射
Zuul提供了一套过滤器机制,可以支持在API网关无附上进行统一调用来对微服务接口做前置过滤,已实现对微服务接口的拦截和校验
3. Ribbon(负载均衡)
Ribbon是一个基于HTTP和TCP的客户端负载均衡器,它可以在通过客户端中配置的ribbonServerList服务端列表去轮询访问以达到服务均衡的作用。
提供云端负载均衡,有多种负载均衡策略可供选择,可配合服务发现和断路器使用。
当Ribbon和Eureka联合使用时,Ribbon的服务实例清单RibbonServerList会被DiscoveryEnabledNIWSServerList重写,扩展成从Eureka注册中心中获取服务端列表。同时它也会用NIWSDiscoveryPing来取代IPing,它将职责委托给Eureka来去定服务端是否已经启动。在客户端负载均衡中,所有客户端节点都维护着自己要访问的服务端清单,而这些服务端的清单来自于服务注册中心(比如Eureka)。在客户端负载均衡中也需要心跳去维护服务端清单的健康性,只是这个步骤需要与服务注册中心配合完成。
通过Spring Cloud Ribbon的封装,我们在微服务架构中使用客户端负载均衡调用只需要如下两步:
            服务提供者只需要启动多个服务实例并且注册到一个注册中心或是多个相关联的服务注册中心
             服务消费者直接通过调用被@LoadBalanced注解修饰过的RestTemplate来实现面向服务的接口调用
4. Hystrix(熔断保护器)
提供线程池不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务器雪崩的问题。
熔断器,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。    在微服务架构中,存在着那么多的服务单元,若一个单元出现故障,就很容易因依赖关系而引发故障的蔓延,最终导致整个系统的瘫痪,这样的架构相较传统架构更加不稳定。为了解决这样的问题,产生了断路器等一系列的服务保护机制    在分布式架构中,当某个服务单元发生故障之后,通过断路器的故障监控,向调用方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延  Hystrix具备服务降级、服务熔断、线程和信号隔离、请求缓存、请求合并以及服务监控等强大功能   Hystrix使用舱壁模式实现线程池的隔离,它会为每一个依赖服务创建一个独立的线程池,这样就算某个依赖服务出现延迟过高的情况,也只是对该依赖服务的调用产生影响,而不会拖慢其他的依赖服务
5. Feign(REST转换器)
基于动态代理机制,根据注解和选择的机器,拼接请求url地址,发起请求。Feign的关键机制是使用了动态代理
    首先,对某个接口定义了@FeignClient注解,Feign就会针对这个接口创建一个动态代理
    接着调用接口的时候,本质就是调用Feign创建的动态代理
    Feign的动态代理会根据在接口上的@RequestMapping等注解,来动态构造要请求的服务的地址
    针对这个地址,发起请求、解析响应,Feign是和Ribbon以及Eureka紧密协作的,首先Ribbon会从Eureka Client里获取到对应的服务注册表,也就知道了所有的服务都部署在了哪些机器上,在监听哪些端口,然后Ribbon就可以使用默认的Round Robin算法,从中选择一台机器,Feign就会针对这台机器,构造并发起请求
6. Config(分布式配置)
配置管理工具包,让你可以把配置放到远程服务器,集中化管理集群配置,目前支持本地存储、Git以及Subversion。
 
SpringCloud Alibaba
常见权限框架:
Shiro、 Spring Security
 
Spring Security
Spring Security一种基于 Spring AOP 和 Servlet 过滤器的安在企业中,往往是两者结合使用:全框架。
Spring Security的应用场景:
  1. Web应用安全:Spring Security提供了一整套的API,用于在Web应用中实现用户认证和授权。
  2. 移动应用安全:Spring Security的OAuth和OpenID连接支持为移动应用提供了安全的用户认证。
  3. 服务安全:Spring Security可以保护你的服务,确保只有授权的客户端可以访问。
  4. 方法安全:Spring Security可以对方法调用进行授权检查。
    5. 集成其他认证机制:Spring Security可以很容易地集成其他认证机制,如LDAP、JAAS、Kerberos等。
 
核心组件有SecurityContext、SecurityContextHolder、Authentication、Userdetails 和 AuthenticationManager。
1、SecurityContext
安全上下文,用户通过SpringSecurity的校验之后,验证信息存储在SecurityContext中;
2、SecurityContextHolder
首先holder是所有者、持有者的意思,因此可以理解为是SecurityContext的实例。在SpringSecurity中存储用户登录信息的责任落在了SecurityContextPersistenceFilter的身上,SecurityContextPersistenceFilter主要有两方面的作用,即请求开始时从对应的SecurityContextRepository获取SecurityContext存入SecurityContextHolder中;请求结束时清除SecurityContextHolder中的SecurityContext,将本次请求执行后新的SecurityContext存入到对应的SecurityContextRepository中。SecurityContextHolder默认将SecurityContext存储在当前线程中,因此我们在每次登录成功之后会将用户的信息进行如下操作:SecurityContextHolder.getContext().setAuthentication(authResult)。
3、Authentication
认证的意思,我们可以简单的理解为他是用来表示当前用户是谁,包括用户权限,认证信息等;
4、Userdetails
从字面意思我们可以知道,Userdetails的主要作用就是用户信息的一些属性,用来存储用户信息时所使用的;
5、UserDetailsService
有了UserDetails就必须要说到的是UserDetailsService,它是一个接口类,其中只提供了一个方法loadUserByUserName,用来获取UserDetails。在SpringSecurity应用中我们通常会自定义一个类来实现loadUserByUserName,来根据我们项目具体的情况来获取用户的信息,如果没有查询到可以抛出异常UsernameNotFoundException来告知用户不存在。
6、AuthenticationManager
用于处理一个认证请求。AuthenticationManager会在Spring Security应用配置阶段被构建,比如被某个WebSecurityConfigurerAdapter构建,然后在后续被使用。比如我们接下来要实现的基于用户名密码认证机制应用,在启动过程中,AuthenticationManager构建后会被设置到基于用户名密码进行认证的安全过滤器UsernamePasswordAuthenticationFilter上,当用户以post方式访问/login时,UsernamePasswordAuthenticationFilter就会认为这是一个用户认证请求,从而获取请求中的用户名/密码信息,使用AuthenticationManager认证该请求用户的身份。
SpringSecurity是基于标准的Servlet的Filter来实现的,所以其实SpringSecurity内部维护了一套Filter Chain,Chain中的每一个Filter都具有特定的责任,并根据所需的服务在配置总添加。因此Filter的顺序很重要,因为他们之间存在依赖关系,如果顺序出现错误可能会导致认证HR鉴权的失败。
posted @ 2025-12-16 21:36  是大芒果  阅读(2)  评论(0)    收藏  举报