当前位置: 首页 > news >正文

微服务之网关、网关路由、网关登录校验

简介:来源:SpringCloud微服务开发与实战,java黑马商城项目微服务实战开发(涵盖MybatisPlus、Docker、MQ、ES、Redis高级等)

认识网关

前端请求不能直接访问微服务,而是要请求网关:

  • 网关可以做安全控制,也就是登录身份校验,校验通过才放行
  • 通过认证后,网关再根据请求判断应该访问哪个微服务,将请求转发过去
    在这里插入图片描述
    在SpringCloud当中,提供了两种网关实现方案:
  • Netflix Zuul:早期实现,目前已经淘汰
  • SpringCloudGateway:基于Spring的WebFlux技术,完全支持响应式编程,吞吐能力更强。
    SpringCloudGateway官网:https://spring.io/projects/spring-cloud-gateway#learn
    在这里插入图片描述

网关路由-快速入门

接下来,我们先看下如何利用网关实现请求路由。由于网关本身也是一个独立的微服务,因此也需要创建一个模块开发功能。大概步骤如下:

  • 创建网关微服务
  • 引入SpringCloudGateway、NacosDiscovery依赖
  • 编写启动类
  • 配置网关路由

1、创建项目
首先,我们要创建一个新的module,比如命名为gateway,作为网关微服务:

2、引入依赖
在gateway模块的pom.xml文件中引入依赖

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>

3、编写启动类
在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);}
}

4、配置路由
接下来,在gateway模块的resources目录新建一个application.yaml文件,内容如下:

server:port: 8080
spring:application:name: gatewaycloud:nacos:server-addr: 192.168.254.129:8848gateway:routes:- id: item # 路由规则id,自定义,唯一uri: lb://item-service # 路由的目标服务,lb代表负载均衡,会从注册中心拉取服务列表predicates: # 路由断言,判断当前请求是否符合当前规则,符合则路由到目标服务- Path=/items/**,/search/** # 这里是以请求路径作为判断规则- id: carturi: lb://cart-servicepredicates:- Path=/carts/**- id: useruri: lb://user-servicepredicates:- Path=/users/**,/addresses/**- id: tradeuri: lb://trade-servicepredicates:- Path=/orders/**- id: payuri: lb://pay-servicepredicates:- Path=/pay-orders/**

网关路由-路由属性

网关路由对应的Java类型是RouteDefinition,其中常见的属性有

  • id:路由唯一标示
  • uri:路由目标地址
  • predicates: 路由断言,判断请求是否符合当前路由
  • filters:路由过滤器,对请求或响应做特殊处理

Spring Cloud Gateway官网:https://docs.spring.io/spring-cloud-gateway/docs/3.1.9/reference/html/

1、路由断言
12种Route Predicate Factories实现示例
在这里插入图片描述
2、路由过滤器
33种路由过滤器官网实现示例
在这里插入图片描述
在default-filters下设置的过滤器对所有路由生效:

spring:cloud:gateway:routes:- id: itemuri: lb://item-servicepredicates:- Path=/items/**,/search/**default-filters:- AddRequestHeader=truth, anyone long-press like button will be rich

网关登录校验-思路分析

在这里插入图片描述
在这里插入图片描述

注意:NettyRoutingFilter是做请求转发的,所以应该在NettyRoutingFilter之前且在过滤器的pre逻辑之前进行登录校验

网关登录校验-自定义过滤器

在这里插入图片描述
自定义GlobalFilter过滤器

进行登录校验一般都选择自定义GlobalFilter过滤器

在这里插入图片描述
在这里插入图片描述
自定义GagtewayFilter过滤器

自定义GagtewayFilter过滤器比较麻烦,大多数情况都选择自定义GlobalFilter过滤器

自定义GatewayFilter不是直接实现GatewayFilter,而是实现AbstractGatewayFilterFactory。最简单的方式是这样的:

@Component
public class PrintAnyGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> {@Overridepublic GatewayFilter apply(Object config) {return new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 获取请求ServerHttpRequest request = exchange.getRequest();// 编写过滤器逻辑System.out.println("过滤器执行了");// 放行return chain.filter(exchange);}};}
}

注意:该类的名称一定要以GatewayFilterFactory为后缀!

然后在yaml配置中这样使用:

spring:cloud:gateway:default-filters:- PrintAny # 此处直接以自定义的GatewayFilterFactory类名称前缀类声明过滤器

另外,这种过滤器还可以支持动态配置参数,不过实现起来比较复杂,示例:

@Component
public class PrintAnyGatewayFilterFactory // 父类泛型是内部类的Config类型extends AbstractGatewayFilterFactory<PrintAnyGatewayFilterFactory.Config> {@Overridepublic GatewayFilter apply(Config config) {// OrderedGatewayFilter是GatewayFilter的子类,包含两个参数:// - GatewayFilter:过滤器// - int order值:值越小,过滤器执行优先级越高return new OrderedGatewayFilter(new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 获取config值String a = config.getA();String b = config.getB();String c = config.getC();// 编写过滤器逻辑System.out.println("a = " + a);System.out.println("b = " + b);System.out.println("c = " + c);// 放行return chain.filter(exchange);}}, 100);}// 自定义配置属性,成员变量名称很重要,下面会用到@Datastatic class Config{private String a;private String b;private String c;}// 将变量名称依次返回,顺序很重要,将来读取参数时需要按顺序获取@Overridepublic List<String> shortcutFieldOrder() {return List.of("a", "b", "c");}// 返回当前配置类的类型,也就是内部的Config@Overridepublic Class<Config> getConfigClass() {return Config.class;}}

然后在yaml文件中使用:

spring:cloud:gateway:default-filters:- PrintAny=1,2,3 # 注意,这里多个参数以","隔开,将来会按照shortcutFieldOrder()方法返回的参数顺序依次复制

上面这种配置方式参数必须严格按照shortcutFieldOrder()方法的返回参数名顺序来赋值。
还有一种用法,无需按照这个顺序,就是手动指定参数名:

spring:cloud:gateway:default-filters:- name: PrintAnyargs: # 手动指定参数名,无需按照参数顺序a: 1b: 2c: 3

网关登录校验-实现登录校验

网关登录校验-网关传递用户到微服务

网关登录校验-OpenFeign传递用户信息


http://www.mrgr.cn/news/58186.html

相关文章:

  • paddleocr使用FastDeploy 部署工具部署 rknn 模型
  • 黑科技!Llama 3.2多模态AI震撼发布
  • Django配置路由后,为什么输入http://127.0.0.1:8000/ 网址后报错了?
  • 前端使用xlsx和file-saver自定义导出excel表格,无需写页面直接导出数据。末尾有一个插件方式使用
  • 有了这个AI智能工具,抠图再也不求人
  • 力扣4:寻找两个正序数的中位数
  • django restful API
  • 迅为RK3568开发板/核心板赋能数字广告,推动智能化新时代
  • axios退休了吗?现代Web开发的新请求策略
  • 企业如何配合好等级保护测评工作?
  • Vue组件学习 | 二、Vuex组件
  • HarmonyOS NEXT应用元服务开发控件位置调整场景与重新设置新焦点位置的场景
  • 【CUDA代码实践02】矩阵加法运算程序
  • GBase8a 审计管理
  • [ARM-2D 专题]4. 快速搭建ARM2D的PC仿真开发环境及避坑手法
  • 4PCS与Super4PCS算法原理介绍
  • JAVA学习-练习试用Java实现“接口 `Flyable` 和一个鸟类 `Bird` ”
  • 想进体制内?到底有哪些路可走?原来有这么多方法
  • opencv学习笔记(4):图像属性和基本图形绘制
  • P4735 最大异或和 题解
  • MES(制造执行系统)物料管理模块概述
  • Cursor零基础小白教程系列「高阶」 - Cursor 模型选择和API密钥配置
  • antv g6问题处理汇总
  • MySQL(python开发)——(10)Sql操作及优化
  • 智联引擎是什么?
  • 基于ssm+vue的房源管理系统设计与实现