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

springcloudAlibabaAPI网关SpringcloudGateway学习笔记九

API网关SpringcloudGateway一、概述二、springcloudgateway三、网关搭建四、核心概念1、架构2、内置路由谓词工厂详解3、自定义路由谓词工厂4、内置


API网关SpringcloudGateway

  • 一、概述
  • 二、spring cloud gateway
  • 三、网关搭建
  • 四、核心概念
    • 1、架构
    • 2、内置路由谓词工厂详解
    • 3、自定义路由谓词工厂
    • 4、内置过滤器工厂
    • 5、自定义过滤器工厂
    • 6、全局过滤器
  • 五、整合容错服务
  • 六、监控
  • 七、限流
  • 八、总结


一、概述

在这里插入图片描述


  • 服务发现,让内容中心总能找到与用户中心
  • 内容中心整合ribbon,实现负载均衡
  • 使用feign,让HTTP的远程调用更加优雅
  • 使用sentinel,提升应用的可用性以及容错性
  • 使用spring消息编程模型、stream消息编程模型,实现了基于rocketMQ的通信

下图为小程序直接调用微服务:
在这里插入图片描述


  • 认证复杂,登录需要验证,若使用此模式,则需要在内容中心、用户中心上做登录认证
  • 导致客户端难以重构,随着项目迭代,可能需要重新划分微服务,若微服务域名什么都变了,则客户端就要做大量的改动
  • 其他微服务使用了某种浏览器不友好协议,直接访问访问不了

使用服务(API)网关:
在这里插入图片描述


  • 可以在API网关做统一认证,再将请求进行转发到后端微服务
  • 采用这样的方式,对外暴露的永远是一个域名,不论内部微服务如何拆分,域名都不会变,这样客户端重构成本大大降低
  • 其他微服务为浏览器不友好协议,可以在网关上边转换为有好的协议,如HTTP、websocket

二、spring cloud gateway


  • 是spring cloud的网关(第二代),未来取代Zuul(第一代)
  • 基于Netty、Reactor以及WebFlux构建
    ① Netty:网络通信框架,可以实现高性能的服务端以及客户端
    ② Reactor:是一个Reactive模型的编程实现
  • 优点:
    ① 性能强劲,是zuul的1.6倍 性能PK
    ② 功能强大,内置了很多实用功能,比如转发、监控、限流等
    ③ 设计优雅,易扩展
  • 缺点:
    ① 依赖Netty与Webflux,不是Servlet编程模型,有一定的学习成本
    ② 不能在Servlet容器中工作,无法构建war包(只能打成jar包),部署到tomcat
    ③ 不支持spring boog 1.x

三、网关搭建


  • 新建spring boot项目
  • 加依赖

<!-- 添加spring gateway 依赖 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

  • 加注解&#xff1a;无
  • 写配置&#xff1a;

server:port: 8040# 应用程序名称
spring:application:name: gatewaycloud:# 服务发现nacos:discovery:server-addr: localhost:8848gateway:discovery:locator:# 让gateway通过服务发现找到其他的微服务enabled: true
# actuator
management:# 展示详细信息endpoint:health:show-details: always# 暴露所有端点endpoints:web:exposure:include: &#39;*&#39;

以上&#xff0c;已通过spring cloud gateway实现了对微服务的反向代理&#xff0c;并且还能总结转发规律
在这里插入图片描述


四、核心概念

route&#xff08;路由&#xff09;&#xff1a;spring cloud gateway 基础元素&#xff0c;可简单理解成一条转发规则。包含如下


  • id
  • 目标url
  • predicate&#xff08;谓词&#xff09;&#xff1a;即java.util.function.predicate&#xff0c;spring cloud gateway使用predicate实现路由的匹配条件
  • filter&#xff08;过滤器&#xff09;&#xff1a;修改请求即响应

配置示例&#xff1a;
在这里插入图片描述


1、架构

在这里插入图片描述


  • gateway client&#xff1a;不是严格意义上的客户端&#xff0c;泛指外部请求
  • proxied service&#xff1a;被代理的微服务
  • gateway mapping&#xff1a;会判断请求的路径是否匹配路由的配置
  • gateway Handler&#xff1a;如果mapping匹配成功&#xff0c;Handler会读取这个路由上的所有过滤器&#xff0c;然后把请求交给过滤器处理

2、内置路由谓词工厂详解

&#xff08;route predicate factories&#xff09;使用手记

在这里插入图片描述


3、自定义路由谓词工厂

在这里插入图片描述


  • 写配置
    在这里插入图片描述

  • 代码示例

&#64;Component
public class TimeBetweenRoutePredicateFactory extends AbstractRoutePredicateFactory<TimeBetweenConfig> {public TimeBetweenRoutePredicateFactory() {super(TimeBetweenConfig.class);}&#64;Overridepublic Predicate<ServerWebExchange> apply(TimeBetweenConfig config) {LocalTime start &#61; config.getStart();LocalTime end &#61; config.getEnd();return serverWebExchange -> {LocalTime now &#61; LocalTime.now();return now.isAfter(start) && now.isBefore(end);};}&#64;Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("start","end");}
}&#64;Data
class TimeBetweenConfig {private LocalTime start;private LocalTime end;
}

配置不生效问题解决&#xff1a; 对 url:lb://user-center 使用理解错误


  • 错误理解是带user-center都会匹配此规则
  • 正确理解是http://localhost:8040将会被转发到http://user-center 通过nacos自动获取地址

4、内置过滤器工厂

Spring Cloud Gateway-过滤器工厂详解&#xff08;GatewayFilter Factories&#xff09;


5、自定义过滤器工厂


  • 写配置
    在这里插入图片描述
  • 代码示例

&#64;Slf4j
&#64;Component
public class PreLogGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {public PreLogGatewayFilterFactory() {}public GatewayFilter apply(NameValueConfig config) {GatewayFilter filter &#61; (((exchange, chain) -> {log.info("请求进来了...{}&#61;{}",config.getName(),config.getValue());ServerHttpRequest modifiedRequest &#61; exchange.getRequest().mutate().build();ServerWebExchange modifiedExchange &#61; exchange.mutate().request(modifiedRequest).build();return chain.filter(modifiedExchange);}));return new OrderedGatewayFilter(filter,1000);}
}

6、全局过滤器

Spring Cloud Gateway-全局过滤器&#xff08;Global Filters&#xff09;

过滤器顺序


  • order越小越靠前执行
  • 局部过滤器的order&#xff0c;会按照配置顺序&#xff0c;按1开始递增
  • 若配置了默认过滤器&#xff0c;会按照配置顺序&#xff0c;按1开始递增&#xff0c;默认过滤器会比局部过滤器优先
  • 如需自行控制order&#xff0c;可返回OrderedGatewayFilter

五、整合容错服务

1、gateway默认整合Hystrix&#xff0c;配置如下
在这里插入图片描述
在这里插入图片描述


六、监控

Spring Cloud Gateway监控

排错、调试技巧总结


七、限流

Spring Cloud Gateway限流详解


八、总结

在这里插入图片描述


推荐阅读
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 面试经验分享:华为面试四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试
    最近有朋友去华为面试,面试经历包括四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试。80%的人都在第一轮电话面试中失败,因为缺乏基础知识。面试问题涉及 ... [详细]
  • Tomcat安装与配置教程及常见问题解决方法
    本文介绍了Tomcat的安装与配置教程,包括jdk版本的选择、域名解析、war文件的部署和访问、常见问题的解决方法等。其中涉及到的问题包括403问题、数据库连接问题、1130错误、2003错误、Java Runtime版本不兼容问题以及502错误等。最后还提到了项目的前后端连接代码的配置。通过本文的指导,读者可以顺利完成Tomcat的安装与配置,并解决常见的问题。 ... [详细]
  • nginx+多个tomcat
    学习nginx的时候遇到的问题:nginx怎么部署两台tomcat?upstream在网上找的资源,我在nginx配置文件(nginx.conf)中添加了两个server。结果只显 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 起因由于我录制过一个小程序的课程,里面有消息模板的讲解。最近有几位同学反馈官方要取消消息模板,使用订阅消息。为了方便大家容易学 PythonFlask构建微信小程序订餐系统 课程。 ... [详细]
author-avatar
天蝎丿冷傲丨
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有