springcloud-gateway简介

news2024/11/21 1:39:11

目录

1. gateway简介

1.1 是什么

1.2 作用

1.3 主要特征

1.4 与zuul的主要区别

1.5 主要组件

1.6 架构图

2. 开发示例

2.1 创建一个gateway模块

2.2 与nacos结合使用

2.2.1 默认规则

2.2.2 通过配置文件配置路由

2.2.3 动态路由


1. gateway简介


1.1 是什么


SpringCloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zuul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 2.0之前的非Reactor模式的老版本。而为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。

1.2 作用


Spring Cloud Gateway 的目标,不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。

1.3 主要特征


  • 基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.0
  • 集成 Hystrix 断路器
  • 集成 Spring Cloud DiscoveryClient
  • Predicates 和 Filters 作用于特定路由,易于编写的 Predicates 和 Filters
  • 具备一些网关的高级功能:动态路由、限流、路径重写

1.4 与zuul的主要区别


Spring Cloud Gateway 底层使用了高性能的通信框架Netty, zuul采用的是传统的servlet IO。

1.5 主要组件


  • Filter
    过滤器,与zuul中的过滤器作用相同,可以用来拦截和修改请求,也可以对响应做处理。比如用来进行安全校验等。

  • Route
    路由组件,将网关接受到的请求发送给指定的上游服务进行处理。一个Route模块由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配,目标URI会被访问

  • Predicate
    断言, 这是一个 Java 8 的 Predicate。简单的理解是路由转发的条件,满足条件的请求才会被转发。有点像sql中的where子句的作用。

1.6 架构图


官网

对上图的理解:
客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑

2. 开发示例


2.1 创建一个gateway模块


1)创建一个gateway模块

2)如上图,配置pom文件,引入必要的包

    <dependencies>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <!-- 从注册中心进行服务发现 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!-- 向注册中心进行服务注册 -->
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

    </dependencies>
  1. 项目配置文件:application.yml

server:
  port: 8090

spring:
  application:
    name: service-gateway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

4)创建启动类,

@SpringBootApplication
public class GatewayApp {

    public static void main(String[] args) {
        SpringApplication.run(GatewayApp.class, args);
    }

}

2.2 与nacos结合使用


2.2.1 默认规则


将gateway注册到nacos注册中心,使用默认规则进行路由,默认规则使用简单,但功能也相当较弱。
默认规则:
http://gateway_host:gateway_port/服务名/**

服务名 默认为nacos注册的服务点的大写,可以修改

这个nacos和geteway要评级,也就是缩进关系要一致

配置文件:

server:
  port: 8090

spring:
  application:
    name: service-gateway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

    gateway:
      discovery:
        locator:
          #开启服务发现功能,从注册中心获取服务列表,(nacos->服务管理->服务列表)
          #默认服务名称需要为大写,可以通过配置lower-case-service-id: true 改变这一规则
          enabled: true
          #配置服务名使用小写
          lower-case-service-id: true

#配置配置
logging:
  level:
    #trace,debug,info
    org.pringframework.cloud.gateway: trace #便于跟踪调试,生产环境最好不用
    org.springframework.http.server.reactive: debug
    org.springframework.web.reactive: debug
    reactor.ipc.netty: debug

2.2.2 通过配置文件配置路由

RouteDefinition中,主要有五个属性:

  • id:路由标识(id:标识,具有唯一性,默认为uuid
  • predicates:PredicateDefinition 路由断言定义列表
  • filters:FilterDefinition 过滤器定义列表,为一个数组
  • uri:目标服务地址(uri:地址,请求转发后的地址)
  • order:优先级, 越小越优先

通过配置文件配置路由的缺点是,当增加服务时需要修改配置文件并重启网关。

配置文件:

server:
  port: 8090

spring:
  application:
    name: service-gateway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

    gateway:
      discovery:
        locator:
          #开启服务发现功能,从注册中心获取服务列表,(nacos->服务管理->服务列表)
          #默认服务名称需要为大写,可以通过配置lower-case-service-id: true 改变这一规则
          enabled: false
          #配置服务名使用小写
          lower-case-service-id: true

      routes:
        # http://localhost:5000/usr/hello
        #路由标识(id:标识,具有唯一性)
        - id: consumer-service-api
          #目标服务地址(uri:地址,请求转发后的地址),会自动从注册中心获得服务的IP,不需要手动写死
          uri: lb://service-consumer
          #优先级,越小越优先
          #order: 999
          #路由条件(predicates:断言)
          predicates:
          # 路径匹配,
          - Path=/consumer/**
          filters:
          #路径前缀删除示例:请求/name/bar/foo,StripPrefix=2,去除掉前面两个前缀之后,最后转发到目标服务的路径为/foo
          #前缀过滤,请求地址:http://localhost:5000/usr/hello
          #此处配置去掉1个路径前缀,再配置上面的 Path=/usr/**,就将**转发到指定的微服务
          #因为这个api相当于是服务名,只是为了方便以后nginx的代码加上去的,对于服务提供者service-client来说,不需要这段地址,所以需要去掉
          - StripPrefix=1

#配置配置
logging:
  level:
    #trace,debug,info
    org.pringframework.cloud.gateway: trace #便于跟踪调试,生产环境最好不用
    org.springframework.http.server.reactive: debug
    org.springframework.web.reactive: debug
    reactor.ipc.netty: debug

2.2.3 动态路由

功能强,在新增服务时不需要重启网关

1)配置文件

# 自定义配置
# 自定义配置
nacos:
  dataId: gateway-config.json
  group: GWC-GROUP

#配置配置
logging:
  level:
    #trace,debug,info
    #便于跟踪调试,生产环境最好不用
    org.springframework.cloud.gateway: trace
    org.springframework.http.server.reactive: debug
    org.springframework.web.reactive: debug
    reactor.ipc.netty: debug

2)读取配置文件的中的配置信息

/**
 * 1. 保存Gateway(网关)中与nacos相关的属性
 * 2. 这些信息是自定义配置属性,它们保存在配置文件application.yml中
 */
@Configuration
@Data
public class GatewayNacosProperties {

    @Value("${spring.cloud.nacos.discovery.server-addr}")
    private String serverAddr;

    @Value("${nacos.dataId}")
    private String dataId;

    @Value("${nacos.group}")
    private String group;

}

3)实现实现动态路由

/**
 * 此类实现了Spring Cloud Gateway + nacos 的动态路由
 * 该类用于监听配置中心中的路由配置的变化,当监听到配置变化,则发布一个事件,
 * 用于更新本地路由信息。
 * 它实现一个Spring提供的事件推送接口ApplicationEventPublisherAware
 */
@Component
public class DynamicRoutingConfig implements ApplicationEventPublisherAware {

    private final Logger logger = LoggerFactory.getLogger(DynamicRoutingConfig.class);

    @Autowired
    private RouteDefinitionWriter routeDefinitionWriter;

    @Autowired
    private GatewayNacosProperties gatewayNacosProperties;

    private ApplicationEventPublisher applicationEventPublisher;


    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        this.applicationEventPublisher = applicationEventPublisher;
    }

    /**
     * 这个方法主要负责监听Nacos的配置变化,这里先使用参数构建一个ConfigService,再使用ConfigService开启一个监听,
     * 并且在监听的方法中刷新路由信息。
     *
     * @throws NacosException
     */
    @Bean
    public void refreshRouting() throws NacosException {
        Properties properties = new Properties();
        properties.put(PropertyKeyConst.SERVER_ADDR, gatewayNacosProperties.getServerAddr());
        ConfigService configService = NacosFactory.createConfigService(properties);

        //获得nacos中已有的路由配置
        String json = configService.getConfig(gatewayNacosProperties.getDataId(), gatewayNacosProperties.getGroup(), 8090);
        this.parseJson(json);

        //添加监听器,监听nacos中的数据修改事件
        configService.addListener(gatewayNacosProperties.getDataId(), gatewayNacosProperties.getGroup(), new Listener() {
            @Override
            public Executor getExecutor() {
                return null;
            }

            @Override
            public void receiveConfigInfo(String configInfo) {
                logger.info(configInfo);
                parseJson(configInfo);
            }
        });
    }


    /**
     * 解析从nacos读取的路由配置信息(json格式)
     *
     * @param json
     */
    public void parseJson(String json) {
        logger.info("从Nacos返回的路由配置(JSON格式):" + json);
        List<RouteDefinition> routeArr = JSON.parseArray(json).toJavaList(RouteDefinition.class);
        for (RouteDefinition route : routeArr) {
            update(route);
        }
    }


    /**
     * 路由更新:
     * 1)先将原来的路由信息删除
     * 2)保存新的路由信息
     * @param routeDefinition
     * @return
     */
    public void update(RouteDefinition routeDefinition) {

        try {
            this.routeDefinitionWriter.delete(Mono.just(routeDefinition.getId()));
            logger.info("删除原来的路由信息");
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }

        try {
            routeDefinitionWriter.save(Mono.just(routeDefinition)).subscribe();
            this.applicationEventPublisher.publishEvent(new RefreshRoutesEvent(this));
            logger.info("路由更新成功");
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
    }

}

4)在配置中心中配置路由信息

路由配置采用json格式,参考配置如下:

[
  {
    "id": "service-consumer",
    "predicates": [
      {
        "name": "Path",
        "args": {
        "_genkey_0": "/consumer/**"
        }
      }
    ],
    "filters": [
      {
        "name": "StripPrefix",
        "args": {
          "_genkey_0": "1"
        }
      }
    ],
    "uri": "lb://service-consumer",
    "order": 0
  }
]

需要根据自己的项目的具体情况配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/111929.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文带你深入理解【Java基础】· 网络编程(上)

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

Kali Linux中安装IDLE的方法

1 IDLE简介 IDLE是Integrated Development and Learning Enviroment即集成开发和学习环境的简称&#xff0c;是Python的集成开发环境。在Kali Linux中&#xff0c;可以通过IDLE进行Python编程。 2 Kali Linux中安装IDLE 2.1 查看Kali Linux中是否安装IDLE 在Kali Linux终端…

WEB1.0起源:全球首个网站info.cern.ch

伯纳斯李&#xff08;图&#xff09;1990年创立第一个网站。 info.cern.ch是世上第一个网站&#xff0c;提供有关万维网的资料。 info.cern.ch这个网站依然运作如常。 英国科学家蒂姆伯纳斯-李 (Tim Berners-Lee) 于 1989 年在 CERN 工作期间发明了万维网 (WWW)。Web 最初的构思…

基于Vue+SpringBoot智慧校园疫情防控系统(PC端、手机端)--附源码

介绍 智慧校园疫情防控系统——PC 手机端 多端并行 项目源码下载&#xff1a;https://download.csdn.net/download/DeepLearning_/87340321 软件架构 手机端信息系统——日常健康信息填报系统&#xff08;前端手机端 文件夹&#xff09;电脑端智疫图 —— 数据可视化界面 &…

一种新的语义分割思路

这两天看到一篇挺有意思的论文&#xff0c;虽然不是语义分割方面的但是挺有意思的&#xff0c;因此在这里跟大家分享一下&#xff0c;这个也是一种语义分割的思路和方法。 Paper&#xff1a;Fully-Convolutional Siamese Networks for Object Tracking. SiamFC是深度学习目标…

【深入浅出 Yarn 架构与实现】4-2 RM 管理 Application Master

上一篇文章对 ResourceManager 整体架构和功能进行了讲述。本篇将对 RM 中管理 Application Master 的部分进行深入的讲解。 下面将会介绍 RM 与 AM 整体通信执行流程&#xff0c;并对 RM 中涉及的对应服务进行具体讲解。 为了更好的学习本篇知识&#xff0c;建议先熟悉以下知识…

股票量化分析工具QTYX使用攻略——实盘交易信号监控(更新2.5.7)

搭建自己的量化系统如果要长期在市场中立于不败之地&#xff01;必须要形成一套自己的交易系统。如何学会搭建自己的量化交易系统&#xff1f;边学习边实战&#xff0c;在实战中学习才是最有效地方式。于是我们分享一个即可以用于学习&#xff0c;也可以用于实战炒股分析的量化…

3天学会撰写软件发明专利——5.专利法律常识

“无意中发现了一个巨牛的人工智能教程&#xff0c;忍不住分享一下给大家。教程不仅是零基础&#xff0c;通俗易懂&#xff0c;而且非常风趣幽默&#xff0c;像看小说一样&#xff01;觉得太牛了&#xff0c;所以分享给大家。点这里可以跳转到教程。”。 1)假冒专利行为及其法…

Activemq的Broker

目录 一、broker是什么 二、启动broker时指定配置文件 三、嵌入式Broker &#xff08;一&#xff09;Pom.xml &#xff08;二&#xff09;Broker实例 &#xff08;三&#xff09;验证 一、broker是什么 相当于一个ActiveMQ服务器实例。说白了&#xff0c;Broker其实就是…

YK-L1刷机

文章目录1.测试是否能够连接到路由器2.刷breed3.Padavan firmware编译4.烧板5.验证杂文1.1内核模块编写&#xff08;使用insmod方式&#xff09;1.2内核模块编写&#xff08;跟随内核一起编译&#xff09;参考资料1.测试是否能够连接到路由器 插上网线和电脑相连&#xff0c;网…

计算机网络基础——一文详解IPv4与子网划分

IPv4地址概述 在因特网中&#xff0c;为了实现计算机之间的相互通信&#xff0c;通常需要为每台计算机分配一个IP地址。在互联网的发展过程中主要有两个版本的互联网协议&#xff0c;分别是IPv4(Internet Protocol version4)和IPv6 (Internet Protocol version 6) IPv4的IP地址…

SpringBoot:模块探究之spring-boot-starters

Spring Boot Starters 是一组方便的依赖描述符&#xff0c;您可以将它们包含在您的应用程序中。您可以获得所需的所有 Spring 和相关技术的一站式服务&#xff0c;而无需搜索示例代码和复制粘贴大量依赖项描述符。 例如&#xff0c;如果想使用 Spring 和 JPA 进行数据库访问&am…

SpringBoot整合Redis实现几种自定义数据序列化存储方式

JDK自带序列化方式 在Java中RedisTemplete提供了统一的API来操作Redis&#xff0c;比如插入一条String类型的数据&#xff0c;我可以用 redisTemplate.opsForValue().set("name", "美羊羊"); SpringDataRedis可以接收任何类型的对象并将其转成Redis可以处…

小布助手,身入大千世界

在2018年—2019年&#xff0c;AI智能助手一度火热&#xff0c;成了科技行业的全新风口。智能音箱与手机中&#xff0c;我们能看到各种各样的智能助手横空出世&#xff0c;一度成为产品标配。但随着时间缓缓冲刷&#xff0c;就像所有科技风口一样&#xff0c;有的AI智能助手随着…

一种非侵入式幂等性的Java实现

今天我们来谈谈什么是幂等性&#xff1f; 引用百度百科的解析如下&#xff1a; 幂等&#xff08;idempotent、idempotence&#xff09;是一个数学与计算机学概念&#xff0c;常见于抽象代数中。 在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同…

3ds Max:标准几何体

三维软件中一般有许多非常复杂的命令&#xff0c;能够完成非常复杂的图形运算&#xff0c;但其实许多绚丽的图形也是由最基本的几何体构成&#xff0c;许多复杂的命令也是基本的运算程序的集合&#xff0c;就像是砖块&#xff0c;构成了复杂的大厦。任何一个几何体&#xff0c;…

【QGIS入门实战精品教程】3.4:QGIS创建、连接、打包GeoPackage数据库及数据入库案例详解

GeoPackage(以下简称gpkg),内部使用SQLite实现的一种单文件、与操作系统无关的地理数据库。在QGIS中可以很方便的实现GeoPackage的创建与连接等操作。 文章目录 一、QGIS创建GeoPackage1. 创建数据库2. 数据入库二、矢量数据打包为GeoPackage1. 加载shp文件2. 使用QGIS打包图…

微信键盘好用吗?

相信大家在手机上已经安装了一款自己比较熟练使用地输入法&#xff0c;最近微信推出了微信键盘&#xff0c;作为一名产品经理&#xff0c;当然不能错过试用它&#xff0c;我在第一时间下载进行了使用&#xff0c; 下面是我使用了几天的感受&#xff0c;与大家分享一下。 一、体…

2023年5大网络安全趋势加速发展

©网络研究院 Netwrix发布了2023年将影响各种规模组织的关键网络安全趋势。以下是你需要注意的五个具体趋势: 网络犯罪的业务将进一步专业化 Emotet、Conti和Trickbot等恶意软件的回归表明网络雇佣犯罪的扩张。特别是&#xff0c;勒索软件即服务的增长使没有深厚技术技能…

VSCode 最全实用插件

一、必备插件 &#x1f33e;Chinese&#xff08;中文&#xff09; Settings Sync&#xff08;配置同步到云端&#xff09; 可以让我们的vscode配置同步到云端&#xff0c;当我们跟换电脑或者再次安装vscode的时候&#xff0c;只需要登录账号即可同步配置了 wakatime&#xf…