微服务-- Gateway服务网关

news2024/11/16 8:26:32

Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。

为什么需要网关

在微服务架构中,网关(Gateway)作为统一入口,承担着多个关键角色。

核心功能特性

  • 请求路由:网关根据请求的路径、方法和其他参数,将请求路由到相应的微服务实例。这种集中管理的方式简化了客户端与多个微服务之间的交互。
  • 权限控制:网关可以实现用户身份验证和授权,确保只有经过授权的用户才能访问特定的服务。这提供了一个安全层,保护后端服务不受未授权访问。
  • 限流:为了防止系统过载,网关可以设置请求限制,以控制流量。例如,可以限制每秒的请求数量,确保服务的稳定性和可靠性。

架构图:

权限控制:

  • 网关负责校验用户请求的资格,确保只有经过身份验证和授权的用户才能访问特定的微服务。如果未授权,网关将拦截请求并返回相应的错误信息。

路由和负载均衡:

  • 所有请求都必须经过网关,网关根据预设的规则将请求转发到合适的微服务。这一过程称为路由。
  • 当多个服务实例可用时,网关还需要执行负载均衡,以分散流量并提高系统的可用性和响应速度。

限流:

  • 在高流量情况下,网关通过限制请求速率来保护后端服务,确保它们不会因过载而崩溃。这通常基于下游服务的处理能力进行调整,以平衡请求流量。

Spring Cloud中的网关实现

Zuul:

  • 类型:基于Servlet的阻塞式编程。
  • 特点:提供路由、负载均衡和过滤功能,但由于其阻塞特性,在高并发场景下可能会导致性能瓶颈。
  • 适用场景:适合简单的微服务应用,但在对性能要求较高的情况下可能不够理想。

Spring Cloud Gateway:

  • 类型:基于Spring 5中提供的WebFlux,响应式编程。
  • 特点:具备更好的性能,能够处理更多的并发请求,支持非阻塞IO。提供了更灵活的路由和过滤功能,并且集成了Spring生态中的其他组件。
  • 适用场景:适合需要高性能、高并发的微服务架构,是现代微服务应用的推荐选择。

gateway快速入门

第一步:添加依赖

        <!-- 不可以引入spring-boot-starter-web会有冲突 -->
        <!--网关-->
        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-gateway -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
            <version>4.1.0</version>
        </dependency>

第二步:配置好注册中心[按照Eureka、zookeeper、nacos客户端配置即可]

第三步:编写properties

# 服务端口
server.port=8082

# 服务名称
spring.application.name=service2

# Nacos 服务地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

# 启用 Sentinel,并连接 Sentinel Dashboard
spring.cloud.sentinel.transport.dashboard=127.0.0.1:8080
spring.cloud.sentinel.transport.port=8720  # 本地 Sentinel 客户端的监控端口
# 启用 Sentinel
spring.cloud.sentinel.enabled=true

# 网关配置
# 定义路由的唯一标识符
spring.cloud.gateway.routes[0].id=route_to_service2
# 设置目标服务的URI
spring.cloud.gateway.routes[0].uri=http://localhost:8082
# 配置路由的断言,这里指定路径匹配规则
spring.cloud.gateway.routes[0].predicates[0]=Path=/service2/**

启动网关服务

然后可以通过访问如下 URL 来测试路由功能:

http://localhost:8082/service2/test

网关路由的流程图

整个访问的流程如下:

断言工厂

在 Spring Cloud Gateway 中,断言工厂(Predicate Factory)用于定义请求路由的条件。它们通过处理配置文件中的字符串,来决定哪些请求应该被转发到具体的服务。

常用断言工厂

名称说明示例
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请求必须包含某些 cookieCookie=chocolate, ch.p
Header请求必须包含某些 headerHeader=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权重处理

使用示例

以 Path 断言工厂为例,假设我们希望将所有访问 /user/** 的请求转发到某个服务,可以在 application.properties 文件中这样配置: 

spring.cloud.gateway.routes[0].id=user_route
spring.cloud.gateway.routes[0].uri=http://localhost:8080
spring.cloud.gateway.routes[0].predicates[0]=Path=/user/**

虽然有多种断言工厂可供使用,但熟悉 Path 断言工厂通常足以应对大多数路由需求。

过滤器工厂

GatewayFilter 是 Spring Cloud Gateway 提供的一种机制,用于处理进入网关的请求以及微服务返回的响应。

路由过滤器的种类

Spring 提供了多种路由过滤器工厂,常用的包括:

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

请求头过滤器示例

以 AddRequestHeader 为例,假设我们的需求是给所有进入 userservice 的请求添加一个请求头:Truth=Itcast is freaking awesome!。可以在 application.yml 文件中这样配置:

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

通过这种方式,该过滤器仅对访问 userservice 的请求生效。

默认过滤器

如果希望某个过滤器对所有路由都生效,可以将过滤器配置在 default-filters 下:

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

总结

过滤器的作用是什么?

  • 对路由的请求或响应进行加工处理,例如添加请求头。
  • 配置在特定路由下的过滤器仅对该路由的请求生效。

default-filters 的作用是什么?

  • default-filters 中的过滤器会对所有路由生效。

全局过滤器

全局过滤器是 Spring Cloud Gateway 中的一种机制,用于对所有请求和响应进行统一的处理。与路由特定的过滤器不同,全局过滤器可以应用于网关中的所有路由,提供了一种集中管理请求和响应的方法。

全局过滤器作用

全局过滤器用于处理所有进入网关的请求和微服务响应,功能与GatewayFilter类似。不同之处在于GatewayFilter通过配置定义,其处理逻辑是固定的;而GlobalFilter的逻辑需要开发者自行编写代码实现。

实现方式是通过实现GlobalFilter接口:

public interface GlobalFilter {
    Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}

在filter方法中可以编写自定义逻辑,实现如下功能:

  • 登录状态判断
  • 权限校验
  • 请求限流等

自定义全局过滤器

需求

定义一个全局过滤器,拦截请求,判断请求参数是否符合以下条件:

  1. 参数中是否有authorization
  2. authorization参数值是否为admin
  3. 如果满足这两个条件,则放行;否则拦截请求。

实现

在网关中定义一个过滤器:

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.util.MultiValueMap;
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();
    }
}

过滤器执行顺序

请求进入网关后,会经过三类过滤器:

  1. 当前路由的过滤器
  2. DefaultFilter
  3. GlobalFilter

请求路由后,会将这些过滤器合并成一个过滤器链,并按照顺序依次执行。

排序规则

  • 每个过滤器必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前。
  • GlobalFilter通过实现Ordered接口或使用@Order注解来指定order值。
  • 路由过滤器和defaultFilter的order由Spring自动指定,默认按声明顺序递增。
  • 当多个过滤器的order值相同时,执行顺序为:defaultFilter > 路由过滤器 > GlobalFilter。

更多详细内容,可查看源码:

  • org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#getFilters()方法加载defaultFilters和路由的filters并进行合并。
  • org.springframework.cloud.gateway.handler.FilteringWebHandler#handle()方法加载全局过滤器,与前面的过滤器合并后根据order排序,组织过滤器链。

跨域问题

什么是跨域问题

跨域指的是在不同的域名、端口或协议之间进行请求。具体包括以下几种情况:

  • 域名不同:例如 www.taobao.com 与 www.taobao.org,以及 www.jd.com 和 miaosha.jd.com。
  • 端口不同:例如 localhost:8080 和 localhost:8081。
  • 协议不同:例如 http:// 与 https://。

跨域问题是指浏览器出于安全考虑,禁止发起来自不同域的 AJAX 请求,因此请求会被浏览器拦截。

解决方案:CORS(跨域资源共享),可以参考阮一峰的网络日志了解更多。

解决跨域问题

在 Gateway 服务的 application.yml 文件中,添加以下配置,以实现全局的跨域处理:

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 # 这次跨域检测的有效期

总结

通过配置 CORS,可以有效解决跨域请求的问题,使得不同源之间的 AJAX 请求能够顺利进行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2169100.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从0开始linux(5)——vim

欢迎来到博主的专栏&#xff1a;从0开始linux 博主ID&#xff1a;代码小豪 文章目录 vim的多种模式底行模式命令命令模式视块模式&#xff08;visual block&#xff09; vim的配置 vim是linux系统的文本编辑器。就像windows的记事本一样。 使用vim指令可以使用vim打开一个文本文…

MacOS多桌面调度快捷键

单桌面调度快捷键 可能是我用着妙控鼠标用着不习惯&#xff0c;所以追求快捷键操作&#xff0c;看起来也比较酷。而且在Windows上&#xff0c;我基本不使用多桌面&#xff0c;但是看着同事用Mac的多桌面用的飞起&#xff0c;炫酷程度不亚于win7的Windows键Tab。在不使用多桌面的…

小川科技携手阿里云数据库MongoDB:数据赋能企业构建年轻娱乐生态

随着信息技术的飞速发展&#xff0c;企业在处理海量数据时所面临的挑战日益严峻。特别是在年轻娱乐领域&#xff0c;用户行为的多样性和数据量的激增对数据存储与分析技术提出了更高的要求。在此背景下&#xff0c;小川凭借其前瞻性的技术视野&#xff0c;选择了MongoDB作为其数…

乒乓buffer(国科微笔试填空)_2024年9月26日

乒乓buffer是否提高了并行度&#xff1f;是 流水线式处理&#xff0c;提高并行度 位宽为4&#xff0c;深度为8的sram&#xff1a; 当sel拉高时&#xff0c;a、b模块在wren和rden有效时分别写和读&#xff1b;当sel拉低时&#xff0c;a、b模块在rdenwren有效时分别读和写

远程访问软路由

远程访问软路由主要涉及通过互联网从远程位置访问和控制基于软件的路由器系统。以下是远程访问软路由的一般方法&#xff1a; 一、远程访问软路由的方法 通过Web管理界面访问&#xff1a; 适用于大多数支持Web管理的软路由系统。用户只需在浏览器中输入软路由的公网IP地址或域…

【C语言】手把手带你拿捏指针(完)(指针笔试、面试题解析)

文章目录 一、sizeof和strlen的对⽐1.sizeof2.strlen3.sizeof与strlen对比 二、数组和指针笔试解析1.一维数组2.字符、字符串数组和字符指针代码1代码2代码3代码4代码5代码6 3.二维数组4.总结 三、指针运算笔试题解析代码1代码2代码3代码4代码5代码6 一、sizeof和strlen的对⽐ …

freeRDP OPenssl

libusb需要下载 我使用的是VS2019编译 所以需要include 与vs2019 在cmake里面修改路径 C:/Users/JPM/source/repos/freeRDP/FreeRDP-stable-2.0/libusb-1.0.24/include/libusb-1.0 C:/Users/JPM/source/repos/freeRDP/FreeRDP-stable-2.0/libusb-1.0.24/VS2019/MS64/static/l…

【中级通信工程师】终端与业务(四):通信产品

【零基础3天通关中级通信工程师】 终端与业务(四)&#xff1a;通信产品 本文是中级通信工程师考试《终端与业务》科目第四章《通信产品》的复习资料和真题汇总。终端与业务是通信考试里最简单的科目&#xff0c;有效复习通过率可达90%以上&#xff0c;本文结合了高频考点和近几…

计算机毕业设计PySpark+Django深度学习游戏推荐系统 游戏可视化 游戏数据分析 游戏爬虫 Scrapy 机器学习 人工智能 大数据毕设

本论文的主要研究内容如下&#xff1a; 了解基于Spark的TapTap游戏数据分析系统的基本架构&#xff0c;掌握系统的开发方法&#xff0c;包括系统开发基本流程、开发环境的搭建、测试与运行等。 主要功能如下&#xff1a; &#xff08;1&#xff09;用户管理模块&#xff1a;…

OpenCV图像文件读写(5)从文件系统中读取图像的标准函数imread()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 从文件加载图像。 imread 函数从指定的文件加载图像并返回它。如果图像无法读取&#xff08;因为文件缺失、权限不当、格式不受支持或无效&…

IDEA使用技巧和插件推荐

作为专业开发人员&#xff0c;选择一个强大的集成开发环境&#xff08;IDE&#xff09;是至关重要的。IntelliJ IDEA&#xff08;简称IDEA&#xff09;不仅功能丰富&#xff0c;而且操作便捷&#xff0c;是众多开发者的首选。本文将分享一些使用IDEA的技巧&#xff0c;以及推荐…

测试部署单副本 oceanbase-3.2.4.1 企业版

由于项目需要&#xff0c;测试部署单副本 oceanbase-3.2.4.1 企业版 1.安装前提 准备4cpu,12G内存,100G磁盘 统为centos7.9 yum install -y yum-utils wget net-tools tree yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repo 2.创建用…

SLF4J报错log4j又报错

项目场景&#xff1a; 搭建一个spirngboot项目&#xff0c;启动运行时&#xff0c;SLF4J报错 解决后 ~ log4j又报错了。 问题描述 首先是SLF4J报错了&#xff0c;解决完SL4J报错问题后&#xff0c;再次启动项目&#xff0c;log4j又报错了 。。。 报错信息&#xff1a; SLF4J…

IDEA Dependency Analyzer 分析 maven 项目包的依赖

一、场景分析 javax.validation 是我们 SpringMVC 常用的数据校验框架。但是 javax.validation 是一个规范&#xff08;Java Bean Validation&#xff0c;简称 JSR 380&#xff09;&#xff0c;它并没有具体的实现&#xff0c;它的常用实现&#xff0c;是hibernate-validator。…

【知了社保-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

CentOs-Stream-9 解决此系统未向授权服务器注册问题

RPM包注册安装问题 无法执行yum安装rpm问题(后面安装Mysql会遇到)&#xff1a;This system is not registered with an entitlement server. You can use "rhc" or "subscription-manager" to register. Mysql5.7本地无法注册&#xff1a; Mysql8本地无法…

EtherNET IP 转 Profinet 网关:工业通信的桥梁

在工业自动化领域&#xff0c;不同设备之间的通信协议兼容性是一个关键问题。EtherNET IP 和 Profinet 作为两种常用的工业以太网协议&#xff0c;各自在不同的设备和系统中广泛应用。而 EtherNET IP 转 Profinet 网关则成为了连接这两个不同协议世界的桥梁&#xff0c;发挥着至…

OJ在线评测系统 后端 用策略模式优化判题机架构

判题机架构优化(策略模式) 思考 我们的判题策略可能会有很多种 比如 我们的代码沙箱本身执行程序需要消耗时间 这个时间可能不同的编程语言是不同的 比如沙箱执行Java要额外花费2秒 我们可以采用策略模式 针对不同的情况 定义不同独立的策略 而不是把所有情况全部放在一个i…

【Mysql】数据库系统和Mysql

1、数据库系统 数据库&#xff08;Database&#xff09;是一个以某种组织方式存储在磁盘上的数据当代集合。 2、数据库应用 数据库应用系统是指基于数据库的应用软件。 3、数据库管理系统&#xff08;数据库软件&#xff09; &#xff08;1&#xff09;关系型数据库&#…

【JAVA高级】 redis分布式双重加锁(业务校验:防止接口并发调用时数据重复)

文章目录 此问题的考虑思路使用Redis的key-value锁的基本思路结合Redis数据结构实现避免重复注意事项实现代码只避免 name和age的重复避免 name和age的和age和sex重复&#xff1a;使用双重的分布式锁实现&#xff1a; 背景&#xff1a;在日常开发过程中&#xff0c;遇到了一个需…