微服务网关之Gateway

embedded/2024/10/30 18:33:50/

1.微服务网关介绍

  • 什么是网关
    • API Gateway,是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能,提供路由请求、鉴权、监控、缓存、限流等功能
    • 统一接入
      • 智能路由
      • AB测试、灰度测试
      • 负载均衡、容灾处理
      • 日志埋点(类似Nginx日志)
    • 流量监控
      • 限流处理
      • 服务降级
    • 安全防护
      • 鉴权处理
      • 监控
      • 机器网络隔离
  • 主流的网关
    • zuul:是Netflix开源的微服务网关,和Eureka、Ribbon、Hystrix等组件配合使用,依赖组件比较多,性能较差
    • kong:由Mashape公司开源的,基于Nginx的API gateway
    • nginx+lua:是一个高性能的http和反向代理服务器,lua是脚本语言,让nginx执行lua脚本,并且高并发、非阻塞的处理各种请求
    • springcloud gateway:spring公司专门开发的网关,替代zuul
    • 注意:AlibabaCloud全家桶还没对应的网关,我们就用SpringCloud官方推荐的gateway

2.SpringCloud Gateway介绍

  • 什么是SpringCloud Gateway
    • Spring官方出品,基于Spring5+Reactor技术开发的网关
    • 性能强劲,基于Reactor+WebFlux,功能多样
    • 基于springboot2.x,可以直接jar包方式运行
  • 官方文档:Spring Cloud Gateway

3.项目实战整合(nacos已经引入)

  • 创建Gateway项目

    • 添加依赖

       <!--gateway-->
      <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
      </dependency>
      
    • 配置

      spring:application:name: gen-gateway-servicecloud:# nacos注册中心地址nacos:discovery:server-addr: 114.132.67.61:18848gateway:# 数组形式routes:# 用户服务,路由唯一标识- id: user-service# 从nacos进行转发uri: lb://gen-user-service# 优先级,数字越小优先级越高order: 1# 断言,配置哪个路径才转发,前端访问路径统一加上Path内容,网关判断转发对应的服务,如果是回调业务记得修改predicates:- Path=/user-service/**# 过滤器,请求在传递过程中通过过滤器修改filters:# 去掉第一层前缀,转发给后续的路径- StripPrefix=1discovery:locator:# 开启网关拉取nacos服务enabled: true
      

4.Gateway配置和交互流程

  • 网关配置项

    • 路由:是网关的基本单元,由id、uri、一组predicate、一组filter组成,根据predicate进行匹配转发

      route组成部分
      id:路由的id
      uri:匹配路由的转发地址
      predicates:配置该路由的断言,通过PredicateDefinition类进行接收配置
      order:路由的优先级,数字越小优先级越高
      
  • 交互流程

    • 客户端向Spring Cloud Gateway发出请求

    • 如果网关处理程序映射确定请求与路由匹配

    • 则将其发送到网关Web处理程序

    • 通过特定过滤器链运行,前置处理-后置处理

5.Gateway内置路由断言

  • 什么是Gateway路由断言

    • Predicate来源于Java8,接收输入参数,返回一个布尔值结果
    • Spring Cloud Gateway中Spring利用Predicate的特性实现了各种路由匹配规则
    • 转发的判断条件,Spring Cloud Gateway支持多种方式,常见如:Path、Query、Method、Header等
    • 支持多个Predicate请求的转发是必须满足所有的Predicate后才可以进行路由转发
  • 内置路由断言:RoutePredicateFactory接口实现类

    在这里插入图片描述

  • 参数编写规则:XXXRoutePredicateFactory,使用XXX作为参数配置,例如下面(部分代码)

    predicates:- Path=/product-service/**# 实现接口定时下线功能,在配置时间后接口不可访问- Before=2024-10-26T00:00:00.000+08:00
    

6.Gateway过滤器

  • 过滤器生命周期

    • PRE:这种过滤器在请求被路由之前调用,一般用于鉴权、限流等

    • POST:这种过滤器在路由到微服务以后执行,一般用于修改响应结果,比如增加header信息、打点结果日志

  • 网关过滤器分类

    • 局部过滤器GatewayFilter:应用在某个路由上,每个过滤器工厂都对应一个实现类,并且这些类的名称必须以GatewayFilterFactory结尾
    • 全局过滤器:作用于全部路由上
  • 内置很多局部过滤器,顶级接口GatewayFilterFactory

    在这里插入图片描述

  • 内置很多全局过滤器,顶级接口GlobalFilter

    在这里插入图片描述

  • 自定义全局过滤器实现鉴权

    package com.gen.filter;import org.apache.commons.lang.StringUtils;
    import org.springframework.cloud.gateway.filter.GatewayFilterChain;
    import org.springframework.cloud.gateway.filter.GlobalFilter;
    import org.springframework.core.Ordered;
    import org.springframework.http.HttpStatus;
    import org.springframework.stereotype.Component;
    import org.springframework.web.server.ServerWebExchange;
    import reactor.core.publisher.Mono;/*** 自定义全局过滤器实现鉴权功能*/
    @Component
    public class LoginGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String token = exchange.getRequest().getHeaders().getFirst("token");// todo:业务逻辑if (StringUtils.isBlank(token)) {exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}// 继续往下执行return chain.filter(exchange);}/*** 数字越小,优先级越高** @return*/@Overridepublic int getOrder() {return 0;}
    }
    
  • 注意:网关不要加太多业务逻辑,否则会影响性能


http://www.ppmy.cn/embedded/133672.html

相关文章

excel斜线表头

检验数据验证对象 鼠标放在检验数据 验证对象中间&#xff0c;altenter 之后空格 选中格子&#xff0c;右键单元格格式&#xff0c; 完成 如果是需要多分割&#xff0c;操作一样&#xff0c;在画斜线的时候会有区别&#xff0c;在插入里面用直线画斜线即可 在表格插入的时…

java版工程管理系统Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码

在当今快速发展的建设行业中&#xff0c;工程项目管理软件作为项目管理的重要工具&#xff0c;正在发挥着越来越重要的作用。它通过集成多个功能模块&#xff0c;从建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;实现…

Spring 的事务传播机制

Spring 的事务传播机制定义了一个事务方法在遇到已经存在的事务时如何处理。事务传播属性&#xff08;Propagation&#xff09;提供了七种机制&#xff0c;以适应不同的业务需求和事务边界管理。 1. Spring 的事务传播机制的类型 &#xff08;1&#xff09;REQUIRED&#xff…

sqlyog软件

SQLyog&#xff1a;SQLyog的下载、安装-CSDN博客 navicat与SQLyog的区别_sqlyog和navicat-CSDN博客 MySQL是一个功能齐全的关系数据库管理系统&#xff0c;软件是开源的&#xff0c;MySQL数据库服务器速度快、可靠性高&#xff0c;扩展性强&#xff0c;且易于使用。 MySQL与…

Stable Diffusion 3.5发布:图像生成新纪元,多模态AI的突破!

在人工智能的图像生成领域&#xff0c;我们刚刚迎来了一位新的明星——Stable Diffusion 3.5。这是一款由多模态扩散Transformer&#xff08;MMDiT&#xff09;驱动的文本到图像模型&#xff0c;它在图像质量、字体处理、复杂提示理解以及资源效率方面都实现了显著提升。今天&a…

JavaSE笔记3】面向对象高级

目录 拓1&#xff1a;私有方法的优点 拓2&#xff1a;静态方法的优点 拓3&#xff1a;类的五大成分 拓4&#xff1a;硬编码和软编码 一、static 1. 概念 2. 成员变量在内存中执行原理 3. 类变量(静态变量)的使用场景 4. 两种成员变量 5. 两种成员方法 6. 类方法的使用场景 7.…

bug-JavaArrays.fill()隐藏问题

对于一个数组想要初始一样的值&#xff0c;我们经常会这样编写。全部进行复制1&#xff0c;但是你有没有考虑过&#xff0c;如果是一个对象数组呢&#xff1f; 如果也是new Thread,这个是有五个线程&#xff0c;还是一个线程&#xff1f; 这是我在今天做哲学家问题时候遇到的…

python通过translate库实现中英文翻译

功能介绍 translate库&#xff0c;可以轻松实现中英文的翻译。 使用pip直接安装translate库&#xff1a;pip install translate translate库github地址 命令行直接调用 当使用pip安装以后&#xff0c;就得到了translate-cli的命令&#xff0c;此时可以通过该命令直接实现翻…