微服务之服务网关(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实现根据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