SpringCloud Day05---服务网关(Gateway)(二)

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: SpringCloud Day05---服务网关(Gateway)(二)

8.4.2 YML配置说明


1.==在配置文件yml中配置:==见前面的步骤

2.代码中注入RouteLocator的Bean

百度国内新闻网址:http://news.baidu.com/guonei

业务需求:通过9527网关访问到外网的百度新闻网址

  • 在cloud-gateway-gateway9527上进行编码
@Configuration
public class GateWayConfig {
    /**
     * 配置了一个id为route-name的路由规则,
     * 当访问地址 http://localhost:9527/guonei时会自动转发到地址:http://news.baidu.com/guonei
     * @param builder
     * @return
     */
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){
        RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
        routes.route("path_route_rg",r->r.path("/lady").uri("https://news.baidu.com/lady")).
                route("path_route_rg2",r->r.path("/guonei").uri("https://news.baidu.com/guonei")).
                build();
        return routes.build();
    }
}
  • 测试:



48dcfafc4799d3dbb428e1e4b28c857e.png

383d61faa814bf5928e122610018c4ae.png


8.5 通过微服务名实现动态路由


默认情况下Gateway会根据注册中心注册的服务列表,以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能


修改YML


lb://serviceName是spring cloud gateway在微服务中自动为我们创建的负载均衡uri

uri的协议为lb,表示启用Gateway的负载均衡功能。

server:
  port: 9527
spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由(因为服务名下的实例有多个,从而可以达到负载均衡的效果)
      routes:  # - 用于区分列表项
        - id: payment_routh # payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
          #uri: http://localhost:8001 #匹配后提供服务的路由地址
          uri: lb://cloud-payment-service #匹配后提供服务的路由地址  lb://表示基于服务注册的负载均衡
          predicates:
            Path=/payment/get/**  #断言, 路径相匹配的进行路由
        - id: payment_routh2 # payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
          #uri: http://localhost:8001 #匹配后提供服务的路由地址
          uri: lb://cloud-payment-service #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/lb/**  #断言, 路径相匹配的进行路由
eureka:
  instance:
    hostname: cloud-gateway-service
  client: #服务提供者provider注册进eureka服务列表内
    service-url:
      register-with-eureka: true
      fetch-registry: true
      #defaultZone: http://eureka7001.com:7001/eureka
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7004.com:7004/eureka  # 集群版


测试: 访问http://localhost:9527/payment/lb ,8001/8002两个端口不断地切换


f07e105edc35939f4be2ed060e7e2ca4.png

8.6 Predicate的使用


8.6.1 是什么


启动我们的gateway9527

0a327e7828a1dc1ac923e3429302a638.png

8.6.2 Route Predicate Factories这个是什么东东?

4d20e047965d7b3f6db804ec3a01c32c.png

Spring Cloud Gateway将路由匹配作为Spring WebFlux HandlerMapping基础架构的一部分。

Spring Cloud Gateway包括许多内置的Route Predicate工厂。所有这些Predicate都与HTTP请求的不同属性匹配。多个Route Predicate工厂可以进行组合


Spring Cloud Gateway 创建 Route 对象时, 使用 RoutePredicateFactory 创建 Predicate 对象,Predicate 对象可以赋值给 Route。 Spring Cloud Gateway 包含许多内置的Route Predicate Factories。


所有这些谓词都匹配HTTP请求的不同属性。多种谓词工厂可以组合,并通过逻辑and。


8.6.3 常用的Route Predicate


6f5c826a5f45da5115e3e9ead7382c1b.png


  • After Route Predicate


4227b7e8086da628690cdeefd68e83f2.png

如何获得是时区时间串串


@Test
public void test01(){
    ZonedDateTime now = ZonedDateTime.now();
    System.out.println(now);
}
  • Before Route Predicate


5556b036db6cf3fb045fffee7fc62727.png


  • Between Route Predicate


cb6f71cec393c937689e9a977b457c86.png

  • Cookie Route Predicate


13ee28c3cdf3438389c8ac1836277f24.png


不带cookie访问: curl http://localhost:9527/payment/lb


b880289df99bc20ed882e1e293d28203.png

带cookie访问:curl http://localhost:9527/payment/lb --cookie “username=xxyy”


eaaa3e11b567fe0576f75e2d041d07cf.png

  • Header Route Predicate

image.png


不带请求头: curl http://localhost:9588/paymentInfo


image.png


携带请求头:curl http://localhost:9527/payment/lb -H “X-Request-Id:123”


28f2c67c699c06c852724cbff2ce9545.png


  • Host Route Predicate
  • Method Route Predicate
  • Path Route Predicate
  • Query Route Predicate
  • ALL小总结


server:
  port: 9527
spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true #开启从注册中心动态创建路由的功能
      routes:
        - id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
          # uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://cloud-payment-service #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/get/**         # 断言,路径相匹配的进行路由
        - id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
          # uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://cloud-payment-service #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/lb/**         # 断言,路径相匹配的进行路由
            - After=2020-02-05T15:10:03.685+08:00[Asia/Shanghai]         # 断言,路径相匹配的进行路由
            #- Before=2020-02-05T15:10:03.685+08:00[Asia/Shanghai]         # 断言,路径相匹配的进行路由
            #- Between=2020-02-02T17:45:06.206+08:00[Asia/Shanghai],2020-03-25T18:59:06.206+08:00[Asia/Shanghai]
            #- Cookie=username,zzyy
            #- Header=X-Request-Id, \d+  # 请求头要有X-Request-Id属性并且值为整数的正则表达式
            #- Host=**.atguigu.com
            - Method=GET
            - Query=username, \d+  # 要有参数名username并且值还要是整数才能路由
eureka:
  instance:
    hostname: cloud-gateway-service
  client: #服务提供者provider注册进eureka服务列表内
    service-url:
      register-with-eureka: true
      fetch-registry: true
      defaultZone: http://eureka7001.com:7001/eureka
#id:我们自定义的路由 ID,保持唯一
 ##uri:目标服务地址
 ##predicates:路由条件,Predicate接受一个输入参数返回一个布尔值。
 ##            该属性包含多种默认方法来将Predicate组合成其他复杂的逻辑(比如:与,或,非)

说白了,Predicate就是为了实现一组匹配规则,让请求过来找到对应的Route进行处理。


8.7 Filter的使用


8.7.1 是什么?

f74f2bb5731185ef4f864340581e2ee3.png

路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用。

Spring Cloud Gateway 内置了多种路由过滤器,他们都由GatewayFilter的工厂类来产生


8.7.2 Spring Cloud Gateway的Filter


生命周期,Only Two:

  • pre
  • post

种类,Only Two

  • GatewayFilter


https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#the-addrequestparameter-gatewayfilter-factory

31种之多。。。。。

97b17d8e56cdd2e8c7f36d541ff3e505.png


  • GlobalFilter



0c75cb6e58113c3315790bcc75fd0a20.png


8.7.3 常用的GatewayFilter


以AddRequestParameter为例

1a488e99bb0e478ebc0cc744f6851392.png


8.7.4 自定义过滤器


自定义全局GlobalFilter


  • 实现两个接口

implements GlobalFilter,Ordered

  • 能干嘛

全局日志记录,统一网关鉴权…

  • 编写代码
@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter, Ordered  {
    @Override
    public Mono <Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("************come in MyLogGateWayFilter: "+new Date());
        String uname = exchange.getRequest().getQueryParams().getFirst("uname");
        if(uname==null){
            log.info("**********用户名为null,非法用户,o(╥﹏╥)o");
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);//设置状态码
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }
    @Override
    public int getOrder() {
        return 0;
    }
}
  • 测试

携带uname时,http://localhost:9527/payment/lb?uname=lxy 正常访问



0e2948668249afd5415731e8d6903a7b.png

没有参数uname时,无法正常使用转发


a273f5d84d63270aa16c5497f7968824.png


相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
3月前
|
JSON Java API
利用Spring Cloud Gateway Predicate优化微服务路由策略
Spring Cloud Gateway 的路由配置中,`predicates`​(断言)用于定义哪些请求应该匹配特定的路由规则。 断言是Gateway在进行路由时,根据具体的请求信息如请求路径、请求方法、请求参数等进行匹配的规则。当一个请求的信息符合断言设置的条件时,Gateway就会将该请求路由到对应的服务上。
202 69
利用Spring Cloud Gateway Predicate优化微服务路由策略
|
5天前
|
前端开发 Java Nacos
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
本文介绍了如何使用Spring Cloud Alibaba 2023.0.0.0技术栈构建微服务网关,以应对微服务架构中流量治理与安全管控的复杂性。通过一个包含鉴权服务、文件服务和主服务的项目,详细讲解了网关的整合与功能开发。首先,通过统一路由配置,将所有请求集中到网关进行管理;其次,实现了限流防刷功能,防止恶意刷接口;最后,添加了登录鉴权机制,确保用户身份验证。整个过程结合Nacos注册中心,确保服务注册与配置管理的高效性。通过这些实践,帮助开发者更好地理解和应用微服务网关。
22 0
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
|
5月前
|
存储 数据可视化 Java
基于MicrometerTracing门面和Zipkin实现集成springcloud2023的服务追踪
Sleuth将会停止维护,Sleuth最新版本也只支持springboot2。作为替代可以使用MicrometerTracing在微服务中作为服务追踪的工具。
221 1
|
3月前
|
JavaScript Java Kotlin
深入 Spring Cloud Gateway 过滤器
Spring Cloud Gateway 是新一代微服务网关框架,支持多种过滤器实现。本文详解了 `GlobalFilter`、`GatewayFilter` 和 `AbstractGatewayFilterFactory` 三种过滤器的实现方式及其应用场景,帮助开发者高效利用这些工具进行网关开发。
418 1
|
4月前
|
负载均衡 Java 应用服务中间件
Gateway服务网关
Gateway服务网关
116 1
Gateway服务网关
|
4月前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
100 3
|
4月前
|
负载均衡 Java API
项目中用的网关Gateway及SpringCloud
Spring Cloud Gateway 是一个功能强大、灵活易用的API网关解决方案。通过配置路由、过滤器、熔断器和限流等功能,可以有效地管理和保护微服务。本文详细介绍了Spring Cloud Gateway的基本概念、配置方法和实际应用,希望能帮助开发者更好地理解和使用这一工具。通过合理使用Spring Cloud Gateway,可以显著提升微服务架构的健壮性和可维护性。
106 0
|
5月前
|
XML Java 数据格式
如何使用 Spring Cloud 实现网关
如何使用 Spring Cloud 实现网关
72 3
|
6月前
|
负载均衡 Java 网络架构
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
275 5
|
6月前
|
Java 开发者 Spring
Spring Cloud Gateway 中,过滤器的分类有哪些?
Spring Cloud Gateway 中,过滤器的分类有哪些?
154 3