微服务注册拦截器的配置类为什么要加@ConditionalOnClass(DispatcherServlet.class)注解
微服务注册拦截器的配置类为什么要加@ConditionalOnClass(DispatcherServlet.class)注解
@Configuration
@ConditionalOnClass(DispatcherServlet.class)
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new UserInfoInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/search/**", "/users/login","/items/**");
}
}
如果不加这个注解,会引起ClassNotFoundException 或 Bean 错误:由于网关微服务可能并不包含 Spring MVC(没有 DispatcherServlet,尝试注册与 DispatcherServlet 相关的组件时可能会引发 ClassNotFoundException 或类似的错误。也有可能在初始化时出现一些与 Spring MVC 相关的配置或依赖问题,导致启动失败。
根本原因:Spring Cloud Gateway 是基于 Spring WebFlux 的,这意味着它使用的是 Netty 或其他 WebFlux 的服务器,而不是传统的 Tomcat 或 Jetty,而拦截器是Spring MVC的组件,所以Spring MVC 的特性(如 @Controller
, @RequestMapping
, HandlerInterceptor
等)不会生效
因为在这个项目中,网关服务也是有Spring MVC的依赖,网关这个module也会去注册拦截器,所以要加上@ConditionalOnClass(DispatcherServlet.class)注解,因为DispatcherServlet是Spring MVC的核心类,只有当DispatcherServlet存在时候,才注册拦截器
interceptor不是直接被Spring管理,而是交由SpringMvc进行管理
说说Spring Cloud五大组件?
- 服务注册与发现:Nacos 用于管理微服务的注册与发现 (当服务启动时,会将自己注册到 Nacos 服务注册中心,其他服务可以通过 Nacos 查找到它并进行调用。服务的健康状态也可以由 Nacos 来监控。)
- 客户端负载均衡:Spring Cloud LoadBalancer 实现了客户端负载均衡,通过不同的负载均衡策略来分发请求,减轻服务端的负担。
- 服务调用:OpenFeign 是一种声明式的 HTTP 客户端,可以方便地调用其他微服务,简化了服务间通信的实现。
- 熔断器:Sentinel 提供流量控制、熔断、降级等功能,确保在服务过载或故障时,系统能够自我保护,保障系统稳定(避免服务雪崩)。
- 网关:Spring Cloud Gateway 提供路由和过滤器功能,充当微服务之间的统一入口,支持请求路由、负载均衡、用户身份鉴权等功能。
你们项目网关用什么实现,实现了什么功能?
我们项目使用Spring Cloud gateway实现网关。
1.请求路由,根据请求路径将请求转发到不同的应用服务器。(从8080端口转到不同的服务器不同的端口)
2.负载均衡,通过负载均衡算法将请求转发到不同的应用服务器。
- id: product
uri: lb://item-service(lb代表负载均衡)
predicates:
- Path=/product/**
filters:
3.用户身份鉴权,校验用户身份及用户的权限。
网关鉴权怎么实现的?
(Authentication)
用户请求认证服务进行登录,认证成功向前端返回token
前端携带token请求网关
网关通过过滤器(GlobalFilter)拦截请求,获取token
解析token拿到用户信息,如果token合法则继续,否则拒绝访问
网关将用户信息放在http头中转发到微服务
微服务通过拦截器获取用户信息并写入Threadlocal中方便在service方法获取当前用户信息
微服务之间远程调用使用内部无状态接口(内部接口:不通过网关,仅限微服务之间调用,无状态接口:不携带用户信息,本项目直接重写方法,把用户信息当参数传给要调用的微服务,比如用户下单模块)
(Authorization)
用户的权限校验我们是在微服务中进行的,微服务通过Spring security进行权限判断,具体是在controller方法上添加@PreAuthorize
注解,在注解中指定该方法对应的权限字符串,用户拥有此权限则继续访问该方法,否则拒绝访问此方法。
若依框架的鉴权
(Authentication)
用户登录时的校验
1.校验验证码,根据传入的uuid去redis拿到验证码进行校验
2.把用户名和密码装入Spring Security里面的AuthenticationToken这个类,再用manager进行校验,AutenticationManager里面会自定义验证逻辑和密码加密规则,验证完成之后会把所有数据都存回Authentication,然后把Authentication对象保存在securityContext中间,随时可以拿到Authentication对象
3.最后返回一个token
其他请求
1.SpringSecurity进行过滤,不需要校验的请求和静态资源
2.token校验,成功就放行
3.登录后会把权限信息存在redis,(权限控制获得基于RABC理论)前后端一起校验权限v-hasRole,@PreAuthorize写在controller层上校验权限