2026/5/13 19:45:00
网站建设
项目流程
河南网站建设制作价格,wordpress图片无尺寸,asp个人网站下载,wordpress集成插件下载为什么需要网关#xff1f;我们知道#xff0c;单体项目#xff0c;在我们拆分成微服务之后#xff0c;一个服务#xff0c;我可能部署了好几份#xff0c;比如都是A服务#xff0c;我部署了三份#xff0c;分别是8081#xff0c;8081#xff1b;8082。我怎么知道我现…为什么需要网关我们知道单体项目在我们拆分成微服务之后一个服务我可能部署了好几份比如都是A服务我部署了三份分别是808180818082。我怎么知道我现在是要访问哪一个所以需要一个网关来分配不同的路由去找到对应的微服务。就是网络的关口负责请求的路由转发身份验证如何设置网关四步创建新模块引入网关依赖spring-cloud-starter-gateway网关spring-cloud-starter-alibaba-nacos-discoverynacos discoveryspring-cloud-starter-loadbalancer负载均衡编写启动类配置路由规则server: port: 8080 spring: application: name: gateway cloud: nacos: server-addr: 192.168.150.101:8848 gateway: routes: - id: item # 路由规则id自定义唯一 uri: lb://item-service # 路由的目标服务lb代表负载均衡会从注册中心拉取服务列表 predicates: # 路由断言判断当前请求是否符合当前规则符合则路由到目标服务 - Path/items/**,/search/** # 这里是以请求路径作为判断规则问题单体架构时我们只需要完成一次用户登录、身份校验就可以在所有业务中获取到用户信息。而微服务拆分后每个微服务都独立部署不再共享数据。也就意味着每个微服务都需要做登录校验这显然不可取。既然网关是所有微服务的入口一切请求都需要先经过网关。我们完全可以把登录校验的工作放到网关去做网关过滤器链可以去了解下网关的路由转发链过滤器链为什么实现了这个就可以在转发前进行身份验证Component public class PrintAnyGlobalFilter implements GlobalFilter, Ordered { Override public MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 编写过滤器逻辑 System.out.println(未登录无法访问); // 放行 // JWT校验 // return chain.filter(exchange); // 拦截 ServerHttpResponse response exchange.getResponse(); response.setRawStatusCode(401); return response.setComplete(); } Override public int getOrder() { // 过滤器执行顺序值越小优先级越高 return 0; } }网关校验了之后我们如何获取用户信息呢因为单体项目中JWT校验后直接存入theadlocal后续需要用直接用就可以因为都在同一个线程共享这部分数据。但微服务中网关服务和它需要转发给的服务不是一个线程而theadlocal是线程的独立空间不同的线程无法共享。做法保存用户到请求头。exchange中的mutate方法就可以做到。然后再一个公共服务中编写SpringMVC的配置类配置登录拦截获取用户信息存入theadlocal。但是要将配置类添加到spring.factories文件为什么组件扫描的局限性默认情况下Spring Boot 的ComponentScan功能由SpringBootApplication注解触发只会扫描主应用程序类所在包及其子包下的组件如Component,Configuration,Service等。您的微服务主应用可能位于com.hmall.user而公共配置类在com.hmall.common.config这确实不在默认扫描范围内因此配置类不会生效。这是因为类的物理位置在不同JAR包与是否是微服务本身无关。即使是单体应用如果引入的第三方JAR包里有Configuration类默认也不会被扫描到。自动装配的超越Spring Boot 的自动装配机制EnableAutoConfiguration正是为了突破上述限制而设计的。它通过一个固定的约定文件META-INF/spring.factories来工作。当应用启动时Spring Boot 会扫描所有依赖的 JAR 包中的这个文件并加载其中声明的配置类完全不受主应用程序包路径的限制。这正是您需要将配置类添加到spring.factories文件的原因——它主动“告知”Spring Boot“这里有一个配置类请加载它”。这里还要注意网关服务一般也引用了这个公共模块但网关模块不是springboot的没有自动装配也就没法扫描而且网关服务也不需要这个拦截器生效。所以要加一个条件注解只再spring项目中去启动这个拦截器ConditionalOnClass(DispatcherServlet.class)微服务不通过网关自己通过openfeign请求另一个微服务我们另一个微服务如何获取用户信息呢Feign中提供的一个拦截器接口feign.RequestInterceptor我们只需要实现这个接口然后实现apply方法利用RequestTemplate类来添加请求头将用户信息保存到请求头中。这样以来每次OpenFeign发起请求的时候都会调用该方法传递用户信息。配置管理添加配置在配置管理-配置列表中点击新建一个配置拉取共享配置读取Nacos配置是SpringCloud上下文ApplicationContext初始化时处理的发生在项目的引导阶段。然后才会初始化SpringBoot上下文去读取application.yaml。也就是说引导阶段application.yaml文件尚未读取根本不知道nacos 地址该如何去加载nacos中的配置文件呢SpringCloud在初始化上下文的时候会先读取一个名为bootstrap.yaml(或者bootstrap.properties)的文件如果我们将nacos地址配置到bootstrap.yaml中那么在项目引导阶段就可以读取nacos中的配置了spring: application: name: cart-service # 服务名称 profiles: active: dev cloud: nacos: server-addr: 192.168.150.101 # nacos地址 config: file-extension: yaml # 文件后缀名 shared-configs: # 共享配置 - dataId: shared-jdbc.yaml # 共享mybatis配置 - dataId: shared-log.yaml # 共享日志配置 - dataId: shared-swagger.yaml # 共享日志配置配置热更新文件的dataId格式[服务名]-[spring.active.profile].[后缀名]用配置类读取然后要用的地方引用配置类就可以。