系统定制开发SpringCloud Gateway详解与配置


简介

用来构建 API 网关。Spring Cloud Gateway 系统定制开发旨在提供一种简单而有系统定制开发效的方式来路由到 API,系统定制开发并为它们提供横切关注点,例如:安全性、监控/系统定制开发指标和弹性。 


特点

  • 动态路由:系统定制开发能够匹配任何请求属性的路由
  • 系统定制开发谓词和过滤器特定于路由
  • 系统定制开发熔断器集成
  • 系统定制开发易于编写谓词和过滤器
  • 集成SpringCloud系统定制开发的服务发现功能
  • 系统定制开发请求速率限制
  • 路径重写

从0到1构建Gateway

手动构建

1.点击 会显示如下页面,点击GENRATE下载配置好的压缩包。

请按需和实际场景选择 构建方式、语言、SpringBoot版本、打包方式和Java版本。

 2.解压缩下载好的Gateway项目压缩包,用你喜欢的IDE打开,项目结构如下:

基本配置

Route组成

Route是网关的基本组成单元,它是由ID,目标URI和一组predicates和一组filters组成,如果一组断言结果为真,则匹配路由,目标URI会被访问。

注意:

  • 多个 Predicate 之间是 逻辑and 的关系。
  • 多个Predicate是从定义的顺序从上到下依次执行,也可以指定 order 属性的值。

配置方式

Gateway 提供了两种不同的方式来配置路由,一种是通过yml文件来配置,另一种是通过New Bean来配置。

uri解析

  • http前缀 

        路由匹配完成后跳转到此地址

  • lb前缀

         lb代表负载均衡,service-name代表服务注册中心该服务注册的服务名

 yml文件配置

  1. #GateWay项目端口号
  2. server:
  3. port: 8889
  4. spring:
  5. cloud:
  6. gateway:
  7. routes:
  8. #路由的ID 唯一即可
  9. - id: USER-CENTER
  10. #路由的地址
  11. uri: http://localhost:8888/
  12. #uri: lb://service-name
  13. predicates:
  14. - Path=/user/**

 New Bean配置

  1. package com.example.gateway.config;
  2. import org.springframework.cloud.gateway.route.RouteLocator;
  3. import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. /**
  7. * @author Yellow Duck 🦆
  8. * @date 2022-04-27 15:21
  9. */
  10. @Configuration
  11. public class GatewayConfig {
  12. @Bean
  13. public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
  14. return builder.routes()
  15. //配置路由
  16. .route("USER-CENTER", r -> r.path("/user")
  17. .uri("http://localhost:8888"))
  18. .build();
  19. }
  20. }

使用效果: 

  • 启动服务后,可以通过终端或者Postman等工具调用 
  • 会发现请求被路由转发到

Route Predicate Factory

1.After

 作用:请求在指定时间之后才匹配

  1. #GateWay项目端口号
  2. server:
  3. port: 8889
  4. spring:
  5. cloud:
  6. gateway:
  7. routes:
  8. - id: USER-CENTER #路由的ID
  9. uri: http://localhost:8888/ #匹配后路由地址
  10. predicates:
  11. - After=2022-04-27T16:35:04.030+08:00[Asia/Shanghai]

2.Before 

 作用:请求在指定时间之前才匹配

  1. #GateWay项目端口号
  2. server:
  3. port: 8889
  4. spring:
  5. cloud:
  6. gateway:
  7. routes:
  8. - id: USER-CENTER #路由的ID
  9. uri: http://localhost:8888/ #匹配后路由地址
  10. predicates:
  11. - Before=2022-04-27T16:35:04.030+08:00[Asia/Shanghai]

3.Between 

作用:请求在指定时间区间之内才匹配,

🦆:第一个时间需要小于第二个时间。

  1. #GateWay项目端口号
  2. server:
  3. port: 8889
  4. spring:
  5. cloud:
  6. gateway:
  7. routes:
  8. - id: USER-CENTER #路由的ID
  9. uri: http://localhost:8888/ #匹配后路由地址
  10. predicates:
  11. - Between=2022-04-22T16:00:00.020+08:00[Asia/Shanghai],2022-04-22T16:30:00.020+08:00[Asia/Shanghai]

4.Cookie 

作用:请求携带指定Cookie才匹配
🦆:只有当请求Cookie中带有 name=yellowDuck 才可以匹配到此路由

  1. #GateWay项目端口号
  2. server:
  3. port: 8889
  4. spring:
  5. cloud:
  6. gateway:
  7. routes:
  8. - id: USER-CENTER #路由的ID
  9. uri: http://localhost:8888/ #匹配后路由地址
  10. predicates:
  11. - Cookie=name,yellowDuck

5.Header 

作用:请求携带指定Header才匹配

🦆:只有当请求Header种中带有 X-User-Id:001 才可以匹配到此路由,其中\d+为校验数字正则表达式,可以根据需要自己定制。

  1. #GateWay项目端口号
  2. server:
  3. port: 8889
  4. spring:
  5. cloud:
  6. gateway:
  7. routes:
  8. - id: USER-CENTER #路由的ID
  9. uri: http://localhost:8888/ #匹配后路由地址
  10. predicates:
  11. - Header=X-User-Id,\d+

6.Host

作用:请求携带指定Host才匹配

  1. #GateWay项目端口号
  2. server:
  3. port: 8889
  4. spring:
  5. cloud:
  6. gateway:
  7. routes:
  8. - id: USER-CENTER #路由的ID
  9. uri: http://localhost:8888/ #匹配后路由地址
  10. predicates:
  11. - Host=**.yellowDuck.com

7.Method 

作用:请求指定Mehtod请求方式才匹配

🦆:只有GET,POST,DELETE请求才可以访问

  1. #GateWay项目端口号
  2. server:
  3. port: 8889
  4. spring:
  5. cloud:
  6. gateway:
  7. routes:
  8. - id: USER-CENTER #路由的ID
  9. uri: http://localhost:8888/ #匹配后路由地址
  10. predicates:
  11. - Method=GET,POST,DELETE

8.Path 

作用:请求路径匹配

🦆:只有包含配置的路径才可以匹配 也可以支持/duck/{color}参数形式

  1. #GateWay项目端口号
  2. server:
  3. port: 8889
  4. spring:
  5. cloud:
  6. gateway:
  7. routes:
  8. - id: USER-CENTER #路由的ID
  9. uri: http://localhost:8888/ #匹配后路由地址
  10. predicates:
  11. - Path=/duck/**

9.Query 

作用:请求参数包含匹配

🦆:请求中必须有duck这个参数才可以访问

  1. #GateWay项目端口号
  2. server:
  3. port: 8889
  4. spring:
  5. cloud:
  6. gateway:
  7. routes:
  8. - id: USER-CENTER #路由的ID
  9. uri: http://localhost:8888/ #匹配后路由地址
  10. predicates:
  11. - Query=duck

10.RemoteAddr 

作用:请求的IP/IP段一致才可以访问

  1. #GateWay项目端口号
  2. server:
  3. port: 8889
  4. spring:
  5. cloud:
  6. gateway:
  7. routes:
  8. - id: USER-CENTER #路由的ID
  9. uri: http://localhost:8888/ #匹配后路由地址
  10. predicates:
  11. - RemoteAddr=127.0.0.1/24

11.Weight 

作用:根据权重的分配路由到相应的请求

🦆:group分组,wight权重,是一个int值,下面代表有90%的请求会分配到有10%请求会分配到

  1. #GateWay项目端口号
  2. server:
  3. port: 8889
  4. spring:
  5. cloud:
  6. gateway:
  7. routes:
  8. - id: USER-CENTER #路由的ID
  9. uri: http://localhost:8888/ #匹配后路由地址
  10. predicates:
  11. - Weight=group1,9
  12. - id: DUCK-CENTER #路由的ID
  13. uri: http://localhost:8887/ #匹配后路由地址
  14. predicates:
  15. - Weight=group2,1

Route Filters

过滤器 Filter 将会对请求和响应进行修改处理,路由过滤器只能指定路由进行使用。

1.AddRequestParameter

作用:对请求添加参数

🦆:如下对GET请求添加 duck=yellow 相当于 ?duck=yellow

  1. #GateWay项目端口号
  2. server:
  3. port: 8889
  4. spring:
  5. cloud:
  6. gateway:
  7. routes:
  8. - id: USER-CENTER #路由的ID
  9. uri: http://localhost:8888/ #匹配后路由地址
  10. filters:
  11. - AddRequestParameter=duck,yellow
  12. predicates:
  13. - Method=GET

2.StripPrefix GatewayFilter

作用:对指定数量的路径进行删除过滤

🦆:比如  过滤前两个路径后会变成 

  1. #GateWay项目端口号
  2. server:
  3. port: 8889
  4. spring:
  5. cloud:
  6. gateway:
  7. routes:
  8. - id: USER-CENTER #路由的ID
  9. uri: http://localhost:8888/ #匹配后路由地址
  10. filters:
  11. - Path=/duck/**
  12. predicates:
  13. - StripPrefix=2

3.PrefixPath GatewayFilter

作用:对指定的路径进行增加

 🦆:比如  过滤增加路径后会变成 

  1. #GateWay项目端口号
  2. server:
  3. port: 8889
  4. spring:
  5. cloud:
  6. gateway:
  7. routes:
  8. - id: USER-CENTER #路由的ID
  9. uri: http://localhost:8888/ #匹配后路由地址
  10. filters:
  11. - Method=POST
  12. predicates:
  13. - PrefixPath=/yellow

4.Hystrix GatewayFilter

 1.首先需要添加Hystrix依赖,Hystrix提供了熔断和降级。 

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  4. </dependency>

2.编写服务降级的处理类

  1. package com.gostop.cloud.gateway.config;
  2. import com.gostop.cloud.gateway.handle.HystrixFallbackHandler;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. import org.springframework.http.MediaType;
  7. import org.springframework.web.reactive.function.server.RequestPredicates;
  8. import org.springframework.web.reactive.function.server.RouterFunction;
  9. import org.springframework.web.reactive.function.server.RouterFunctions;
  10. /**
  11. *
  12. * @date 2022-04-28 15:02
  13. * @author YellowDuck
  14. */
  15. @Configuration
  16. public class GatewayFallbackConfiguration {
  17. @Autowired
  18. private HystrixFallbackHandler hystrixFallbackHandler;
  19. @Bean
  20. public RouterFunction routerFunction() {
  21. return RouterFunctions.route(
  22. RequestPredicates.GET("/defaultfallback")
  23. .and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), hystrixFallbackHandler);
  24. }
  25. }
  1. package com.gostop.cloud.gateway.handle;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
  4. import org.springframework.http.HttpStatus;
  5. import org.springframework.http.MediaType;
  6. import org.springframework.stereotype.Component;
  7. import org.springframework.web.reactive.function.BodyInserters;
  8. import org.springframework.web.reactive.function.server.HandlerFunction;
  9. import org.springframework.web.reactive.function.server.ServerRequest;
  10. import org.springframework.web.reactive.function.server.ServerResponse;
  11. import reactor.core.publisher.Mono;
  12. /**
  13. * 覆盖异常处理
  14. * @date 2022-04-28 15:03
  15. * @author Yellow Duck
  16. */
  17. @Slf4j
  18. @Component
  19. public class HystrixFallbackHandler implements HandlerFunction<ServerResponse> {
  20. @Override
  21. public Mono<ServerResponse> handle(ServerRequest serverRequest) {
  22. serverRequest.attribute(ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR)
  23. .ifPresent(originalUrls -> log.error("=====网关执行请求:{}失败,服务降级处理=====", originalUrls));
  24. return ServerResponse
  25. .status(HttpStatus.INTERNAL_SERVER_ERROR)
  26. .contentType(MediaType.APPLICATION_JSON_UTF8)
  27. .body(BodyInserters.fromValue("网络繁忙!"));
  28. }
  29. }

作用:提供了熔断和降级功能

  1. #GateWay项目端口号
  2. server:
  3. port: 8889
  4. spring:
  5. cloud:
  6. gateway:
  7. routes:
  8. - id: USER-CENTER #路由的ID
  9. uri: http://localhost:8888/ #匹配后路由地址
  10. filters:
  11. - name: Hystrix
  12. args:
  13. name: fallback
  14. fallbackUri: forward:/defaultfallback
  15. predicates:
  16. - Method=GET

5.RequestRateLimiter GatewayFilter

引入Redis限流

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
  4. </dependency>

作用:用于限流

  1. #GateWay项目端口号
  2. server:
  3. port: 8889
  4. spring:
  5. cloud:
  6. gateway:
  7. routes:
  8. - id: USER-CENTER #路由的ID
  9. uri: http://localhost:8888/ #匹配后路由地址
  10. filters:
  11. - name: RequestRateLimiter
  12. args:
  13. #每秒允许处理的请求数量
  14. redis-rate-limiter.replenishRate: 10
  15. #每秒最大处理的请求数量
  16. redis-rate-limiter.burstCapacity: 20
  17. redis-rate-limiter.requestedTokens: 1
  18. predicates:
  19. - Method=GET,POST

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发