Advertisement

Spring Cloud入门-Gateway服务网关(Hoxton版本)

阅读量:

创建 api-gateway模块


这里我们创建一个api-gateway模块来演示Gateway的常用功能。

在pom.xml中添加相关依赖

org.springframework.cloud

spring-cloud-starter-gateway

两种不同的配置路由方式

Gateway提供了两个不同的配置路由的方式,在这里我们可以看到这些方法的具体实现细节。
其中一个是利用YML文件进行配置,
而另一个则是基于JavaBean进行配置。
接下来我们将分别阐述这两种方法的技术细节。

使用yml配置

在application.yml中进行配置:

server:

port: 9201

service-url:

user-service: http://localhost:8201

spring:

cloud:

gateway:

routes:

路由的ID

  • id: path_route

匹配后路由地址

uri: ${service-url.user-service}/user/{id}

predicates:

断言,路径相匹配的进行路由

  • Path=/user/{id}

分别启动eureka-server、user-service以及api-gateway这三个服务,并随后对该 URL 地址进行测试:http://localhost:9201/user/1

经过分析发现,该请求被路由至user-service的对应路径上:http://localhost:8080/user/1.

在这里插入图片描述
使用Java Bean配置

添加相关配置类,并配置一个RouteLocator对象:

@Configuration

public class GatewayConfig {

@Bean

public static routeLocator routeForCustomer(RouteLocatorBuilder routeLocatorBuilder) {

return builder.routes()

.route(“path_route2”, r -> r.path(“/user/getByUsername”)

.uri(“http://localhost:8201/user/getByUsername”))

.build();

}

}

重启该服务系统,并执行该URL的请求测试:http://localhost:9201/user/getByUsername?username=jourwon

此请求数经由路由决策指向用户服务层中的特定路径:http://localhost:8021/user/getByUsername?username=jourwon.

在这里插入图片描述

Route Predicate 的使用


Spring Cloud Gateway以路由匹配为核心模块为基础架构构建了Spring WebFlux HandlerMapping系统框架。 该平台集成了多种内置的预定义配置组件,并且每个预定义配置组件均与特定HTTP请求属性相关联。 不同类型的预定义配置组件可通过灵活的方式组合应用,在此过程中展现出良好的兼容性和扩展性特点。 为了帮助大家更好地理解这一机制的工作原理以及其实现细节,在此我们计划详细介绍几种典型的预定义配置方案及其应用实例

请注意,在Predicate中所涉及的配置项都位于application-predicate.yml文件内,并基于该配置启动apigateway服务。

After Route Predicate

在指定时间之后的请求会匹配该路由。

spring:

cloud:

gateway:

routes:

  • id: after_route

uri: ${service-url.user-service}

predicates:

  • After=2019-12-29T18:30:00+08:00[Asia/Shanghai]

Before Route Predicate

在指定时间之前的请求会匹配该路由。

spring:

cloud:

gateway:

routes:

  • id: before_route

uri: ${service-url.user-service}

predicates:

  • Before=2019-12-29T18:30:00+08:00[Asia/Shanghai]

Between Route Predicate

在指定时间区间内的请求会匹配该路由。

spring:

cloud:

gateway:

routes:

  • id: before_route

uri: ${service-url.user-service}

predicates:

  • Between=2019-12-29T18:30:00+08:00[Asia/Shanghai], 2019-12-30T18:30:00+08:00[Asia/Shanghai]

带有指定Cookie的请求会匹配该路由。

spring:

cloud:

gateway:

routes:

  • id: cookie_route

uri: ${service-url.user-service}

predicates:

  • Cookie=username,jourwon

通过curl命令发起带有参数username=jourwon的请求以匹配指定路径

curl http://localhost:9201/user/1 --cookie “username=jourwon”

Header Route Predicate

带有指定请求头的请求会匹配该路由。

spring:

cloud:

gateway:

routes:

  • id: header_route

uri: ${service-url.user-service}

predicates:

  • Header=X-Request-Id, \d+

使用curl工具发送带有请求头为X-Request-Id:123的请求可以匹配该路由。

curl http://localhost:9201/user/1 -H “X-Request-Id:123”

Host Route Predicate

带有指定Host的请求会匹配该路由。

spring:

cloud:

gateway:

routes:

  • id: host_route

uri: ${service-url.user-service}

predicates:

  • Host=**.jourwon.com

通过curl工具发起包含请求头字段Host:www.jourwon.com的网络请求能够实现对该路由的匹配

curl http://localhost:9201/user/1 -H “Host:www.jourwon.com”

Method Route Predicate

发送指定方法的请求会匹配该路由。

spring:

cloud:

gateway:

routes:

  • id: method_route

uri: ${service-url.user-service}

predicates:

  • Method=GET

使用curl工具发送GET请求可以匹配该路由。

curl http://localhost:9201/user/1

使用curl工具发送POST请求无法匹配该路由。

curl -X POST http://localhost:9201/user/1

Path Route Predicate

发送指定路径的请求会匹配该路由。

spring:

cloud:

gateway:

routes:

  • id: path_route

uri: ${service-url.user-service}/user/{id}

predicates:

  • Path=/user/{id}

使用curl工具发送/user/1路径请求可以匹配该路由。

curl http://localhost:9201/user/1

使用curl工具发送/abc/1路径请求无法匹配该路由。

curl http://localhost:9201/abc/1

Query Route Predicate

带指定查询参数的请求可以匹配该路由。

spring:

cloud:

gateway:

routes:

  • id: query_route

uri: ${service-url.user-service}/user/getByUsername

predicates:

  • Query=username

通过curl命令发起包含参数username=jourwon的查询请求将与该路由相对应。

curl http://localhost:9201/user/getByUsername?username=jourwon

使用curl工具发送带不带查询参数的请求无法匹配该路由。

curl http://localhost:9201/user/getByUsername

RemoteAddr Route Predicate

从指定远程地址发起的请求可以匹配该路由。

spring:

cloud:

gateway:

routes:

  • id: remoteaddr_route

uri: ${service-url.user-service}

predicates:

  • RemoteAddr=192.168.1.1/24

使用curl工具从192.168.1.1发起请求可以匹配该路由。

curl http://localhost:9201/user/1

Weight Route Predicate

根据权重分配处理相关请求,具体而言,有80%的请求将被分配给localhost:8201服务器,而剩下的20%则会分配给localhost:8202服务器。

spring:

cloud:

gateway:

routes:

  • id: weight_high

uri: http://localhost:8201

predicates:

Weight=group1, 8

id: weight_low

uri: http://localhost:8202

predicates:

  • Weight=group1, 2

Route Filter 的使用


路由滤镜可用于调整进出的HTTP请求以及返回的结果。这些滤镜仅限于指定路径来进行操作。该框架集成提供了多套默认配置好的滤镜集合;这些滤镜均通过GatewayFilter工厂接口生成。

AddRequestParameter GatewayFilter

给请求添加参数的过滤器。

spring:

cloud:

gateway:

routes:

  • id: add_request_parameter_route

uri: http://localhost:8201

filters:

  • AddRequestParameter=username, jourwon

predicates:

  • Method=GET

通过配置将GET请求添加username=journeyman的请求参数,并利用curl工具执行以下命令来进行测试。

curl http://localhost:9201/user/getByUsername

相当于发起该请求:

curl http://localhost:8201/user/getByUsername?username=jourwon

StripPrefix GatewayFilter

对指定数量的路径前缀进行去除的过滤器。

spring:

cloud:

gateway:

routes:

  • id: strip_prefix_route

uri: http://localhost:8201

predicates:

  • Path=/user-service/**

filters:

  • StripPrefix=2

该配置使得所有以/user-service/开头的请求的路径去掉前两位。可以通过curl命令进行测试。

curl http://localhost:9201/user-service/a/user/1

相当于发起该请求:

curl http://localhost:8201/user/1

PrefixPath GatewayFilter

与StripPrefix过滤器恰好相反,会对原有路径进行增加操作的过滤器。

spring:

cloud:

gateway:

routes:

  • id: prefix_path_route

uri: http://localhost:8201

predicates:

  • Method=GET

filters:

  • PrefixPath=/user

该配置将为所有GET请求前缀添加 /user 路径。可借助curl工具运行相应的curl命令来进行测试。

curl http://localhost:9201/1

相当于发起该请求:

curl http://localhost:8201/user/1

Hystrix GatewayFilter

Hystrix 过滤器支持将断路器功能模块集成到网关路由中, 从而防止网络节点出现完全中断的情况, 同时实现负载均衡和基于阈值的服务降级能力。

要开启断路器功能,我们需要在pom.xml中添加Hystrix的相关依赖:

org.springframework.cloud

spring-cloud-starter-netflix-hystrix

然后添加相关服务降级的处理类:

@RestController

public class FallbackController {

@GetMapping(“/fallback”)

public Object fallback() {

Map<String,Object> result = new HashMap<>();

result.put(“data”,null);

result.put(“message”,“Get request fallback!”);

result.put(“code”,500);

return result;

}

}

在application-filter.yml中进行具体配置参数设置,在应用路由出现异常时将异常路由转发至服务降级处理相关的控制器进行处理。

spring:

cloud:

gateway:

routes:

  • id: hystrix_route

uri: ${service-url.user-service}

predicates:

  • Method=GET

filters:

  • name: Hystrix

args:

name: fallbackcmd

fallback-uri: forward:/fallback

移除user-service服务后,在[http://localhost:9201/user/1]执行该URL的测试操作时(或对该URL进行测试操作),检测到已发生的服务降级处理流程。

在这里插入图片描述

RequestRateLimiter GatewayFilter

该过滤器可实现限流功能。基于RateLimiter机制来判断当前请求是否允许继续发送。当单次请求量过高时,默认返回HTTP 429错误码。

在pom.xml中添加相关依赖:

org.springframework.boot

spring-boot-starter-data-redis-reactive

创建一个配置类专门用于管理限流策略,在该配置类中定义有两种不同的限流策略:其中一种策略基于请求参数中的username字段实施;另一种则依据访问来源IP地址设置。

@Configuration

public class RedisRateLimiterConfig {

@Bean

public KeyResolver userKeyResolver() {

return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("username"));

}

@Bean

public KeyResolver ipKeyResolver() {

将返回值交换为exchange,并传递该值到Mono.just方法中作为参数:exchange.getRequest().getRemoteAddress().getHostName()

}

}

为了实现流量分发的目的,我们需要配置Redis以及RequestRateLimiter的相关参数设置,并确保系统会对所有GET请求实施基于IP地址的流量控制策略。

spring:

redis:

host: localhost

password: 123456

port: 6379

云:
自我介绍一下。
毕业于上海交通大学。
曾在小公司工作过一段时间。
也曾在华为、OPPO等知名企业工作过。
自2018年起,在阿里巴巴工作至今。

意识到大多数Java工程师为了提升技能而通常选择自主学习或参加系统培训。然而一到培训机构就会产生高额费用负担。由于缺乏系统性导致自学效率低下且耗时长。此外难以突破技术瓶颈。

为了收集整理这份《2024年Java开发全套学习资料》而进行了系统性的整理工作。
其主要目的是为了帮助那些希望自主提升却又感到迷茫困惑的人。
旨在提供一套全面且易于上手的学习路径。
同时也为广大Java开发者和学习者减轻了学习压力。

img

既提供了针对初学者的学习资源库(Zero Foundation Materials),又设有专门针对资深开发者(3年以上经验者)的高级课程模块(Advanced Learning Tracks),基本涵盖了所有核心Java开发知识点(超过95%),真正形成了一个完整的体系化知识架构!

因为文件较大,在此仅提供部分内容截图以供概览;其中每一个节点均包含大厂面经、学习笔记、源码讲义、实战项目以及讲解视频,并将持续更新中。

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

Spring全套教学资料

Spring是Java程序猿手中的利器,《葵花宝典》式的强大存在。它所提供的各类强力工具包极大地方便了我们的开发流程,并显著提升了效率水平!如今已有超过九成的企业选择了这款框架,在各大招聘网站上不胜枚举的情况下可以说它是不可或缺的技术储备。为了在职业发展中占据优势地位,请务必将其收入囊中。

目录:

部分内容:

Spring源码

  • 第一部分 Spring 概述
  • 第二部分 核心思想
  • 第三部分 手动实现 IoC 与 AOP(自定义 Spring 框架)
  • 第四部分 Spring IOC 高级应用 基础特性及其相关内容 高级特性的拓展与应用

第五部分 深入解析Spring IOC源码
遵循优雅的设计理念
设计遵循模式
注意:原则方法技巧

  • 第六部分 Spring AOP 应用
    声明事务控制

第七部分 深入探究Spring AOP源码机制
关键知识点的详细记录与整理(必要笔记)、核心组件的理解与可视化(必要图表)以及高效的知识传递方式(通俗易懂的语言)

脚手框架:SpringBoot技术

该平台旨在优化Spring框架下应用程序和服务的构建、开发与部署流程,并通过简化配置文件内容实现了嵌入式Web服务器功能的集成。该平台内置了多个预设功能模块,并支持与Spring Cloud技术协同部署。

  • Spring Boot 入门指南
  • 配置文件管理
  • 日志管理
  • Web 应用开发
  • Docker 环境搭建
  • Spring Boot 数据库接入
  • 应用启动配置机制
  • 自定义启动脚本管理

微服务架构:Spring Cloud Alibaba

如同 Spring Cloud 这样的方式, Spring Cloud Alibaba 也是一套基于微服务架构的应用框架, 提供了构建分布式系统所需的关键组件集合. 允许开发者利用其编程范式快速搭建分布式系统所需的基础架构, 这使得复杂的分布式应用开发更加高效和便捷.

  • 微服务架构概述
  • 基于Spring Cloud Alibaba的技术实践
  • 微服务环境搭建指南
  • 详细讲解服务治理策略
  • 提升系统容错能力的方法论
  • 优化网络通信的最佳实践
  • 深入分析链路追踪技术
  • 掌握ZipKin集成与数据持久化的实现
  • 实现高效的消息驱动传输
  • 短信服务部署与管理全解析
  • 通过Nacos Config实现精准的服务配置
  • 应用Seata分布式事务提升系统性能
  • 探索Dubbo RPC通信的最佳实践

Spring MVC

目录:

部分内容:

点击下方传送门即可获取

《互联网巨头企业的面试题解析及深入探讨开发技术的核心内容》完整的学习视频资源【点击下方传送门即可获取

脚手框架:SpringBoot技术

它的目标是简化Spring应用和服务的创建、开发与部署,简化了配置文件,使用嵌入式web服务器,含有诸多开箱即用的微服务功能,可以和spring cloud联合部署。

Spring Boot的核心思想是约定大于配置,应用只需要很少的配置即可,简化了应用开发模式。

  • Spring Boot 入门指南
  • 配置文件解析
  • 系统日志管理
  • Web 开发实践指南
  • Docker 容器化技术应用
  • Spring Boot 数据库访问扩展
  • Spring Boot 启动配置机制解析
  • 城市化启动模板设计

[外链图片转存中…(img-mMKVRjVC-1713300346559)]

[外链图片转存中…(img-fybGD7hD-1713300346559)]

微服务架构:Spring Cloud Alibaba

如同 Spring Cloud 这样,“Spring Cloud Alibaba” 也是一款优秀的微服务架构解决方案。它为开发者提供了构建分布式系统的核心组件,并通过Spring Cloud 编程模型方便地集成使用这些关键组件来实现复杂的分布式系统开发需求。

  • 微服务架构概述
  • 基于Spring Cloud Alibaba的服务框架介绍
  • 微服务部署环境搭建指南
  • 分布式系统的服务治理策略
  • 高可用性系统中的故障容错机制设计
  • 服务质量保障中的链路追踪技术
  • ZipKin集成技术及其数据持久化实现
  • 消息队列驱动下的实时通信解决方案
  • 短信发送与接收功能开发指南
  • 通过Nacos配置管理分布式应用参数
  • Seata分布式事务算法实现解析
  • Dubbo协议用于远程调用与交互实现技术

[外链图片转存中…(img-UBMKQ9PT-1713300346559)]

[外链图片转存中…(img-30QnjjBL-1713300346559)]

Spring MVC

目录:

[外链图片转存中…(img-rSxFWPvP-1713300346559)]

[外链图片转存中…(img-M7qX54Dj-1713300346560)]

[外链图片转存中…(img-QMzHiwIN-1713300346560)]

部分内容:

[外链图片转存中…(img-C8oDPxHS-1713300346560)]

[外链图片转存中…(img-gusXro31-1713300346560)]

点击下方传送门立即获取完整版!

《互联网大厂面试真题精解与深入探讨开发技术要点》完整课程配套视频资源及实践指导与代码剖析材料

点击下方传送门立即获取完整版!

全部评论 (0)

还没有任何评论哟~