news 2026/5/1 7:07:15

微服务细节之——“网关”和“配置管理”

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
微服务细节之——“网关”和“配置管理”

为什么需要网关?

我们知道,单体项目,在我们拆分成微服务之后,一个服务,我可能部署了好几份,比如都是A服务,我部署了三份,分别是8081,8081;8082。我怎么知道我现在是要访问哪一个?所以需要一个网关,来分配不同的路由,去找到对应的微服务。(就是网络的关口,负责请求的路由转发,身份验证)

如何设置网关?

四步:

  1. 创建新模块
  2. 引入网关依赖(spring-cloud-starter-gateway(网关),spring-cloud-starter-alibaba-nacos-discovery(nacos discovery),spring-cloud-starter-loadbalancer(负载均衡))
  3. 编写启动类
  4. 配置路由规则
    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 Mono<Void> 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].[后缀名],用配置类读取,然后要用的地方引用配置类就可以。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 13:32:01

TeslaMate完整教程:从零开始搭建特斯拉数据监控平台

TeslaMate完整教程&#xff1a;从零开始搭建特斯拉数据监控平台 【免费下载链接】teslamate 项目地址: https://gitcode.com/gh_mirrors/tes/teslamate 你是否曾好奇&#xff1a;我的特斯拉电池健康度到底如何&#xff1f;驾驶习惯对能耗有多大影响&#xff1f;充电成本…

作者头像 李华
网站建设 2026/5/1 4:49:09

Higress网关健康检查:5个关键配置优化微服务稳定性

Higress网关健康检查&#xff1a;5个关键配置优化微服务稳定性 【免费下载链接】higress Next-generation Cloud Native Gateway | 下一代云原生网关 项目地址: https://gitcode.com/GitHub_Trending/hi/higress 在云原生架构中&#xff0c;Higress网关的健康检查功能是…

作者头像 李华
网站建设 2026/5/1 4:48:11

mooc-dl:中国大学MOOC课件离线下载完全指南 [特殊字符]

mooc-dl&#xff1a;中国大学MOOC课件离线下载完全指南 &#x1f393; 【免费下载链接】mooc-dl :man_student: 中国大学MOOC全课件&#xff08;视频、文档、附件&#xff09;下载器 项目地址: https://gitcode.com/gh_mirrors/mo/mooc-dl 还在为网络不稳定而错过重要的…

作者头像 李华
网站建设 2026/4/30 15:37:51

10分钟掌握Open WebUI图表集成:从零到精通的完整指南

还在为AI对话数据的可视化发愁吗&#xff1f;想要让枯燥的交流内容变成直观的图表展示&#xff1f;今天我们就来聊聊如何在Open WebUI中快速集成图表功能&#xff0c;让你的AI助手变得"有图有真相"&#xff01; 【免费下载链接】open-webui Open WebUI 是一个可扩展、…

作者头像 李华
网站建设 2026/5/1 4:47:59

5步掌握Dolphin:PDF文档智能转换Markdown完整教程

5步掌握Dolphin&#xff1a;PDF文档智能转换Markdown完整教程 【免费下载链接】Dolphin 项目地址: https://gitcode.com/GitHub_Trending/dolphin33/Dolphin PDF文档批量转换为可编辑的Markdown格式是许多技术文档工作者面临的常见挑战。Dolphin作为一款基于深度学习的…

作者头像 李华