SpringCloud组件之Gateway网关详细教程

2023-11-15

目录

一:概念

1.1:什么是微服务网关?

1.2: 为什么需要使用网关,网关的作用?

1.3网关的好处?

二:Gateway网关的快速入门 

1.快速创建

2.网关路由的流程

 3:Gateway断言工厂 (predicates)

 4.gateway过滤器工厂

 5 .过滤器的执行顺序

 6.解决跨域问题


一:概念

1.1:什么是微服务网关?

传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关,客户端只能在本地记录每个微服务的调用地址,当需要调用的微服务数量很多时,它需要了解每个服务的接口,这个工作量很大,Gateway是SpringCloud提供的微服务组件,可以实现对微服务群的保护. 将来所有的请求必须通过网关进入微服务群

 

1.2: 为什么需要使用网关,网关的作用?

为的是对微服务群的保护,保护为服务群不受外界攻击

请求路由 和 负载均衡:一切请求都必须先经过gateway,但网关不处理业务,而是根据某种规则,把请求转发到某个微服务,这个过程叫做路由。当然路由的目标服务有多个时,还需要做负载均衡。
权限控制:网关作为微服务入口,需要校验用户是是否有请求资格,如果没有则进行拦截。
限流:当请求流量过高时,在网关中按照下流的微服务能够接受的速度来放行请求,避免服务压力过大。

1.3网关的好处?

(1)简化客户端的工作。网关将微服务封装起来后,客户端只需同网关交互,而不必调用各个不同服务;
(2)降低微服务之间的耦合度。 一旦服务接口修改,只需修改网关的路由策略,不必修改每个调用该函数的客户端,从而减少了程序间的耦合性
(3)解放开发人员把精力专注于业务逻辑的实现。由网关统一实现服务路由、负载均衡、访问控制、流控熔断降级等非业务相关功能,而不需要每个服务 API 实现时都去考虑
 

 在SpringCloud中网关的实现包括两种:

【gateway】【zuul】

Zuul是基于Servlet的实现,属于阻塞式编程。而SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能。

二:Gateway网关的快速入门 

1.快速创建

1.创建Gateway服务,引入依赖

 2.依赖

<!--网关-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos服务发现依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

 3.编写启动类

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.编写基础配置和路由配置  application.yml

server:
  port: 10010 # 网关端口
spring:
  application:
    name: gateway # 服务名称
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos地址
    gateway:
      routes: # 网关路由配置
        - id: user-service # 路由id,自定义,只要唯一即可
          # uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
          uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称
          predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
            - Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求

将符合Path 规则的一切请求,都代理到 uri参数指定的地址。

/user/**开头的请求,代理到lb://userservice,lb是负载均衡,根据服务名拉取服务列表,实现负载均衡。

 5.启动访问网关【相对应的地址】

2.网关路由的流程

 

 路由配置包括:

  1. 路由id:路由的唯一标示

  2. 路由目标(uri):路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡

  3. 路由断言(predicates):判断路由的规则,

  4. 路由过滤器(filters):对请求或响应做处理

 3:Gateway断言工厂 (predicates)

   predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
            - Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求

 根据路径进行断言,做路由分发

 Spring Cloud Gateway 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 权重处理

 4.gateway过滤器工厂

GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理

 

 路由过滤器的种类:(Spring提供了三十多种不同的路由过滤器工厂 )

名称 说明
AddRequestHeader 给当前请求添加一个请求头
RemoveRequestHeader 移除请求中的一个请求头
AddResponseHeader 给响应结果中添加一个响应头
RemoveResponseHeader 从响应结果中移除有一个响应头
RequestRateLimiter 限制请求的流量

spring:
  cloud:
    gateway:
      routes:
      - id: user-service 
        uri: lb://userservice 
        predicates: 
        - Path=/user/** 
        filters: # 过滤器
        - AddRequestHeader=Truth, Itcast is freaking awesome! # 添加请求头

上面的结果是:

        给所有进入userservice的请求添加一个请求头:Truth=itcast is freaking awesome!

注意:当前过滤器写在userservice路由下,只对userservice的请求有效;(局部过滤器

 默认过滤器

 如果要对所有的路由都生效,则可以将过滤器工厂写到default下

spring:
  cloud:
    gateway:
      routes:
      - id: user-service 
        uri: lb://userservice 
        predicates: 
        - Path=/user/**
      default-filters: # 默认过滤项
      - AddRequestHeader=Truth, Itcast is freaking awesome! 

全局过滤器【重要】 GlobalFilter

 全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。区别在于GatewayFilter通过配置定义,处理逻辑是固定的;而GlobalFilter的逻辑需要自己写代码实现。

 定义方式是实现GlobalFilter接口

public interface GlobalFilter {
    /**
     *  处理当前请求,有必要的话通过{@link GatewayFilterChain}将请求交给下一个过滤器处理
     *
     * @param exchange 请求上下文,里面可以获取Request、Response等信息
     * @param chain 用来把请求委托给下一个过滤器 
     * @return {@code Mono<Void>} 返回标示当前过滤器业务结束
     */
    Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}

案例:编写自定义全局过滤器

package cn.itcast.gateway.filters;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Order(-1) // 设置过滤器的执行顺序
@Component
public class AuthorizeFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 1.获取请求参数
        MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();
        // 2.获取authorization参数
        String auth = params.getFirst("authorization");
        // 3.校验
        if ("admin".equals(auth)) {
            // 放行
            return chain.filter(exchange);
        }
        // 4.拦截
        // 4.1.禁止访问,设置状态码
        exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
        // 4.2.结束处理
        return exchange.getResponse().setComplete();
    }
}

 5 .过滤器的执行顺序

请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter

请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器:

 排序的规则是什么呢?

  • 每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前

  • GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定

  • 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增。

  • 当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行。

 6.解决跨域问题

添加配置文件

spring:
  cloud:
    gateway:
      # 。。。
      globalcors: # 全局的跨域处理
        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
        corsConfigurations:
          '[/**]':
            allowedOrigins: # 允许哪些网站的跨域请求 
              - "http://localhost:8090"
            allowedMethods: # 允许的跨域ajax的请求方式
              - "GET"
              - "POST"
              - "DELETE"
              - "PUT"
              - "OPTIONS"
            allowedHeaders: "*" # 允许在请求中携带的头信息
            allowCredentials: true # 是否允许携带cookie
            maxAge: 360000 # 这次跨域检测的有效期

gatewey基本用法完成

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

SpringCloud组件之Gateway网关详细教程 的相关文章

随机推荐

  • (深度学习)PyCharm 连接配置服务器

    需要 Pycharm 专业版 以 2022 版的 PyCharm 为例 1 连接服务器 File Settings Python Interpreter Add Interpreter On SSH 输入服务器的 Host Port 和 U
  • 为什么python适合写爬虫?

    1 抓取网页本身的接口 相比与其他静态编程语言 如java c C python抓取网页文档的接口更简洁 相比其他动态脚本语言 如perl shell python的urllib2包提供了较为完整的访问网页文档的API 当然ruby也是很好
  • 浅谈人工智能设备的硬件与软件

    人工智能时代的到来 使人们从很多繁重复杂的各种工作中得以释放 而背后的设备主要有硬件和软件来组成 硬件是构成人工智能设备的基础 软件则是充分挖掘硬件潜力的工具 硬件设计的标准化与规范化 以及其版本更改的高成本性 从而突出了软件易修改和深体验
  • 从0搭建夜莺v6基础监控告警系统(二):采集数据、打通夜莺显示

    文章目录 1 写在前面 1 1 categraf 采集数据 1 2 官方文档传送门 2 配置过程 2 1 打通夜莺和 VictoriaMetrics 2 2 配置 Categraf 2 3 验证结果 2 4 配置仪表盘 3 部署总结 3 1
  • C++ shared_ptr实现

    一 一些说明 1 智能指针用于资源管理 为了保证资源的操作得到顺利的执行防止资源泄露 因此大多数实现都以noexcept在参数列表后声明为不抛出异常 2 对于有些明确不需要更改调用对象内容的成员函数 用const在参数列表后修饰 常量成员函
  • Session(会话)

    1 2 1 原理 1 session是服务器端的技术 2 session是基于cookie技术的 1 2 2 session操作 1 默认情况下 会话不会自动开启 通过session start 开启会话 2 通过session id 获取
  • c# attribute

    C 中的Attribute 目录 什么是Attribute 深入讨论Attribute 实现自己的Attribute时需要注意的一些问题 一 什么是Attribute 先看下面的三段代码 自定义Attribute类 VersionAttri
  • MIT 6.S965 韩松课程 05

    Lecture 05 Quantization Part 1 文章目录 Lecture 05 Quantization Part 1 动机 数字的数据类型 整数 定点数 浮点数 量化 基于 K Means 的量化 Han et al ICL
  • 更换jdk引发的惨案

    eclipse ini 第一行加入 vm E Java jdk1 7 0 17 bin javaw exe
  • ROS诸多调试工具总结1

    ROS有许多调试工具来为ROS调试你的工具 1 rosnode 参数 用法 作用 list rosnode list 查看当前运行了哪些节点 info rosnode info node name 查看该节点发布 接受哪些话题以及服务 ki
  • Unity——第一/三人称控制器的使用

    每日一句 恰似人间惊鸿客 墨染星辰云水间 第一人称控制器 MainCamera PlayerCapsule PlayFollowCamera gt 相机跟随 PlayerCameraRoot 第三人称控制器 PlayerArmature M
  • academic disqualification怎么办?求真带你解除危机

    academic disqualification怎么办 因为GPA低 严重或多次学术违纪等原因被美国大学开除 失去美国学生身份 是很多留学生最不愿意看到的留学结果 一旦遭遇美国大学停学或者开除 大家一定要重视起来 不能放任自己的身份 黑
  • 海思3559A上编译libyuv源码操作步骤

    1 下载libyuv源代码 执行 git clone https chromium googlesource com libyuv libyuv 2 通过CMakeLists txt编译生成库 build sh脚本内容如下 cmake DC
  • Java学习笔记之“比较字符串”

    本文为在How2j的学习总结 只代表个人见解 如有不妥 望指出以便更正 问题描述 创建一个长度是1000的字符串数组 使用长度是2的随机字符填充该字符串数组 统计这个字符串数组里重复的字符串有多少种 注 需要去除重复次数大于2的情况 pac
  • 热门的四款RK3399系列板卡产品大PK-谁是当家花旦?

    热门的四款RK3399系列板卡产品大PK 谁是当家花旦 大家好 我是资深嵌入式爱好者老李 今天来给大家推荐市场上六款 性能超凡 的RK3399板子 哪一款是当家花旦 你最喜爱哪一款 欢迎留言 主控芯片 Rockchip RK3399 CPU
  • 转: angularjs学习总结(~~很详细的教程)

    1 前言 前端技术的发展是如此之快 各种优秀技术 优秀框架的出现简直让人目不暇接 紧跟时代潮流 学习掌握新知识自然是不敢怠慢 AngularJS是google在维护 其在国外已经十分火热 可是国内的使用情况却有不小的差距 参考文献 网络文章
  • 运算符之比较运算符和逻辑运算符

    1 比较运算符 是两个数据之间进行比较的运算 运算结果都是布尔值true和false 赋值运算符包括 比较符号两边数据是否相等 相等结果是true lt 比较符号左边的数据是否小于右边的数据 如果小于结果是true gt 比较符号左边的数据
  • method:com.alibaba.druid.pool.DruidAbstractDataSource.testConnectionInternal问题解决

    目录 1 问题复现 2 问题分析 3 解决问题 如何禁用 Ping Method 4 禁用 Ping Method的后果 5 两者之间的权宜之计 1 问题复现 ERROR 2023 07 23 18 03 03 427 method com
  • 为什么postman调接口不会跨域而浏览器会

    为什么postman调接口不会跨域而浏览器会 都在说跨域 为什么postman能访问接口 而浏览器就不行呢 这里需要理解什么是跨域 跨域是指的当前资源访问其他资源时发起的http请求由于安全原因 由于同源策略 域名 协议 端口中只要有一个不
  • SpringCloud组件之Gateway网关详细教程

    目录 一 概念 1 1 什么是微服务网关 1 2 为什么需要使用网关 网关的作用 1 3网关的好处 二 Gateway网关的快速入门 1 快速创建 2 网关路由的流程 3 Gateway断言工厂 predicates 4 gateway过滤