热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:springcloudgateway概念精讲

篇首语:本文由编程笔记#小编为大家整理,主要介绍了springcloudgateway概念精讲相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了springcloud gateway概念精讲相关的知识,希望对你有一定的参考价值。






一、定义

外部请求通过gateWay转发到后端微服务,网关一般提供如下功能


  1. 统一接入,路由转发
  2. 安全审查,校验鉴权
  3. 熔断降级,数据缓存
  4. 统一日志,全局监控

总的来说,gateway提供了一个入口来管控所有的微服务,基于这个特点可以灵活使用。


网关解决方案对比

nginx+lua 高性能反向代理服务器,一般作为负载均衡入口

Zuul是第一代网关,spring

cloud是第二代网关,基于Netty\\Reactor\\WebFLux构建


  • 性能强劲,zuul1.6倍
  • 功能强大,内置转发,监控,限流等功能

缺点


  • 不能再servlet容器下功能,不能使用war包

基础说明


  1. spring cloud gateway基于springBoot2.x系列,webflux,reactor等技术,传统的同步库都是不能使用的
  2. gateway底层依赖netty,不接受servlet容器或者war包

二、核心术语


Route路由

基础的转发规则,包含下面几部分,当predicate满足时则代表匹配


  • id
  • 目标url
  • predicate集合:满足条件才转发
  • filter集合:满足条件则过滤(改变请求)

Predicate谓词、断言

java.util.funcation.Predicate实现路由匹配条件,通过ServletWebExchange(封装了HTTP请求和相应)作为入参,来对request的各种属性(参考predicate的各种规则)做匹配。


Filter过滤器

修改请求及响应

gateway已经为了我们准备了各种过滤器工厂,我们也可以通过自定义过滤器


三、简单原理


  1. client发送请求给gateway,handlermapping判断请求路径是否匹配路由配置
  2. 如果匹配成功web handler会读取路由配置过滤器,把请求交给过滤器处理
  3. 过滤器如图是链式结构,分为pre和post处理

四、概念讲解


Route Predcate Factories

符合Predicate的条件,就使用该路由的配置,否则就不管。

https://www.imooc.com/article/290804


配置形式


模糊匹配和精确匹配

路由到指定URL

spring:
cloud:
gateway:
routes:
- id: {唯一标识}
uri: http://www.itmuch.com

表示访问 GATEWAY_URL/** 会转发到 http://www.itmuch.com/**
需要和predicate配合使用,满足条件则转发

spring:
cloud:
gateway:
routes:
- id: {唯一标识}
uri: http://www.itmuch.com/spring-cloud/spring-cloud-stream-pan-ta/

表示访问 GATEWAY_URL/spring-cloud/spring-cloud-stream-pan-ta/ 会转发到 http://www.itmuch.com/spring-cloud/spring-cloud-stream-pan-ta/


路由转发到微服务

路由到服务发现组件上的微服务

routes:
- id: user_route
uri: lb://user-center
predicates:
- Path=/users/**

浏览器访问 网关url时,http://localhost:8040/users/1会自动转发到user-center服务的接口,等同于访问http://localhost:9099/users/1


自定义predicate工厂

xxxxRoutePredicateFactory必须以这种形式结尾

routes:
- id: after_route
uri: lb://user-center
predicates:
# 当且仅当请求时的时间After配置的时间时,才会转发到用户微服务
# 目前配置不会进该路由配置,所以返回404
# 将时间改成 user-center/**
# eg. 访问http://localhost:8040/users/1 -> user-center/users/1
- After=2010-01-20T17:42:47.789-07:00[America/Denver]
- TimeBetween=00:00:00,12:44:13

@Data
public class TimeBetweenBean {
private String start;
private String end;
}


@Component
public class TimeBetweenRoutePredicateFactory
extends AbstractRoutePredicateFactory {
public TimeBetweenRoutePredicateFactory() {
super(TimeBetweenBean.class);
}
/**
* 谓词工厂的核心方法,控制路由的判断人条件
* @param config
* @return
*/
@Override
public Predicate apply(TimeBetweenBean config) {
String start = config.getStart();
String end = config.getEnd();
return serverWebExchange ->{
LocalTime now = LocalTime.now();
System.out.println(now.isAfter(LocalTime.parse(start)));
return now.isAfter(LocalTime.parse(start)) && now.isBefore(LocalTime.parse(end));
};
}
/**
* 控制配置类和配置文件映射关系,和配置文件顺序一致
* @return
*/
@Override
public List shortcutFieldOrder() {
return Arrays.asList("start","end");
}
}

动态路由-服务名称转发
面向服务的路由,支持整合EUREKA或者NACOS注册中心,根据serviceId自动从注册中心获取服务地址并转发请求。不需要给每个微服务都配置路由规则

discovery:
locator:
enabled: true # 开启从注册中心动态创建路由

例子:
http://localhost:8001/payment/get/1?uname=123
http://localhost:9527/cloud-payment-service/payment/get/1?uname=123


三、Filter


生命周期


  • Pre:转发请求之前
  • post:转发请求之后

gateway自带过滤器讲解


1. RewritePath 请求地址重定向

按照正则匹配上的路径重写为逗号后面的地址

pring:
cloud:
gateway:
routes:
- id: rewritepath_route
uri: https://example.org
predicates:
- Path=/red/**
filters:
- RewritePath=/red/?(?.*), /$\\{segment}

注:效果是去掉/red


2. PrefixPath 添加前缀

给请求路径添加前缀

spring:
cloud:
gateway:
routes:
- id: prefixpath_route
uri: https://example.org
filters:
- PrefixPath=/mypath

3. StripPrefix 删除前缀

删除请求的指定个数前缀后添加到服务末尾

spring:
cloud:
gateway:
routes:
- id: nameRoot
uri: https://nameservice
predicates:
- Path=/name/**
filters:
- StripPrefix=2

例如:请求路径/name/blue/red,实际效果 nameservice/red


全局过滤器GlobalFilter

无需配置文件作用在所有的路由,最终通过gatewayfilterAdapter包装为过滤器


自定义过滤器工厂


  • 继承AbstractGateWayFilterFactory
  • 继承AbstractNameValueGatewayFilterFactory
    第一种方式的简化方式

自定义网关过滤器

@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter, Ordered {
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("**** com int mylogglbalfiltert{}",new Date());
String uname = exchange.getRequest().getQueryParams().getFirst("uname");
if(uname==null){
log.info("非法用户");
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE); //返回状态码
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}

注册过滤器

@Configuration
public class GateWayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){
RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
routes.route("path_route_kouryoushine",
r->r.path("guonei").
uri("http://news.baidu.com/guonei")).build();
return routes.build() ;
}
}

全局过滤器

无需注册操作,默认直接生效


核心API


  • exchange.getRequest().mutate().xxx 修改request
  • exchange.mutate.xxx 修改exchange
  • chain.filter(exchange) 传递给下一个过滤器
  • exchange.getResponse() 获取响应

配置文件

filters:
- AddRequestHeader=X-Request-Foo,Bar
- PreLog=a,b

@Slf4j
@Component
public class PreLogGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {
@Override
public GatewayFilter apply(NameValueConfig config) {
log.info("请求建立了{}{}",config.getName(),config.getValue());
return (exchagne,chain)->{
log.info("请求建立了{}{}",config.getName(),config.getValue());
ServerHttpRequest request = exchagne.getRequest()
.mutate()
.build();
ServerWebExchange exchange = exchagne.mutate()
.request(request)
.build();
return chain.filter(exchange);
};
}
}

全局过滤器

order越小有效执行
局部过滤器按照配置顺序执行
如果想自行控制order,返回OrderedGateFilter


全局监控

查看全局过滤器
http://localhost:8040/actuator/gateway/globalfilters


  • routes展示路由列表

其他监控包括动态增加路由都可以百度






推荐阅读
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限
    小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限 ... [详细]
  • CentOS 7环境下Jenkins的安装与前后端应用部署详解
    CentOS 7环境下Jenkins的安装与前后端应用部署详解 ... [详细]
  • 近年来,BPM(业务流程管理)系统在国内市场逐渐普及,多家厂商在这一领域崭露头角。本文将对当前主要的BPM厂商进行概述,并分析其各自的优势。目前,市场上较为成熟的BPM产品主要分为两类:一类是综合型厂商,如IBM和SAP,这些企业在整体解决方案方面具有明显优势;另一类则是专注于BPM领域的专业厂商,它们在特定行业或应用场景中表现出色。通过对比分析,本文旨在为企业选择合适的BPM系统提供参考。 ... [详细]
  • 深入解析Netty:基础理论与IO模型概述
    深入解析Netty:基础理论与IO模型概述 ... [详细]
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
  • Amoeba 通过优化 MySQL 的读写分离功能显著提升了数据库性能。作为一款基于 MySQL 协议的代理工具,Amoeba 能够高效地处理应用程序的请求,并根据预设的规则将 SQL 请求智能地分配到不同的数据库实例,从而实现负载均衡和高可用性。该方案不仅提高了系统的并发处理能力,还有效减少了主数据库的负担,确保了数据的一致性和可靠性。 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • 在JavaWeb项目架构中,NFS(网络文件系统)的实现与优化是关键环节。NFS允许不同主机系统通过局域网共享文件和目录,提高资源利用率和数据访问效率。本文详细探讨了NFS在JavaWeb项目中的应用,包括配置、性能优化及常见问题的解决方案,旨在为开发者提供实用的技术参考。 ... [详细]
  • FastDFS Nginx 扩展模块的源代码解析与技术剖析
    FastDFS Nginx 扩展模块的源代码解析与技术剖析 ... [详细]
  • 本文源自极分享,详细内容请参阅原文。技术债务如同信用卡负债,随着时间推移,修复成本会越来越高,因此程序员必须对此有深刻认识。此外,团队应致力于培养一种持续维护和优化代码的文化,以减少技术债务的累积。 ... [详细]
  • 从无到有,构建个人专属的操作系统解决方案
    操作系统(OS)被誉为程序员的三大浪漫之一,常被比喻为计算机的灵魂、大脑、内核和基石,其重要性不言而喻。本文将详细介绍如何从零开始构建个人专属的操作系统解决方案,涵盖从需求分析到系统设计、开发与测试的全过程,帮助读者深入理解操作系统的本质与实现方法。 ... [详细]
  • Go语言实现Redis客户端与服务器的交互机制深入解析
    在前文对Godis v1.0版本的基础功能进行了详细介绍后,本文将重点探讨如何实现客户端与服务器之间的交互机制。通过具体代码实现,使客户端与服务器能够顺利通信,赋予项目实际运行的能力。本文将详细解析Go语言在实现这一过程中的关键技术和实现细节,帮助读者深入了解Redis客户端与服务器的交互原理。 ... [详细]
author-avatar
透支的灬漂移_255
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有