微服务之服务网关(GateWay)

2023-11-15

概述

什么是网关?为什么需要网关?

什么是网关: 网关就是架设在前端浏览器和后端微服务之间的一层服务,用于转发请求,微服务的接口不再暴露给前端页面,前端只了解网关的地址.

为什么需要网关: 其实不要也可以,加了网关就是可以做一些服务限流,统计比较方便,安全方面可能也有考虑,不会将后台服务器直接暴露.主要还是方便,前端请求只往网关上发,网关做请求和后端服务器的映射关系

GateWay实现网关 (spring cloud 2.0)

概念

GateWay提供一种简单而有效的方式来对API进行路由,以及提供一些强大的功能,例如 熔断,限流,重试
基于 WebFlux 框架实现, WebFlux 底层基于高性能通行框架 Netty

Route(路由)

路由是构建网关的基本模块, 由 ID 目标 URI 一系列的 断言过滤器 组成,如果断言为 true ,则匹配该路由

工作流程

gateway这几个概念的工作流程

  1. 设置若干个路由,路由中包括断言URI
  2. 请求过来的时候判断每个路由的断言 如果为true,则表示该路由生效
  3. 该路由中的过滤器再进行生效
  4. 注意,如果断言重复,只会匹配第一个
    在这里插入图片描述

搭建

  1. 引入pom文件
    gateway 不能引入 spring-boot-starter-web 依赖
       <dependencies>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-gateway</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
       </dependency>
   </dependencies>
  1. 添加yml 文件
server:
 port: 9527

spring:
 application:
   name: gateway
 cloud:
   gateway:
     routes:
         # 路由的id,没有固定规则但是要求唯一
       - id: provider-01
         # 匹配后提供服务的路由地址  
         uri: http://localhost:9001
         # 断言,路径匹配的进行路由
         predicates:
           - Path=/test01/**

       - id: provider-01-01
         uri: http://localhost:9001
         predicates:
           - Path=/future/**

       - id: provider-02
         uri: http://localhost:9002
         predicates:
           - Path=/test02/**
eureka:
 client:
   #    是否要自己注册到EUREKA 上
   register-with-eureka: true
   #    不需要去服务注册中心获取其他服务地址
   fetch-registry: true
   service-url:
     defaultZone:  http://EUREKA01:7001/eureka/

动态路由

刚才的案例中,直接指定了 服务的ip和端口,没有办法做到负载均衡和动态扩容
修改路由里面uri 改为 uri: lb://+微服务名称 即可实现负载均衡

Predicate(断言)

就是一个返回true 和 false 的东西, 返回true 就匹配.
GateWay 启动的时候打印了一堆断言类
在这里插入图片描述
我们已经用过 Path 断言,用于匹配url,接下来看看其他的断言如何使用

  1. After 请求的时间必须在指定时间之后,时间格式可以使用 ZonedDateTime.now()获得
  2. Between 就是两个时间区域之间生效,用逗号隔开
  3. Cookie 需要两个参数,一个是 cookie name 一个是正则表达式
  4. Header 和 Cookie 差不多,一个写头名称,一个正则
        - id: provider-01
          # 匹配后提供服务的路由地址
#          uri: http://localhost:9001
          uri: lb://provider-01
          # 断言,路径匹配的进行路由
          predicates:
#            根据路径匹配
            - Path=/future/test999/**
#            根据请求时间匹配
            - After=2020-09-12T13:10:07.398+08:00[Asia/Shanghai]
#            请求中必须符合cookie正则,可以多个
            - Cookie=username, tom

            - Cookie=age, 18
#             请求中头信息必须符合正则
            - Header=userId, 992

注意!

两个不同的路由指向同一个资源, 路由的断言不同, A路由的断言返回false ,B路由的断言返回true ,请求还是可以通过 B路由访问到
在这里插入图片描述

Filter(过滤)

spring框架中 GateWayFilter 实例,使用过滤器,可以在请求在路由请求前后修改

  1. AddRequestHeader 添加请求头, key value 用逗号隔开
  2. StripPrefix 去除前缀,个人感觉比较有用,用于做微服务前缀区分
    还有很多,官网上有
    链接: GateWay官方文档.
自定义过滤器

作用: 日志记录,如果在微服务层的 controller 做aop拦截记录日志,会记录下很多因为前端一个操作而微服务之间相互调用的多次无意义的请求.直接在网关层拦截请求记录

  1. 实现 GlobalFilter 和 Ordered 接口
@Component
public class MyLogFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        MultiValueMap<String, String> queryParams = exchange.getRequest().getQueryParams();
        for (Map.Entry<String, List<String>> entry : queryParams.entrySet()) {
            String key = entry.getKey();
            List<String> value = entry.getValue();
            System.out.println("key-----"+key);
            System.out.println("value------"+value);
        }

        String name = queryParams.getFirst("name");
        if (name == null){
            // 不放行
            exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);
            return exchange.getResponse().setComplete();
        }
//        放行
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

暂时只能获取geturl中的参数,请求体里面的内容获取需要掌握 MONO相关技术才能了解.搁置一下,

todo gateway获取请求体中内容,实现日志记录功能

总结

实际开发中,众多微服务之间,可能会有 url重复的情况,前后端定义接口的时候,前端发送的请求应该添加一个微服务的前缀作为标示,到了网关根据前缀判断属于哪个微服务进行转发
其中zuul 可以直接实现前缀和微服务的映射

zuul:
  routes:
#    eureka 中服务id
    provider-01:
#      什么路径会映射到这个id上
      path: /kkk/**

当前端发送请求 http://localhost:9527/kkk/test01 的时候,zuul转发到provider-01这个微服务的请求已经变成 http://provider-01:port/test01 了,比较方便.

如果是GateWay 就需要用到filter的 StripPrefix 接受一个非0数,表示去除的前缀的个数.

	routes:
          # 路由的id,没有固定规则但是要求唯一
        - id: provider-01
          # 匹配后提供服务的路由地址
          uri: lb://provider-01
          # 断言,路径匹配的进行路由
          predicates:
#            根据路径匹配
            - Path=/provider01/**
          filters:
            - StripPrefix=1

官网上经常用{segment}来当demo,不知道什么意思,直接用 **即可.
前端用provider01前缀的请求全部都会转发到 provider-01的微服务上

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微服务之服务网关(GateWay) 的相关文章

  • 用于解析和构建逻辑表达式的 Java 库

    我正在寻找一个 Java 开源库来解析和构建类似 SQL 的表达式 例如评估表达式的有效性 例如 a x or y and b z 另外我想要一个用于构建或扩展表达式的 API 就像是 Expression exp new Expressi
  • 在 Java 中使用 Batik 检查和删除 SVG 中的属性

    这个问题基本上说明了一切 如何检查 SVG 是否具有 viewBox 属性 我正在使用蜡染库 我需要这个 因为我需要 至少 通知用户有一个 viewBox 属性 我可以删除它吗 使用 org w3c dom 类 您可以按照以下方式做一些事情
  • 对象数组的数组(二维数组)JNI

    我正在努力创建自定义对象类型 ShareStruct 的二维数组 jobjectArray ret jobjectArray ins jobjectArray outs jclass myClass env gt FindClass env
  • 如何作为应用程序发布到页面?

    所以 我有一个应用程序 Facebook 应用程序实体 并且我有一个页面 我想使用应用程序通过java代码 通过restfb或任何其他建议 发布到页面 看起来我错过了页面授予应用程序发布权限的阶段 不知道该怎么做 谢谢你们 乌里 您只能 作
  • 迭代函数可以调用自身吗?

    当观看下面的 MIT 6 001 课程视频时 讲师在 28 00 将此算法标记为迭代 但是 在 30 27 他说这个算法和实际的 递归 算法都是递归的 该函数正在使用基本情况调用自身 那么这次迭代情况如何 private int itera
  • JUnit5 平台启动器 API - 如果没有至少一个测试引擎,则无法创建启动器

    我正在尝试升级我们的自动化测试套件的测试能力以接受 JUnit5 测试并遵循JUnit 平台启动器 API 说明 https junit org junit5 docs current user guide launcher api我收到错
  • 可访问数据的 Java 约定。 (公共访问器和 Getter/命名)

    通过 Java API 您会看到大量冲突的命名和实践 这让我感到非常困惑 例如 The String http grepcode com file repository grepcode com java root jdk openjdk
  • 无法在 Java 中输出正确的哈希值。怎么了?

    在我的 Android 应用程序中 我有一个 SHA256 哈希值 我必须使用 RIPEMD160 消息摘要算法进一步对其进行哈希值 我可以输出任何字符串的正确 sha256 和ripemd160 哈希值 但是当我尝试使用ripemd160
  • Java:SortedMap、TreeMap、可比较?如何使用?

    我有一个对象列表 需要根据其中一个字段的属性进行排序 我听说 SortedMap 和 Comparator 是实现此目的的最佳方法 我是否要与正在排序的类实现 Comparable 还是创建一个新类 如何实例化 SortedMap 并传入
  • 具有 JPA 持久性的 Spring 状态机 - 存储库使用

    我试图弄清楚如何轻松使用 Spring 状态机 包括使用 JPA 进行持久化 这是我正在处理的问题 不兼容的数据类型 工厂和持久性 在程序的某个时刻 我想使用连接到用户的状态机 有用于此目的的存储库 项目spring statemachin
  • Struts 1 到 Spring 迁移 - 策略

    我有一个legacy银行应用程序编码为Struts 1 JSP现在的要求是迁移后端 目前为 MVC to Springboot MVC 后续UI JSP 将迁移到angular Caveats 1 后端不是无状态的 2 会话对象中存储了大量
  • 如何在 JPA 和 Hibernate 中将数据库生成的列值定义为只读字段?

    使用 MariaDB 10 2 可以定义日期时间的默认值 例如创建和最后修改 我应该如何将此列作为只读字段访问 因为这个值应该只在数据库的控制之下 并且不应该从代码中修改 但我想在代码中读取这个属性 这很简单 只需设置insertable
  • 在尝试使用 GPS 之前如何检查 GPS 是否已启用

    我有以下代码 但效果不好 因为有时 GPS 需要很长时间 我该如何执行以下操作 检查GPS是否启用 如果启用了 GPS 请使用 GPS 否则请使用网络提供商 如果 GPS 时间超过 30 秒 请使用网络 我可以使用时间或 Thread sl
  • 用于层次结构树角色的 Spring Security / Java EE 解决方案

    我知道 Spring Security 非常适合标准角色和基于权限的授权 我不确定的是这种情况 系统中管理着 10 000 名员工 员工被组织成组织结构图 跨部门的谁向谁报告的树 其中一些员工是用户 这些用户仅被允许访问其职责范围内的员工
  • 在 Java 中创建 XML 文件的最佳方法是什么?

    我们目前使用 dom4j 来创建 XML 文件 不过 我猜现在有更好的东西了 如果我们使用的是 Java 1 6 或更高版本 那么在编写 XML 文件时最好使用什么类 运行速度最快 使用简单 我不需要构建一个 DOM 然后编写整个 DOM
  • 如何从字符串中解析一个大整数? [复制]

    这个问题在这里已经有答案了 我有一个这样的方法 Integer parseInt myInt 不是这个整数变得很长 我得到以下异常 java lang NumberFormatException For input string 40001
  • 如何使用Gson仅从Json反序列化某些特定字段?

    我有以下 JSON 字符串 channel bvmt initValues data value instrumentIds TN0007250012 TN0007500010 instruments mnemonic ADWYA marc
  • Android UnityPlayerActivity 操作栏

    我正在构建一个 Android 应用程序 其中包含 Unity 3d 交互体验 我已将 Unity 项目导入 Android Studio 但启动时该 Activity 是全屏的 并且不显示 Android 操作栏 我怎样才能做到这一点 整
  • Axis2 错误:要输出的文本中的空白字符 (0x4) 无效

    我创建了一个 Java 客户端 使用 Axis2 1 7 6 作为代码生成器与 SOAP Web 服务进行交互 问题在于客户端的某些输入抛出异常并显示以下消息 org apache axis2 AxisFault Invalid white
  • 受信任的 1.5 小程序可以执行系统命令吗?

    如果是的话 这个能力有什么限制吗 具体来说 我需要以 Mac OSX 为目标 我以前用过这个在 Windows 系统上启动东西 但从未在 Mac 上尝试过 public void launchScript String args Strin

随机推荐

  • java实现根据pdf文件模板生成pdf文件

    一 如何制作pdf模板 1 首先创建template doc 2 根据doc文件制作pdf模板 3 将doc文件输出为pdf 文件 gt 输出为pdf 4 输出的pdf文件 5 使用Adobe Acrobat DC打开template pd
  • HTML+CSS炫酷效果(小伙伴赶紧收藏起来吧)

    制作不易 点赞加关注哦 目录 1 实现奥运徽效果 2 实现3D效果 3 翻开葵花宝典 4 实现漂浮文字 动图 5 手机充电特效 动态 6 滚动时针 7 立体相册 1 实现奥运徽效果 由于图片违规 就不给老铁发了哈 亲自试试呗 HTML如下
  • 对 Electron 架构的理解

    Electron 的架构可以分为三层 Chromium Node js 和应用程序层 Electron 是一种基于 Chromium 和 Node js 的开源框架 可以用于快速构建跨平台的桌面应用程序 Chromium 层 Chromiu
  • 【并发编程】CPU cache结构和缓存一致性(MESI协议)

    一 cache cpu cache已经发展到了三级缓存结构 基本上现在买的个人电脑都是L3结构 1 cache的意义 为什么需要CPU cache 因为CPU的频率太快了 快到主存跟不上 这样在处理器时钟周期内 CPU常常需要等待主存 浪费
  • Klarf 文件可视化工具

    1 技术框架 1 1 前端 Vue3 网页版 Electron Quasar 可生成 EXE APK 等客户端 Element Plus 控件 axios 跨域 1 2 后端 Flask 提供接口 2 Web 版和客户端版 2 1 Web
  • android:configchanges 作用,关于android:configChanges的属性的简介

    在Android系统默认的情况下 当 屏幕方向 或 键盘显示隐藏 变化时都会销毁当前Activity 创建新的Activity 如果不希望重新创建Activity实例 可以在AndroidManifest xml中配置 android co
  • 基于Docker做MySQL主从搭建与Django的读写分离

    目录 基于Docker做MySQL主从搭建 django读写分离 基于Docker做MySQL主从搭建 主从的作用 写数据数据时使用主库 从库只用来读数据 这样做能够减少数据库压力 主从搭建可以一主一从 也可以是一主多从 mysql主从配置
  • 微信小程序、微信公众号、H5之间相互跳转

    转自慕课网 一 小程序和公众号 答案是 可以相互关联 在微信公众号里可以添加小程序 图片有点小 我把文字打出来吧 可关联已有的小程序或快速创建小程序 已关联的小程序可被使用在自定义菜单和模版消息等场景中 公众号可关联同主体的10个小程序及不
  • 反事实因果(Counterfactual)简介

    Counterfactual 简介 确定的反事实 反事实是什么 用了例子说明 比如你去了二仙桥 走的是成华大道 但是用了很久才到 于是你就想要是当初坐地铁就好了 你会发现 要是坐地铁就好了 这个推断只有在发生了 走成华大道用了很久 这个事实
  • 矩阵、向量求导

    1 行向量对元素求导 2 列向量对元素求导 例2 略 参考例1 把行向量转成列向量 分别对y向量的每个项进行求导 3 矩阵对元素求导 4 元素对行向量求导 5 元素对列向量求导 例5 略 参考例4 6 元素对矩阵求导 7 行向量对列向量求导
  • 在设计web页面时,为移动端设计一套页面,PC端设计一套页面,并且能自动根据设备类型来选择是用移动端的页面还是PC端的页面。

    响应式设计 即移动端和PC端共用一个HTML模式 网站的程序和模板自动根据设备类型和屏幕大小进行自适应调整 这种方法我不喜欢 原因是不能很好保证各种客户端的效果 里面存在各种复杂的兼容性等问题 我喜欢为不同的客户端写不同的模式 避免在响应式
  • Python开发就业岗位有哪些?Python薪资待遇如何?

    Python开发就业岗位有哪些 Python就业岗位分为 Python后端 数据分析 数据挖掘 机器学习 爬虫等 后端岗位多 Python岗位占50 是爬虫工程师的10倍 其次是数据分析岗位 仅次于Python后端开发 数据挖掘和机器学习大
  • linux下安装jenkins

    参考文档 如何在Linux CentOS7 环境搭建 Jenkins 服务器环境 爱码网 1 官网下载安装 官网 Redhat Jenkins Packages sudo wget O etc yum repos d jenkins rep
  • Linux安全扫描工具ClamAV安装及使用

    导语 Clam AntiVirus ClamAV 是免费而且开放源代码的防毒软件 软件与病毒码的更新皆由社群免费发布 ClamAV在命令行下运行 它不将杀毒作为主要功能 默认只能查出系统内的病毒 但是无法清除 需要用户自行对病毒文件进行处理
  • Csharp:WebClient and WebRequest use http download file

    Csharp WebClient and WebRequest use http download file 20140318 塗聚文收錄 string filePath 20140302 pdf string fileName http
  • Unity - 射线检测

    Unity 射线检测 本文简要分析了Unity中各类 射线检测 的基本原理及用法 及不同检测手段的性能对比 内容包括 Ray 射线 RaycastHit 光线投射碰撞信息 Raycast 光线投射 BoxCast SphereCast Ca
  • 学习黑马JVM的笔记

    JVM详解 一 JVM介绍 1 什么是JVM 2 有什么好处 3 学习路线 二 内存结构 1 程序计数器 Program Counter Registe 1 定义 2 作用 3 特点 4 演示 2 虚拟机栈 Java Virtual Mac
  • 通过socket获取对方ip地址

    struct sockaddr in sa int len sizeof sa if getpeername sockfd struct sockaddr sa len printf 对方IP s inet ntoa sa sin addr
  • GDI/GDI+/D2D/D3D

    GDI GDI D2D D3D 标签 GDID3D 2015 07 27 11 28 503人阅读 评论 0 收藏 举报 分类 Windows系统 7 原文链接 2D Drawing APIs in Windows 在 Windows 7
  • 微服务之服务网关(GateWay)

    服务网关 概述 什么是网关 为什么需要网关 GateWay实现网关 spring cloud 2 0 概念 Route 路由 工作流程 搭建 动态路由 Predicate 断言 注意 Filter 过滤 自定义过滤器 todo gatewa