SpringCloud之服务网关Gateway组件使用——详解

news2024/12/25 1:37:23

目录

一、网关介绍

1.什么是服务网关

2. 为什么需要网关

 3.网关组件在微服务中架构

二、服务网关组件

1.  zuul 1.x 2.x(netflix 组件)

1.1 zuul版本说明

2. gateway (spring)

2.1 特性

 2.2 开发网关动态路由

 2.2.1.创建项目引入网关依赖

2.2.2 快捷方式配置路由 

2.2.3  启动gateway网关项目 直接启动报错:

2.2.4. 测试网关路由转发

2.3 java方式配置路由

2.4 查看网关路由规则列表

2.5 配置路由服务负载均衡

 2.6 常用路由predicate(断言,验证)

2.7 常用的Filter以及自定义filter

 ​编辑使用内置过滤器

使用自定义filter 


一、网关介绍

1.什么是服务网关

说明
网关统一服务入口,可方便实现对平台众多服务接口进行管控,对访问服务的身份认证、防报文重放与防数据篡改、功能调用的业务鉴权、响应数据的脱敏、流量与并发控制,甚至基于API调用的计量或者计费等等。
网关 =  路由转发 + 过滤器
    `路由转发:接收一切外界请求,转发到后端的微服务上去;
    `在服务网关中可以完成一系列的横切功能,例如权限校验、限流以及监控等,这些都可以通过过滤器完成

2. 为什么需要网关

1.网关可以实现服务的统一管理

 2.网关可以解决微服务中通用代码的冗余问题(如权限控制,流量监控,限流等)

 3.网关组件在微服务中架构

 

二、服务网关组件

1.  zuul 1.x 2.x(netflix 组件)

    Zuul is the front door for all requests from devices and web sites to the backend of the Netflix streaming application. As an edge service application, Zuul is built to enable dynamic routing, monitoring, resiliency and security.

原文翻译
https://github.com/Netflix/zuul/wiki
zuul是从设备和网站到Netflix流媒体应用程序后端的所有请求的前门。作为一个边缘服务应用程序,zul被构建为支持动态路由、监视、弹性和安全性。

1.1 zuul版本说明


- 目前zuul组件已经从1.0更新到2.0,但是作为springcloud官方不再推荐使用zuul2.0,但是依然支持zuul2.

2. gateway (spring)

This project provides a library for building an API Gateway on top of Spring MVC. Spring Cloud Gateway aims to provide a simple, yet effective way to route to APIs and provide cross cutting concerns to them such as: security, monitoring/metrics, and resiliency.

原文翻译
https://spring.io/projects/spring-cloud-gateway
这个项目提供了一个在springmvc之上构建API网关的库。springcloudgateway旨在提供一种简单而有效的方法来路由到api,并为api提供横切关注点,比如:安全性、监控/度量和弹性。

2.1 特性


基于springboot2.x 和 spring webFlux 和 Reactor 构建 响应式异步非阻塞IO模型
动态路由
请求过滤

 2.2 开发网关动态路由

网关配置有两种方式一种是快捷方式(Java代码编写网关),一种是完全展开方式(配置文件方式)[推荐]

 2.2.1.创建项目引入网关依赖
<!--引入gateway网关依赖-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
2.2.2 快捷方式配置路由 

编写网关配置

spring:
  application:
    name: gateway
  cloud:
    consul:
      host: localhost
      port: 8500
    gateway:
      routes:
        - id: user_route							# 指定路由唯一标识
          uri: http://localhost:9999/ # 指定路由服务的地址
          predicates:
            - Path=/user/**					  # 指定路由规则

        - id: product_route
          uri: http://localhost:9998/
          predicates:
            - Path=/product/**
server:
  port: 8989
2.2.3  启动gateway网关项目 直接启动报错:

 

 在启动日志中发现,gateway为了效率使用webflux进行异步非阻塞模型的实现,因此和原来的web包冲突,去掉原来的web即可

 再次启动成功启动

2.2.4. 测试网关路由转发

- 测试通过网关访问用户服务: http://localhost:8989/user/findOne?productId=21
- 测试通过网关访问商品服务: http://localhost:8989/product/findOne?productId=1

2.3 java方式配置路由

@Configuration
public class GatewayConfig {
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("order_route", r -> r.path("/order/**")
                        .uri("http://localhost:9997"))
                .build();
    }
}

2.4 查看网关路由规则列表

1.说明
gateway提供路由访问规则列表的web界面,但是默认是关闭的,如果想要查看服务路由规则可以在配置文件中开启

management:
  endpoints:
    web:
      exposure:
        include: "*"   #开启所有web端点暴露

 - 访问路由管理列表地址
- http://localhost:8989/actuator/gateway/routes

2.5 配置路由服务负载均衡

1.说明
 现有路由配置方式,都是基于服务地址写死的路由转发,能不能根据服务名称进行路由转发同时实现负载均衡的呢?

2.动态路由以及负载均衡转发配置

spring:
  application:
    name: gateway
  cloud:
    consul:
      host: localhost
      port: 8500
    gateway:
      routes:
        - id: user_route
          #uri: http://localhost:9999/
          uri: lb://users							# lb代表转发后台服务使用负载均衡,users代表服务注册中心上的服务名
          predicates:
            - Path=/user/**

        - id: product_route
          #uri: http://localhost:9998/
          uri: lb://products          # lb(loadbalance)代表负载均衡转发路由
          predicates:
            - Path=/product/**
      discovery:
        locator:
          enabled: true 							#开启根据服务名动态获取路由

 2.6 常用路由predicate(断言,验证)

1.Gateway支持多种方式的predicate

- After=2020-07-21T11:33:33.993+08:00[Asia/Shanghai]  			`指定日期之后的请求进行路由
- Before=2020-07-21T11:33:33.993+08:00[Asia/Shanghai]       `指定日期之前的请求进行路由
- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]
- Cookie=username,chenyn																		`基于指定cookie的请求进行路由
- Cookie=username,[A-Za-z0-9]+															`基于指定cookie的请求进行路由	
	`curl http://localhost:8989/user/findAll --cookie "username=zhangsna"
- Header=X-Request-Id, \d+																 ``基于请求头中的指定属性的正则匹配路由(这里全是整数)
	`curl http://localhost:8989/user/findAll -H "X-Request-Id:11"
- Method=GET,POST																						 `基于指定的请求方式请求进行路由

- 官方更多: https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.3.RELEASE/reference/html/#the-cookie-route-predicate-factory

2.使用predicate

spring:
  application:
    name: gateway
  cloud:
    consul:
      host: localhost
      port: 8500
    gateway:
      routes:
        - id: user_route
          #uri: http://localhost:9999/
          uri: lb://users
          predicates:
            - Path=/user/**
            - After=2020-07-21T11:39:33.993+08:00[Asia/Shanghai]
            - Cookie=username,[A-Za-z0-9]+
            -  Header=X-Request-Id, \d+

2.7 常用的Filter以及自定义filter

Route filters allow the modification of the incoming HTTP request or outgoing HTTP response in some manner. Route filters are scoped to a particular route. Spring Cloud Gateway includes many built-in GatewayFilter Factories.

1.- 官网: 
    https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.3.RELEASE/reference/html/#gatewayfilter-factories
    
路由过滤器允许以某种方式修改传入的HTTP请求或传出的HTTP响应。路由筛选器的作用域是特定路由。springcloudgateway包括许多内置的GatewayFilter工厂。

2.作用
当我们有很多个服务时,比如下图中的user-service、order-service、product-service等服务,客户端请求各个服务的Api时,每个服务都需要做相同的事情,比如鉴权、限流、日志输出等。

 使用内置过滤器

- AddRequestHeader=X-Request-red, blue						`增加请求头的filter`
- AddRequestParameter=red, blue										`增加请求参数的filterr`
- AddResponseHeader=X-Response-Red, AAA						`增加响应头filter`
- PrefixPath=/emp																	`增加前缀的filter`
- StripPrefix=2	
使用自定义filter 
@Configuration
@Slf4j
public class CustomGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("进入自定义的filter");
        if(exchange.getRequest().getQueryParams().get("username")!=null){
            log.info("用户身份信息合法,放行请求继续执行!!!");
            return chain.filter(exchange);
        }
        log.info("非法用户,拒绝访问!!!");
       return exchange.getResponse().setComplete();
    }

    @Override
    public int getOrder() {
        return -1;
    }
}

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

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

相关文章

C++学习——类和对象(上)

C学习——类和对象 一、面向对象和面向过程的初步认识二、什么是类 一、面向对象和面向过程的初步认识 我们之前学习了C语言&#xff0c;我们知道 ① C语言&#xff1a;C语言是一门面向过程的语言&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函…

Web安全之SQL注入:明明设置了强密码,为什么还会被别人登录?

一、背景 让我们先来看一个案例。某天&#xff0c;当你在查看应用的管理后台时&#xff0c;发现有很多异常的操作。接着&#xff0c;你很快反应过来了&#xff0c;这应该是黑客成功登录了管理员账户。于是&#xff0c;你立刻找到管理员&#xff0c;问他是不是设置了弱密码。管…

jenkins 代码执行 (CVE-2017-1000353)漏洞复现

jenkins 代码执行 (CVE-2017-1000353)漏洞复现 名称: jenkins 代码执行 &#xff08;CVE-2017-1000353&#xff09; 描述: ​Jenkins 可以通过其网页界面轻松设置和配置,其中包括即时错误检查和内置帮助。 插件 通过更新中心中的 1000 多个插件,Jenkins 集成了持续集成和持续…

分享一套MES源码,可以直接拿来搞钱的好项目

目前国内智能制造如火如荼&#xff0c;工厂信息化、数字化是大趋势。如果找到一个工厂&#xff0c;搞定一个老板&#xff0c;搞软件的朋友就能吃几年。 中国制造业发达&#xff0c;工厂林立&#xff0c;但是普遍效率不高&#xff0c;需要信息化提高效率。但是矛盾的地方在于&a…

删除链表的倒数第N个节点,剑指offerII(21),力扣

目录 题目地址&#xff1a; 题目&#xff1a; 相似类型题&#xff1a; 我们直接看本题题解吧&#xff1a; 解题方法&#xff1a; 难度分析&#xff1a; 解题分析&#xff1a; 解题思路&#xff08;双指针&#xff09;&#xff1a; 代码实现&#xff1a; 代码说明&#xff1a; 代…

算法训练 第九周

一、移动零 1.双指针 我们可以设定两个指针i和j&#xff0c;其中i用来遍历整个数组&#xff0c;j用来遍历存放不为零的数的位置&#xff0c;当nums[i]不等于零时&#xff0c;就让nums[i]和nums[j]进行交换&#xff0c;然后j,当我们遍历完整个数组之后就完成了操作&#xff0c;…

基于Python的网络爬虫设计与实现

基于Python的网络爬虫设计与实现 摘要&#xff1a;从互联网时代开始&#xff0c;网络搜索引擎就变得越发重要。大数据时代&#xff0c;一般的网络搜索引擎不能满足用户的具体需求&#xff0c;人们更加注重特定信息的搜索效率&#xff0c;网络爬虫技术应运而生。本设计先对指定…

初识Linux(2).妈妈再也不用担心我Linux找不到门了。

文章目录 前言 1.man指令&#xff08;重要&#xff09;&#xff1a;例如&#xff1a; 2.cp指令&#xff08;重要&#xff09;&#xff1a;例如&#xff1a;把123.txt复制到a目录中类似window如下操作&#xff1a; 3.mv例如&#xff1a;类似window如下操作&#xff1a; 4.nano例…

Mysql快速查找用逗号分割的列中含有某个字符的行:FIND_IN_SET

看标题比较绕口&#xff0c;但是我举一个例子你就清楚了 这是一个查询&#xff1a;我现在想要的是attr_val中含有黑色属性的行&#xff1a; 你用模糊匹配可以&#xff0c;用REGEXP也行&#xff0c;下面介绍一种mysql自带的函数&#xff1a;FIND_IN_SET。它的用法是&#xff1a…

深度学习之基于百度飞桨PaddleOCR图像字符检测识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介主要特点使用步骤 二、功能三、系统四. 总结 一项目简介 # Introduction to PaddleOCR Image Character Detection and Recognition System Based on Baidu…

干货分享 | TSMaster采样点配置方法与消除错误帧流程

当通讯节点间采样点参数和波特率参数不匹配造成一些错误帧时&#xff0c;我们如何在TSMaster中设置以及调整波特率参数和采样点参数&#xff0c;来减少以及消除总线上出现的错误帧&#xff0c;进一步提高通信质量。本文着重讲解讲解如何借用TSmaster更加便捷地获取相应的采样点…

nodejs669在线图书借阅管理系统vue前端

系统的设计与实现主要实现角色有管理员和用户,管理员在后台管理用户模块、用户表模块、图书借阅模块、图书归还模块、图书分类模块、token表模块、收藏表模块、书籍信息模块、图书资讯模块、留言板模块、书籍信息评论表模块、注册用户模块、配置文件模块、处罚记录模块、在线客…

Linux中执行java命令报错:cannot execute binary file: Exec format error

网上很多文章 都是说操作系统和JDK&#xff0c;32位和64位不兼容问题 当你非常确定你的操作系统是64位&#xff0c;并且JDK也是64位的时候 或者非常确定你的操作系统是32位&#xff0c;并且JDK也是32位的时候 怎么办&#xff1f; 使用以下命令&#xff0c;查看你的操作系统…

浏览器兼容性问题及其解决方案

一、认识浏览器 四大内核&#xff1a; Blink、Gecko、WebKit、Trident (不再活跃) 主流浏览器&#xff1a; IE(Trident内核)、Firefox(火狐&#xff1a;Gecko内核)、Safari(苹果&#xff1a;webkit内核)、Google Chrome(谷歌&#xff1a;Blink内核)、Opera(欧朋&#xff1a;B…

2023年通过已经认证的微信公众号注册微信小程序

登录已经认证的微信公众号 注册完成后&#xff0c;打开微信公众平台的网址&#xff0c;用账号密码的方式登录

BEVDepth: Acquisition of Reliable Depth for Multi-View 3D Object Detection 论文阅读

论文链接 BEVDepth: Acquisition of Reliable Depth for Multi-View 3D Object Detection 0. Abstract 提出了一种新的 3D 物体检测器&#xff0c;具有值得信赖的深度估计&#xff0c;称为 BEVDepth&#xff0c;用于基于相机的鸟瞰 (BEV) 3D 物体检测BEVDepth通过利用显式深…

Python之基础语法和六大数据类型

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

VMware虚机重启后静态IP不生效

配置好一套虚机之后&#xff0c;因为重启电脑&#xff0c;导致虚机的静态ip配置不生效&#xff0c;xshell连接不上虚机。以下是自查和解决方案&#xff1a; 1.使用su -进入root用户 2.查看打开虚机的teminal窗口查看配置的ip文件&#xff1a;vim /etc/sysconfig/network-script…

初始化的内容写到析构函数中。。。。。。。

大概是&#xff0c;把应该在构造函数中初始化的堆栈窗体代码写到了析构函数中。。。。 不是因为没掌握构造/析构&#xff0c;而是。。。。 检查了四十多分钟没检查出来。。 被自己蠢哭。 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) { }…

初探HarmonyOS路由跳转

最近的鸿蒙新闻也是很大声势&#xff0c;鸿蒙的纯血版一出&#xff0c;各大互联网大厂都坐不住了&#xff0c;纷纷加入其中。这意味鸿蒙将来会取代大部分Android用户&#xff0c;这也是程序员的一篇大好前程。如今的Android开发行业已经夕阳西下了。 网上有关HarmonyOS的资料几…