【云原生】springcloud12——服务网关Gateway 2

简介: 【云原生】springcloud12——服务网关Gateway

3 网关的路由配置

3.1 Gateway的网关路由配置的两种方式

(1)在配置文件中配置

在配置文件yml中配置(参考上面yml文件配置)

(2)在配置类中配置

代码中注入RouteLocator的Bean(下面通过编码进ioc容器中配置)

image.png

来操作下。

新建config.GatewayConfig

@Configuration
public class GatewayConfig {
    @Bean
    public RouteLocator CustomRouteLocator(RouteLocatorBuilder routeLocatorBuilder){
        RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
        routes.route("path_route_banjiu"
                ,r -> r.path("/guonei")
                        .uri("http://news.baidu.com/guonei"))
                .build();
                //现在访问localhost:9527/guonei 会被转发到 http://news.baidu.com/guonei
        return routes.build();
    }
    @Bean
    public RouteLocator CustomRouteLocator2(RouteLocatorBuilder routeLocatorBuilder){
        RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
        routes.route("path_route_banjiu"
                ,r -> r.path("/guoji")
                        .uri("http://news.baidu.com/guoji"))
                .build();
        //现在访问localhost:9527/guonei 会被转发到 http://news.baidu.com/guoji
        return routes.build();
    }
}
// 测试结果:buld可以不加

启动9527,测试下。访问:http://localhost:9527/guonei




3.2 动态路由配置

我们上面的两种路由配置都有一个问题,就是地址被写成了hard code,我们这里只使用8001当然好像没问题,那我们要是使用集群呢?要是扩容呢?

先回顾下我们最初的技术架构:使用ribbon实现负载均衡。


image.png


当我们有了网关以后,8001,8002就不再直接暴露给外部了,那由网关负责负载均衡就好了,下面是2.0版本。


image.png


下面实战下。

(1)先启动7001,8001,8002

(2)配置动态路由

将9527的yml文件进行如下修改。

server:
  port: 9527
spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true  #开启从注册中心动态创建路由的功能,利用微服务名称进行路由(默认false)
      routes:
        - id: payment_route # 路由的id,没有规定规则但要求唯一,建议配合服务名
          #匹配后提供服务的路由地址
          #          uri: http://localhost:8001
          uri: lb://cloud-payment-service # lb代表从注册中心获取服务
          predicates:
            - Path=/payment/get/** # 断言,路径相匹配的进行路由
        - id: payment_route2
          #          uri: http://localhost:8001
          uri: lb://cloud-payment-service
          predicates:
            - Path=/payment/lb/** #断言,路径相匹配的进行路由
eureka:
  instance:
    hostname: cloud-gateway-service
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/

(3)测试

启动9527,访问http://localhost:9527/payment/lb

可以看到8001,8002轮流返回。


6e532cd9985c49909e40ec0309da42cf.png


6427681c30c04306a90d175577cbaff0.png


4 Predicate的使用

4.1 Predicate是什么

我们可以在9527启动日志中看到如下日志消息。


image.png

Predicate究竟是什么东东,有哪些Predicate可以配置呢?

我们先看看官网怎么说。


翻译下


image.png

4.2 Gateway常用的Predicate

先来捞一眼。


image.png

我们简单介绍几种,需要使用时对着官方文档查阅即可。

4.3 After/Before/Between Route Predicate

先看三个和时间相关的Predicate


看官网的例子,知道我们需要配置如下格式的时间使用,但是它使用的是美国的时间,那么其它地区这个时间如何得到呢?


image.png新建测试类T2

public class T2 {
    public static void main(String[] args) {
        ZonedDateTime now = ZonedDateTime.now();
        System.out.println(now);
    }
}

结果如下。

image.png

把这个串串复制下,根据自己的需要推算下时间,改下就可以生效。

image.png

比如将After设置为还没有到来的时间,就会无法访问lb接口了,只有时间到了才能访问。


image.png

至于Before,Between就很雷同,不解释了。

这有啥用呢?打个比方,比如你的项目提前上线了,但是某个接口你希望到某个时间才开始生效,就可以设置这个断言了。



03405c5ba84e4b59a54d9606d6d8dae3.jpg

4.4 Cookie Route Predicate

它表示是否需要带cookie访问,可以配置需要的cookie作为断言。

配置下。

image.png

打开cmd终端,输入curl http://localhost:9527/payment/lb(直接访问失败,看404的状态就可以了)


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


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

image.png

4.5 Header

指定访问需要带的请求头。

配一下.

#请求头要有 X-Request-Id属性并且值为整数的正则表达式
- Header=X-Request-Id, \d+  

测试。


image.png

5 Gateway的Filter

使用过滤器,可以在请求前或者请求后对其进行修改。


springcloud自带的过滤器有很多,看看官网的注释就会用了,接下来讲下自定义过滤器。我们在实际生产中,用得更多的也是自定义的过滤条件。

新建filter.MyLogGateWayFilter

@Component
@Slf4j
//@Order(0)   //设置过滤器优先次序
public class MyLogGateWayFilter implements GlobalFilter, Ordered {//Ordered优先次序设置;GlobalFilter过滤器设置
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("**************come in MyLogGateWayFilter:" + new Date());
        //获取request中的uname参数
        String uname = exchange.getRequest().getQueryParams().getFirst("uname");
        if(uname == null){
            log.info("*******用户名为null,非法用户!!");
            //设置响应,不被接受
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }
        //返回chain.filter(exchange),放行
        return chain.filter(exchange);
    }
    @Override
    public int getOrder() {
        //返回值是过滤器的优先级,越小优先级越高(最小-2147483648,最大2147483648)
        return 0;
    }
}

测试下,启动7001,8001,8002,9527(记得把之前断言不需要的注释哦).

http://localhost:9527/payment/lb?uname=111

546aa2c925cb4e2b8577453f0318efc7.png

b295dcbd13144b47960dd2544c1865ac.png


4e91dcb242f240138ad66336584c3f38.png


相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
16天前
|
算法 NoSQL API
SpringCloud&Gateway网关限流
SpringCloud&Gateway网关限流
39 7
|
1月前
|
缓存
SpringCloud Gateway 网关的请求体body的读取和修改
SpringCloud Gateway 框架中,为了处理请求体body,实现多次读取与修改,创建了一个名为`RequestParamGlobalFilter`的全局过滤器。这个过滤器使用`@Component`和`@Slf4j`注解,实现了`GlobalFilter`和`Ordered`接口,设置最高优先级以首先读取body。它通过缓存请求体并创建装饰过的`ServerHttpRequest`来实现body的动态获取。
58 4
|
2天前
|
负载均衡 Java 网络架构
在SpringCloud2023中快速集成SpringCloudGateway网关
本文主要简单介绍SpringCloud2023实战中SpringCoudGateway的搭建。后续的文章将会介绍在微服务中使用熔断Sentinel、鉴权OAuth2、SSO等技术。
26 2
在SpringCloud2023中快速集成SpringCloudGateway网关
|
9天前
|
负载均衡 Java API
构建高效微服务架构:API网关与服务熔断策略
【5月更文挑战第2天】 在微服务架构中,确保系统的高可用性与灵活性是至关重要的。本文将深入探讨如何通过实施有效的API网关和设计合理的服务熔断机制来提升分布式系统的鲁棒性。我们将分析API网关的核心职责,包括请求路由、负载均衡、认证授权以及限流控制,并讨论如何利用熔断器模式防止故障传播,维护系统的整体稳定性。文章还将介绍一些实用的技术和工具,如Netflix Zuul、Spring Cloud Gateway以及Hystrix,以帮助开发者构建一个可靠且高效的微服务环境。
|
16天前
|
前端开发 Java 应用服务中间件
Springboot解决跨域问题方案总结(包括Nginx,Gateway网关等)
Springboot解决跨域问题方案总结(包括Nginx,Gateway网关等)
|
1月前
|
JSON 安全 关系型数据库
SpringCloud Gateway 实现自定义全局过滤器 + JWT权限验证
SpringCloud Gateway 实现自定义全局过滤器 + JWT权限验证
|
1月前
|
Java Nacos 网络架构
SpringCloud Gateway的使用 + Nacos动态路由
SpringCloud Gateway的使用 + Nacos动态路由
|
1月前
|
负载均衡 Nacos 数据安全/隐私保护
SpringCloud GateWay 使用
SpringCloud GateWay 使用
23 0
|
2月前
|
缓存 Java API
【云原生】Spring Cloud Gateway的底层原理与实践方法探究
【云原生】Spring Cloud Gateway的底层原理与实践方法探究
|
3月前
|
监控 Java 应用服务中间件
网关大解密:探索Spring Cloud Alibaba中Gateway的奥秘
网关大解密:探索Spring Cloud Alibaba中Gateway的奥秘
132 1