SpringCloud中Gateway的使用教程详解

目录
  • 1.基础教程
  • 2.将配置放在配置文件里
  • 3.放在springcloud里面
  • 4.使用服务名而不是IP

1.基础教程

pom.xml

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.6</version>
    </parent>
    <dependencies>
        <!--gateway不是通过servlet启动的,不需要spring-boot-starter-web-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2020.0.6</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement> 

application.yml

server:
  port: 8081

springboot启动类

@SpringBootApplication
public class GateWayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GateWayApplication.class,args);
    }
    @Bean
    public RouteLocator myRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(p -> p
                        .path("/**")
                        .filters(f -> f.addRequestParameter("aa","bb"))
                        .uri("http://localhost:18080"))

                .build();
    }
}

以上代码,是做了个路由:如果url的path符合正则“/**”则给请求添加一个aa=bb的参数然后转发到http://localhost:18080,。

如果访问http://localhost:8081/get,则最终会请求http://localhost:18080/get?aa=bb

我们再添加一个route。

@SpringBootApplication
public class GateWayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GateWayApplication.class,args);
    }
    @Bean
    public RouteLocator myRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(p ->p
                        .method("POST")
                        .uri("http://localhost:18081")
                )
                .route(p -> p
                        .path("/**")
                        .filters(f -> f.addRequestParameter("aa","bb"))
                        .uri("http://localhost:18080"))

                .build();
    }
}

以上代码添加了一个如果是POST访问,则转发到http://localhost:18081。

那么如果我们使用POST的http://localhost:8081/aaa,则会转发到http://localhost:18081/aaa.

值得注意的是,如果这两个route换下位置,path=/** 的route放在method=post的上面,则会产生另外的情况,就是会转发到18080上去,因为POST的http://localhost:8081/aaa也会匹配上/** .这些route是有先后顺序的。

可以看出route有一个重要的概念,就是条件predicate,命中了什么条件就会被转发到哪里。

Predicate来自于java8的接口。Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将Predicate组合成其他复杂的逻辑(比如:与,或,非)。可以用于接口请求参数校验、判断新老数据是否有变化需要进行更新操作。add–与、or–或、negate–非。

Spring Cloud Gateway内置了许多Predict,这些Predict的源码在org.springframework.cloud.gateway.handler.predicate包中,如果读者有兴趣可以阅读一下。现在列举各种Predicate如下图:

可以看到这有几种类型的Predict,而我们刚刚使用的就是METHOD和Path这两种,当然你可以选择其他的。

2.将配置放在配置文件里

总是写些Bean实际上还是不爽,不如我们放在配置文件里面。放配置文件里面可以减少代码量,最重要的是,如果配合springcloudconfig,可以做到在线更新,这就很爽了。

我们将上面的那个bean注释掉,然后把上面的写到配置文件里。

server:
  port: 8081
spring:
  cloud:
    gateway:
      routes:
      - id: my_method_route
        uri: http://localhost:18081
        predicates:
        - Method=POST
      - id: my_path_route
        uri: http://localhost:18080
        predicates:
        - Path=/**

注意一些关键的地方,要约定大于配置比如:Method=POST Path=/**

3.放在springcloud里面

目前我们都是一个单机springboot,跟springcloud没有关系。我们尝试将这段配置放在nacos的config里面。

nacos新建gateway-test.yaml,类型yaml,内容如下:

spring:
  cloud:
    gateway:
      routes:
      - id: my_path_route
        uri: http://localhost:18080
        predicates:
        - Path=/**
      - id: my_method_route
        uri: http://localhost:18081
        predicates:
        - Method=POST

java项目的pom修改下,添加了nacos的服务发现和配置文件。

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.6</version>
    </parent>
    <dependencies>
        <!--<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <!--springboot2.4版本之后需要添加下面依赖才能加载bootstrap.yml-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2020.0.6</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- SpringCloud Alibaba 微服务 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2021.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

添加bootstrap.yml,添加了nacos的一些配置

spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml

修改application.yml

server:
  port: 8081
spring:
  profiles:
    active: test

此时

{{spring.application.name}}-{{spring.profiles.active}}.{{spring.cloud.nacos.config.file-extension}}

正好等于我们刚才在nacos上建的gateway-test.yaml

最后是java启动执行,发现gateway就从nacos拉取配置文件生效了。

4.使用服务名而不是IP

我们的uri转发的都是具体的ip地址,那么真正在微服务的时候,肯定转发的是服务名而不是ip地址。

修改gateway-test.yaml里面的uri,boot-cloud和boot-cloud1是我们创建的另两个服务。

spring:
  cloud:
    gateway:
      routes:
      - id: my_path_route
        uri: lb://boot-cloud
        predicates:
        - Path=/**
      - id: my_method_route
        uri: lb://boot-cloud1
        predicates:
        - Method=POST

lb是对服务进行负载均衡的意思,需要添加依赖

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

启动后,就可以对服务进行转发了。

到此这篇关于SpringCloud中Gateway的使用教程详解的文章就介绍到这了,更多相关SpringCloud Gateway内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解SpringCloud新一代网关Gateway

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

  • SpringCloud超详细讲解微服务网关Gateway

    目录 前言 微服务网关GateWay介绍 GateWay特性介绍 Gateway 中的相关术语 Gateway实战 1.创建项目gateway 2.创建启动类 3.新增配置文件 4.编程方式实现路由 5.启动验证 总结 前言 上一篇:微服务网关Zuul 上文中,我们介绍了微服务网关Zuul,Zuul 是 Netflix 公司开源的产品,被称为第一代网关,也是 Spring Cloud 前几个版本默认使用的一款提供动态路由微服务网关组件,但是随着 Netflix 公司一系列的停更事件,在最新的 S

  • SpringCloudGateway开发过程解析

    路由简介: 1.SpringCloudGateWay 是用于替代zuul作为API网关,在gateway中有三个重要的名词:过滤器,断言,路由 过滤器与断言是路由的一部分,路由便是将请求进行一系列的处理后分发到各个服务的一个过程. 路由的过程:首先会加载断言以及路由,在接受到请求后根据断言加载的顺序会匹配到先加载的断言,只有与断言匹配了的请求才会进入路由,没有匹配到的服务会将请求当成普通的访问请求. 2:路由加载断言的方式: 断言加载的方式有四种,分别是配置文件,java编码,数据库以及注册中心

  • Springcloud GateWay网关配置过程图解

    一般为了不暴露自己的端口信息等,会选择架构一个网关在前面进行阻挡,起到保护的作用.附上一张工作示列图. 1.配置网关9527 gateway作为网关需要和其他的应用一样需要注册进eureka中进行管理,先创建应用gateway9527 pom文件,关键是gateway依赖 <dependencies> <dependency> <groupId>com.bai</groupId> <artifactId>cloud-api-common</

  • SpringCloud Gateway的基本入门和注意点详解

    目录 1.gateway和zuul 2.使用gateway的路由功能 1. 搭载springcloud gateway 2.简单使用gateway 1.application配置 1.gateway和zuul Spring Cloud Finchley版本的gateway比zuul 1.x系列的性能和功能整体要好,且使用 Gateway 做跨域相比应用本身或是 Nginx 的好处是规则可以配置的更加灵活. 这两者相同的地方就是都是作为网关,处理前段的请求,可以进行路由到对应的服务或者url,也可

  • SpringCloud中Gateway的使用教程详解

    目录 1.基础教程 2.将配置放在配置文件里 3.放在springcloud里面 4.使用服务名而不是IP 1.基础教程 pom.xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.6</version> </parent>

  • SpringCloud服务网关Gateway的使用教程详解

    目录 Gateway 什么是Gateway 什么是api网关 网关的三个核心概念 路由(Route) 断言(Predicate) 过滤(Filter) gateway的工作流程 如何使用Gateway gateway路由转发 使用配置文件 使用代码配置 路由实现负载均衡 gateway九种断言 gateway过滤修改 Gateway 什么是Gateway   由于Netflix的zuul发生问题,spring公司自己研发了一套网关框架Gateway用于取代zuul的使用.什么是gateway呢?

  • es(elasticsearch)整合SpringCloud(SpringBoot)搭建教程详解

    注意:适用于springboot或者springcloud框架 1.首先下载相关文件 2.然后需要去启动相关的启动文件 3.导入相关jar包(如果有相关的依赖包不需要导入)以及配置配置文件,并且写一个dao接口继承一个类,在启动类上标注地址 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> &l

  • Linux中selinux基础配置教程详解

    selinux(Security-Enhanced Linux)安全增强型linux,是一个Linux内核模块,也是Linux的一个安全子系统. 三种模式: Enforcing:强制模式,在selinux运作时,已经开始限制domain/type. permissive: 警告模式,在selinux运作时,会有警告讯息,但不会限制domain/type的存取. disabled: 关闭模式. 可用getenforce查看selinux状态 selinux对文件的作用: 当开启selinux后,s

  • SpringCloud 中使用 Ribbon的方法详解

    在前两章已经给大家讲解了Ribbon负载均衡的规则 以及 如何搭建Ribbon并调用服务,那么在这一章呢 将会给大家说一说如何在SpringCloud中去使用Ribbon.在搭建之前 我们需要做一些准备工作. 1. 搭建Eureka服务器:springCloud-ribbon-server(项目名称) 2. 服务提供者:springCloud-ribbon-police(项目名称) 3. 服务调用者:springCloud-ribbon-person(项目名称) 搭建Eureka服务器 配置 p

  • django中的ajax组件教程详解

    Ajax(Asynchronous Javascript And XML)翻译成英文就是"异步Javascript和XML".即用Javascript语言与服务器进行异步交互,传输的数据为XML,(现在使用更多的是json数据). 向服务器发送请求的途径 1.浏览器地址栏 http://www.baidu.com 默认是get请求 2.form表单发送请求: GET请求 POST请求 3.a标签 href属性 默认是get请求 4.ajax() Ajax的特点 异步交互:客户端发送一个

  • Django中使用Celery的教程详解

    Django教程 Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表性的一位.许多成功的网站和APP都基于Django. Django是一个开放源代码的Web应用框架,由Python写成. Django遵守BSD版权,初次发布于2005年7月, 并于2008年9月发布了第一个正式版本1.0 . Django采用了MVC的软件设计模式,即模型M,视图V和控制器C. 一.前言 Celery是一个基于python开发的分布式任务队列,如果不了解请阅读笔者上一篇博文Celer

  • 在vue 中使用 less的教程详解

    1.安装 npm install --save-dev less less-loader npm install --save-dev style-loader css-loader 先在index.html页面head标签内插入这段代码 <script> (function (doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? 'orientationchange'

  • 如何在python开发工具PyCharm中搭建QtPy环境(教程详解)

    在Python的开发工具PyCharm中安装QtPy5(版本5):打开"File"--"Settings"--"Project Interpreter",点击窗口中右侧点添加按钮,然后在弹出的窗口添加PyQt5模块包,单击Install Package按钮,如图所示: 安装好安装PyQt5后,需要用同样的方法安装pyqt5-tools,安装PyQt5后没有designer.exe就是因为没有安装pyqt5-tools.安装好PyQt5后,desi

  • Python中Selenium库使用教程详解

    selenium介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转.输入.点击.下拉等,来拿到网页渲染之后的结果,可支持多种浏览器 中文参考文档 官网 环境安装 下载安装selenium pip install selenium -i https://mirrors.aliyun.com/pypi/simple/ 谷歌浏览器驱动程序下载地址:

随机推荐