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

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 【云原生】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


相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
8天前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 云原生 API 网关 2024 年 11 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要
|
7天前
|
Cloud Native API 微服务
微服务引擎 MSE 及云原生 API 网关 2024 年 11 月产品动态
微服务引擎 MSE 及云原生 API 网关 2024 年 11 月产品动态。
|
1月前
|
负载均衡 Java 应用服务中间件
Gateway服务网关
Gateway服务网关
52 1
Gateway服务网关
|
28天前
|
Cloud Native API 微服务
微服务引擎 MSE 及云原生 API 网关 2024 年 10 月产品动态
微服务引擎 MSE 及云原生 API 网关 2024 年 10 月产品动态。
|
27天前
|
人工智能 Cloud Native 安全
从云原生到 AI 原生,谈谈我经历的网关发展历程和趋势
本文整理自阿里云智能集团资深技术专家,云原生产品线中间件负责人谢吉宝(唐三)在云栖大会的精彩分享。讲师深入浅出的分享了软件架构演进过程中,网关所扮演的各类角色,AI 应用的流量新特征对软件架构和网关所提出的新诉求,以及基于阿里自身实践所带来的开源贡献和商业能力。
80 8
|
1月前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
58 3
|
1月前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 云原生 API 网关 2024 年 10 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要
|
19天前
|
负载均衡 Java API
项目中用的网关Gateway及SpringCloud
Spring Cloud Gateway 是一个功能强大、灵活易用的API网关解决方案。通过配置路由、过滤器、熔断器和限流等功能,可以有效地管理和保护微服务。本文详细介绍了Spring Cloud Gateway的基本概念、配置方法和实际应用,希望能帮助开发者更好地理解和使用这一工具。通过合理使用Spring Cloud Gateway,可以显著提升微服务架构的健壮性和可维护性。
25 0
|
14天前
|
运维 Cloud Native 持续交付
深入理解云原生架构及其在现代企业中的应用
随着数字化转型的浪潮席卷全球,企业正面临着前所未有的挑战与机遇。云计算技术的迅猛发展,特别是云原生架构的兴起,正在重塑企业的IT基础设施和软件开发模式。本文将深入探讨云原生的核心概念、关键技术以及如何在企业中实施云原生策略,以实现更高效的资源利用和更快的市场响应速度。通过分析云原生架构的优势和面临的挑战,我们将揭示它如何助力企业在激烈的市场竞争中保持领先地位。
|
12天前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。