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

简介: 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


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
4月前
|
负载均衡 算法 Java
【SpringCloud(4)】OpenFeign客户端:OpenFeign服务绑定;调用服务接口;Feign和OpenFeign
Feign是一个WebService客户端。使用Feign能让编写WebService客户端更加简单。 它的使用方法是定义一个服务接口然后再上面添加注解。Feign也支持可拔插式的编码器和解码器。SpringCloud对Feign进行了封装,十七支持了SpringMVC标准注解和HttpMessageConverters。 Feign可用于Eureka和Ribbon组合使用以支持负载均衡
785 139
|
5月前
|
负载均衡 监控 Java
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
本文详细介绍了 Spring Cloud Gateway 的核心功能与实践配置。首先讲解了网关模块的创建流程,包括依赖引入(gateway、nacos 服务发现、负载均衡)、端口与服务发现配置,以及路由规则的设置(需注意路径前缀重复与优先级 order)。接着深入解析路由断言,涵盖 After、Before、Path 等 12 种内置断言的参数、作用及配置示例,并说明了自定义断言的实现方法。随后重点阐述过滤器机制,区分路由过滤器(如 AddRequestHeader、RewritePath、RequestRateLimiter 等)与全局过滤器的作用范围与配置方式,提
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
|
4月前
|
缓存 JSON NoSQL
别再手写过滤器!SpringCloud Gateway 内置30 个,少写 80% 重复代码
小富分享Spring Cloud Gateway内置30+过滤器,涵盖请求、响应、路径、安全等场景,无需重复造轮子。通过配置实现Header处理、限流、重试、熔断等功能,提升网关开发效率,避免代码冗余。
539 1
|
6月前
|
API
使用Gateway with Inference Extension路由外部MaaS服务
本文介绍如何通过Gateway with Inference Extension对接百炼服务,实现请求路由时自动添加API Key并重写路径,包含操作步骤及验证方法。
|
8月前
|
应用服务中间件 网络安全 数据安全/隐私保护
网关服务器配置指南:实现自动DHCP地址分配、HTTP服务和SSH无密码登录。
哇哈哈,道具都准备好了,咱们的魔术秀就要开始了。现在,你的网关服务器已经魔法满满,自动分配IP,提供网页服务,SSH登录如入无人之境。而整个世界,只会知道效果,不会知道是你在幕后操控一切。这就是真正的数字世界魔法师,随手拈来,手到擒来。
432 14
|
7月前
|
前端开发 Java API
Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决
本文解析了Spring Cloud Gateway中出现“Unsupported transfer encoding: chunked”错误的原因,指出该问题源于Feign依赖的HTTP客户端与服务端的`chunked`传输编码不兼容,并提供了具体的解决方案。通过规范Feign客户端接口的返回类型,可有效避免该异常,提升系统兼容性与稳定性。
524 0
|
8月前
|
缓存 监控 Java
说一说 SpringCloud Gateway 堆外内存溢出排查
我是小假 期待与你的下一次相遇 ~
1122 5
|
8月前
|
Java API Nacos
|
JSON Java API
利用Spring Cloud Gateway Predicate优化微服务路由策略
Spring Cloud Gateway 的路由配置中,`predicates`​(断言)用于定义哪些请求应该匹配特定的路由规则。 断言是Gateway在进行路由时,根据具体的请求信息如请求路径、请求方法、请求参数等进行匹配的规则。当一个请求的信息符合断言设置的条件时,Gateway就会将该请求路由到对应的服务上。
1286 69
利用Spring Cloud Gateway Predicate优化微服务路由策略
|
12月前
|
前端开发 Java Nacos
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
本文介绍了如何使用Spring Cloud Alibaba 2023.0.0.0技术栈构建微服务网关,以应对微服务架构中流量治理与安全管控的复杂性。通过一个包含鉴权服务、文件服务和主服务的项目,详细讲解了网关的整合与功能开发。首先,通过统一路由配置,将所有请求集中到网关进行管理;其次,实现了限流防刷功能,防止恶意刷接口;最后,添加了登录鉴权机制,确保用户身份验证。整个过程结合Nacos注册中心,确保服务注册与配置管理的高效性。通过这些实践,帮助开发者更好地理解和应用微服务网关。
2121 0
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践

热门文章

最新文章