微服务网关与配置中心

简介: 本课程学习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。

相关文章
|
13天前
|
数据采集 人工智能 安全
|
8天前
|
编解码 人工智能 自然语言处理
⚽阿里云百炼通义万相 2.6 视频生成玩法手册
通义万相Wan 2.6是全球首个支持角色扮演的AI视频生成模型,可基于参考视频形象与音色生成多角色合拍、多镜头叙事的15秒长视频,实现声画同步、智能分镜,适用于影视创作、营销展示等场景。
663 4
|
8天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
350 164
|
7天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
359 155