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

目录

一、网关介绍

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: gatewaycloud:consul:host: localhostport: 8500gateway:routes:- id: user_route							# 指定路由唯一标识uri: http://localhost:9999/ # 指定路由服务的地址predicates:- Path=/user/**					  # 指定路由规则- id: product_routeuri: 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 {@Beanpublic 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: gatewaycloud:consul:host: localhostport: 8500gateway: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: gatewaycloud:consul:host: localhostport: 8500gateway:routes:- id: user_route#uri: http://localhost:9999/uri: lb://userspredicates:- 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 {@Overridepublic 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();}@Overridepublic int getOrder() {return -1;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫入门:如何设置代理IP进行网络爬取

目录 前言 一、获取代理IP 1.1 获取免费代理IP 1.2 验证代理IP 二、设置代理IP 三、使用代理IP进行网络爬取 四、总结 前言 在进行网络爬取时&#xff0c;经常会遇到一些反爬虫的措施&#xff0c;比如IP封锁、限制访问频率等。为了解决这些问题&#xff0c;我们可以使用…

day66

今日回顾内容 web框架 django 路由控制 视图层 web框架 一、什么是web框架 Web框架&#xff08;Web framework&#xff09;是一种开发框架&#xff0c;用来支持动态网站、网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式&#xff0c;也为web行…

人机交互2——任务型多轮对话的控制和生成

1.自然语言理解模块 2.对话管理模块 3.自然语言生成模块

LFM信号分析

LFM信号 在时域中&#xff0c;理想线性调频信号持续时间为 T T T 秒&#xff0c;振幅为一常量&#xff0c;中心频率为 f c e n t e r f_{center} fcenter​ &#xff0c;相位 θ ( t ) \theta(t) θ(t) 随时间按一定规律变化。当 f c e n t e r f_{center} fcenter​ 为0时…

初识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例…

车内总线通信技术简述

1. 前言 本文主要分享一些汽车总线通信技术&#xff08;CAN、CANFD、LIN、Flex Ray、MOST、LVDS、TTP/C、Ethernet&#xff09;&#xff0c;希望对大家能有所帮助。 2. 多种汽车总线通信技术 2.1 CAN CAN&#xff08;Controller Area Network&#xff09;全称为“控制器局域…

leetcode:2549. 统计桌面上的不同数字(python3解法)

难度&#xff1a;简单 给你一个正整数 n &#xff0c;开始时&#xff0c;它放在桌面上。在 109 天内&#xff0c;每天都要执行下述步骤&#xff1a; 对于出现在桌面上的每个数字 x &#xff0c;找出符合 1 < i < n 且满足 x % i 1 的所有数字 i 。然后&#xff0c;将这些…

Python向Excel写入内容的方法大全

在数据处理和分析中&#xff0c;将Python中的数据写入Excel是一项常见任务。 本文将介绍几种常见的方法&#xff0c;以及如何使用它们向Excel中写入内容。 方法一&#xff1a;使用openpyxl库 openpyxl是一个功能强大的库&#xff0c;用于读写Excel文件。以下是一个简单的使用…

Git安装

简单粗暴&#xff0c;跟着步骤一步一步来 右键就会有了

高级/进阶”算法和数据结构书籍推荐

“高级/进阶”算法和数据结构书籍推荐《高级算法和数据结构》 高级算法和数据结构 为什么要选择本书 谈及为什么需要花时间学算法&#xff0c;我至少可以列举出三个很好的理由。 (1)性能&#xff1a;选择正确的算法可以显著提升应用程序的速度。仅就搜索来说&#xff0c;用二…

负索引和负方向

在python里有序集合的index位置信息可正可负&#xff0c;方向可以从左向右或从右向左。以“python”字符串通过list函数转化生成的列表为例&#xff0c;其正负位置信息index值如下所示&#xff1a; 0 1 2 3 4 5 p y t h o n -6 -5 -4 -3 -2 -1 故&#xff0c;切片的start、end、…

LabVIEWL实现鸟巢等大型结构健康监测

LabVIEWL实现鸟巢等大型结构健康监测 管理国家地震防备和减灾的政府机构中国地震局(CEA)选择了七座新建的巨型结构作为结构健康监测(SHM)技术的测试台。这些标志性建筑包括北京2008年夏季奥运会场馆&#xff08;包括北京国家体育场和北京国家游泳中心&#xff09;、上海104层的…