微服务网关与配置中心

简介: 本课程学习Spring Cloud Gateway网关的实现与应用,掌握路由配置、过滤器使用、全局身份校验、Nacos服务发现与配置管理。涵盖微服务鉴权、前后端联调、配置热更新等核心技能,提升微服务架构实战能力。(238字)

学习目标

  1. 能够说出用什么实现的网关以及实现了哪些功能
  2. 能够创建网关工程实现路由功能
  3. 能够使用网关内置过滤器StripPrefix
  4. 能够定义全局过滤器并测试通过
  5. 能够实现全局身份校验过滤器
  6. 能够在微服务实现用户身份拦截器
  7. 能够说出网关鉴权具体的实现步骤
  8. 能够实现商城项目前后端联调
  9. 能够将微服务配置文件在Nacos统一管理
  10. 能够说出微服务配置文件的加载顺序
  11. 能够将微服务配置文件抽取公共配置
  12. 能够说出Nacos配置热更新方案
    1 网关路由
    1.1.认识网关
    1.1.1 问题分析
    目前为止我们已将黑马商城单体项目重构为微服务架构,今天的目标是前后端联调,下边思考几个问题:
    1.1.1.1 前端面对多个后端入口
    项目采用单体架构时前端通过nginx负载均衡访问后端服务,如下图:
    同一个服务部署多份仅端口不同,且部署在不同地域(北上广深)的方式,一般称:水平复制、异地容灾

项目采用微服务架构时原来的黑马商城分成了购物车服务、交易服务、支付服务等多个服务,前端面对多个后端入口 ,如下图:

前端面对多个后端入口不方便前端开发,效率低下。仍然可以采用nginx去解决【注意不是最佳】,如下图:

在nginx中创建多个upstream ,例如:
http {
upstream item_services {
server 127.0.0.1:8081 weight=3; # 分配较高权重
server 127.0.0.1:8082 weight=2; # 分配中等权重
server 127.0.0.1:8083 weight=1; # 分配较低权重
}
upstream carts_services {
server 127.0.0.1:7081 weight=3; # 分配较高权重
server 127.0.0.1:7082 weight=2; # 分配中等权重
server 127.0.0.1:7083 weight=1; # 分配较低权重
}
....
server {
listen 80; # 监听 80 端口,也可以根据需要更改
server_name localhost; # 更改为你的域名或 IP 地址

    location /items/ {  # 这里可以根据需要调整路径前缀
        proxy_pass http://item_services;
    }
    location /carts/ {  # 这里可以根据需要调整路径前缀
        proxy_pass http://carts_services;
    }
    ....

}
1.1.1.2 用户身份校验放在哪?
单体架构时我们只需要完成一次用户登录、身份校验,就可以在所有业务中获取到用户信息。而微服务拆分后,每个微服务都独立部署,这就存在一些问题:每个微服务都需要编写身份校验、用户信息获取的接口,非常麻烦。
用户身份校验最好放在一个统一的地方,放在上图中nginx的位置上上最合适,那nginx的作用如下:
1.请求路由,根据请求路径将请求转发到不同的应用服务器。
2.负载均衡,通过负载均衡算法将请求转发到不同的应用服务器。
3.用户身份鉴权,校验用户身份及用户的权限。
1.1.2 认识网关
Nginx目前扮演的角色就是:网关,什么是网关?
顾明思议,网关就是网络的关口。数据在网络间传输,从一个网络传输到另一网络时就需要经过网关来做数据的路由和转发以及数据安全的校验。
我们现在要根据需求使用Java在网关实现路由转发和用户身份认证的功能:

  1. 根据请求Url路由到具体的微服务
  2. 校验用户的token,取出token中的用户信息。
  3. 从nacos中取出服务实例进行负载均衡。
    但 在nginx中进行java编程是非常困难的,所以我们需要一个使用java开发的网关。
    AI:java微服务网关
    ● Netflix Zuul:早期实现,目前已经淘汰
    ● Spring Cloud Gateway:基于Spring的WebFlux技术,完全支持响应式编程,吞吐能力更强
    课堂中我们以Spring Cloud Gateway为例来讲解,如下图:

前端请求网关根据请求路径路由到微服务,网关从nacos获取微服务实例地址将请求转发到具体的微服务实例上。生产环境中网关也是集群部署,在网关前边通过nginx进行负载均衡,如下图:

为什么这里需要Naocs?
答:网关怎么根据用户访问路径:http://baidu.com/carts/findAll,决定找到carts购物车服务呢?
此时就会用到服务注册与发现的知识点,而能帮我们实现这个功能的无疑nacos就可以做到。
1.1.3. 面试题
说说Spring Cloud五大组件?
你们项目网关用什么实现,实现了什么功能?
1.2. 实现网关路由
接下来,我们先看下如何利用网关实现请求路由。由于网关本身也是一个独立的微服务,因此也需要创建一个模块,大概步骤如下:
AI:Spring Cloud Gateway实现路由
● 创建网关微服务
● 引入Spring Cloud Gateway、NacosDiscovery依赖
● 编写启动类
● 配置网关路由
1.2.1. 创建网关工程
首先,我们要在hmall下创建一个新的module,命名为hm-gateway,作为网关微服务:

1.2.2 引入依赖
在hm-gateway模块的pom.xml文件中引入依赖:
<?xml version="1.0" encoding="UTF-8"?>



hmall-parent
com.hmall
1.0.0

4.0.0

hm-gateway


11
11




com.hmall
hm-common
1.0.0



org.springframework.cloud
spring-cloud-starter-gateway



com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery



org.springframework.cloud
spring-cloud-starter-loadbalancer



${project.artifactId}


org.springframework.boot
spring-boot-maven-plugin




1.2.3 启动类
在hm-gateway模块的com.hmall.gateway包下新建一个启动类:

代码如下:
package com.hmall.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
1.2.4 配置路由
接下来,在hm-gateway模块的resources目录新建一个application.yaml文件,内容如下:
server:
port: 8080
spring:
application:
name: gateway
cloud:
nacos:
server-addr: 192.168.101.68:8848
gateway:
routes:

    - id: item
      uri: lb://item-service
      predicates:
        - Path=/items/**

这里配置nacos地址,网关需要从nacos获取微服务的实例地址。
路由规则routes包括四个属性,定义语法如下:
● id:路由的唯一标示,自定义即可,但要保证全局唯一
● predicates:路由断言,Predicates 是用于判断请求是否满足特定条件的组件。
● filters:路由过滤条件,稍后讲解。
● uri:路由目标地址,lb://代表负载均衡,从注册中心获取目标微服务的实例列表,并且负载均衡选择一个访问。
application.yaml文件完整内容如下:
server:
port: 8080
spring:
application:
name: gateway
cloud:
nacos:
server-addr: 192.168.101.68:8848
gateway:
routes:

    - id: item # 路由规则id,自定义,唯一
      uri: lb://item-service # 路由的目标服务,lb代表负载均衡,会从注册中心拉取服务列表
      predicates: # 路由断言,判断当前请求是否符合当前规则,符合则路由到目标服务
        - Path=/items/**,/search/** # 这里是以请求路径作为判断规则
    - id: cart
      uri: lb://cart-service
      predicates:
        - Path=/carts/**
    - id: user
      uri: lb://user-service
      predicates:
        - Path=/users/**,/addresses/**
    - id: trade
      uri: lb://trade-service
      predicates:
        - Path=/orders/**
    - id: pay
      uri: lb://pay-service
      predicates:
        - Path=/pay-orders/**

分别表示对当前五个微服务的路由分发

1.2.5 测试
启动GatewayApplication,通过网关请求微服务, http://localhost:8080是网关的根路径,根据网关路由的配置请求具体的URL。
例如:要访问商品服务需要URL以/items开头,访问交易服务需要以/orders开头.
下边访问商品查询的接口地址:
http://localhost:8080/items/page?pageNo=1&pageSize=1
启动网关服务、商品服务,访问此链接。

1.2.6.路由断言(了解)
路由规则的定义语法如下:
spring:
cloud:
gateway:
routes:

    - id: item
      uri: lb://item-service
      predicates:
        - Path=/items/**,/search/**

这里我们重点关注predicates,也就是路由断言。Spring Cloud Gateway中支持的断言类型有很多:
名称 说明 示例
After 是某个时间点后的请求 - After=2037-01-20T17:42:47.789-07:00[America/Denver]
Before 是某个时间点之前的请求 - Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]
Between 是某两个时间点之前的请求 - Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver]
Cookie 请求必须包含某些cookie - Cookie=chocolate, ch.p
Header 请求必须包含某些header - Header=X-Request-Id, \d+
Host 请求必须是访问某个host(域名) - Host=.somehost.org,.anotherhost.org
Method 请求方式必须是指定方式 - Method=GET,POST
Path 请求路径必须符合指定规则 - Path=/red/{segment},/blue/**
Query 请求参数必须包含指定参数 - Query=name, Jack或者- Query=name
RemoteAddr 请求者的ip必须是指定范围 - RemoteAddr=192.168.1.1/24
weight 权重处理
拿Header举例,Header是根据请求头的内容来控制网关访问的。
Header需要两个参数header和regexp(正则表达式),也可以理解为Key和Value,匹配请求携带信息。
修改网关的配置文件application.yml,如下:
Header中包括X-Request-Id才可正常访问,X-Request-Id 并不是HTTP标准的一部分,常用用于标识一次请求的ID。

相关文章
|
8月前
|
存储 安全 API
OpenClaw安全部署与版本加固指南|全平台部署+API配置+漏洞防护教程
2026年,OpenClaw(Clawdbot)作为高权限本地AI执行代理,其强大的系统操控能力与潜在的安全风险并存。近期披露的ClawJacked、WebSocket劫持、远程代码执行等高危漏洞,已导致大量公网暴露实例被入侵,凸显了安全部署与版本加固的重要性。默认配置下,OpenClaw存在公网可访问、无密码认证、敏感信息明文存储等多重风险,若直接部署使用,相当于向攻击者敞开系统大门。
1435 7
|
存储 缓存 安全
每日一博 - ThreadLocal VS InheritableThreadLocal VS TransmittableThreadLocal
每日一博 - ThreadLocal VS InheritableThreadLocal VS TransmittableThreadLocal
560 0
|
运维 监控 关系型数据库
从崩溃到高可用:基于DAS自治服务的RDS全链路故障自愈实战
本文分享了基于DAS自治服务实现RDS全链路故障自愈的实战经验。通过三级健康检查、智能决策引擎与幂等执行器,构建高可用数据库系统,显著提升故障恢复效率,降低业务中断风险,助力企业实现稳定可靠的数据库服务运维。
512 11
|
7月前
|
Oracle Java 关系型数据库
JDK 19安装教程 Windows版:详细步骤+环境变量配置+命令验证(含java/javac/java -version)
本文提供Oracle官方规范下的Windows版JDK 19一站式安装指南:含纯净安装包下载、无中文/空格路径建议、管理员运行、环境变量配置(JAVA_HOME+Path)及三步验证法,新手照做即成,全程避坑。
804 1
|
缓存 监控 Java
SpringBoot @Scheduled 注解详解
使用`@Scheduled`注解实现方法周期性执行,支持固定间隔、延迟或Cron表达式触发,基于Spring Task,适用于日志清理、数据同步等定时任务场景。需启用`@EnableScheduling`,注意线程阻塞与分布式重复问题,推荐结合`@Async`异步处理,提升任务调度效率。
1851 128
|
11月前
|
JSON 监控 API
京东商品列表 API使用指南
京东商品列表API是京东开放平台提供的核心接口,支持按关键词、分类、价格、销量等条件筛选商品,返回标题、价格、库存、销量等结构化信息,适用于店铺管理、价格监控、竞品分析等场景。需认证开发者身份并获取appkey、access_token及相应权限后调用,接口以JSON格式传输,部分按量计费。
|
算法 机器人 测试技术
(币安、ok、欧易)交易所行情机器人系统开发
(币安、ok、欧易)交易所行情机器人系统开发
|
资源调度 JavaScript
vue项目:集成富文本编辑器 - 百度ueditor(vue-ueditor-wrap)
vue项目:集成富文本编辑器 - 百度ueditor(vue-ueditor-wrap)
2103 0
|
SQL Java 数据库
10、MyBatis-Plus 多数据源
这篇文章介绍了在MyBatis-Plus中实现多数据源的方法,包括创建不同的数据库和表、引入动态数据源依赖、配置多个数据源、创建用户和商品的Service类,以及如何进行测试来验证多数据源的功能。