文档章节

Spring Cloud gateway 网关服务 一

简单自由
 简单自由
发布于 2019/11/04 21:35
字数 1311
阅读 55
收藏 0

之前我们介绍了 zuul网关服务,今天聊聊spring cloud gateway 作为spring cloud的亲儿子网关服务。很多的想法都是参照zuul,为了考虑zuul 迁移到gateway 提供了一个便利的条件。

gateway 他的核心功能也是和zuul 类似。但是他的实现方式与zuul 却有些不一样,他的核心是基于 Spring Boot 2.x, Spring WebFlux和Project Reactor 构建的。

  • Spring WebFlux 响应式Web框架。
    • Spring WebFlux是基于响应式流的,因此可以用来建立异步的、非阻塞的、事件驱动的服务。它采用Reactor作为首选的响应式流的实现库,不过也提供了对RxJava的支持。 由于响应式编程的特性,Spring WebFlux和Reactor底层需要支持异步的运行环境,比如Netty和Undertow;也可以运行在支持异步I/O的
    • Servlet 3.1的容器之上,比如Tomcat(8.0.23及以上)和Jetty(9.0.4及以上)。
  • spring-webflux上层支持两种开发模式:
    • 类似于Spring WebMVC的基于注解(@Controller、@RequestMapping)的开发模式;
    • Java 8 lambda 风格的函数式开发模式。
    • Spring WebFlux也支持响应式的Websocket服务端开发。
所以spring cloud gateway 不是基于阻塞的web 开发。他与传统的Servlet是存在冲突的。在创建功能的时候要排除掉传统的Servlet jar包引用

工作原理

客户端向Spring Cloud Gateway发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序。该处理程序运行通过特定于请求的筛选器链发送请求。筛选器由虚线分隔的原因是,筛选器可以在发送代理请求之前或之后执行逻辑。执行所有“前置”过滤器逻辑,然后发出代理请求。发出代理请求后,将执行“发布”过滤器逻辑。

注意: 在没有端口的路由中定义的URI将分别将HTTP和HTTPS URI的默认端口分别设置为80和443

  • Predicate 断言:这是一个 Java 8 的 Predicate。输入类型是一个 ServerWebExchange。我们可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。
  • Route 路由转发 它由一个 serverID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。
  • Filter 请求过滤 对web资源进行拦截,做一些处理后再交给处理器处理

修改之前工程的pom 文件总pom 里面我们有一个 spring-boot-starter-web 工程引用,删除掉。在服务里面单独依赖。上面已经讲述过,传统Servlet的jar包冲突问题。

在服务消费者和 服务提供者分别添加

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

我们创建工程 cloud-gateway ,修改pom

<dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

创建 bootstrap.yml

server:
  port: 9000

spring:
  profiles:
    active: dev
  application:
    name: cloud-gateway-demo
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
    default-property-inclusion: non_null
  cloud:
    nacos:
      discovery:
        server-addr: 47.99.209.72:8848
      # ${prefix}-${spring.profile.active}.${file-extension}
      config:
        server-addr: 47.99.209.72:8848
        file-extension: yaml
    gateway:
      discovery:
        locator:
           # 是否与服务发现组件进行结合,通过serviceId转发到具体的服务实例。默认false,
          # 为true代表开启基于服务发现的路由规则。
          enabled: true
          # 配置之后访问时无需大写
          lower-case-service-id: true
      routes:
        - id: cloud-discovery-server
          uri: lb://cloud-discovery-server
          predicates:
            # 路径匹配,以 api 开头,直接配置是不生效的,看 filters 配置
            - Path=/server/**
          filters:
            # 前缀过滤,默认配置下,我们的请求路径是 http://localhost:9000/myshop-service-consumer-item/** 这时会路由到指定的服务
            # 此处配置去掉 1 个路径前缀,再配置上面的 Path=/api/**,就能按照 http://localhost:9000/api/** 的方式访问了
            - StripPrefix=1
        - id: cloud-discovery-client
          uri: lb://cloud-discovery-client
          predicates:
            # 路径匹配,以 api 开头,直接配置是不生效的,看 filters 配置
            - Path=/client/**
          filters:
            # 前缀过滤,默认配置下,我们的请求路径是 http://localhost:9000/myshop-service-consumer-item/** 这时会路由到指定的服务
            # 此处配置去掉 1 个路径前缀,再配置上面的 Path=/api/**,就能按照 http://localhost:9000/api/** 的方式访问了
            - StripPrefix=1

创建main 启动类

package com.xian.cloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;


/**
 *
 * @Author: xlr
 * @Date: Created in 上午11:08 2019/11/4
 */
@EnableDiscoveryClient
@SpringBootApplication
public class GatewayServerApplication {

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

启动服务 命令行curl http://localhost:9000/client/client/test

file

服务已经整合完毕。路由功能转发已经实现。配置文件的一些字段的说明也在注释上说明。 下一篇讲述一下 Spring Cloud Gateway 断言

如何喜欢可以关注分享本公众号。 file

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。转载请附带公众号二维码

© 著作权归作者所有

简单自由
粉丝 0
博文 19
码字总数 31342
作品 0
朝阳
私信 提问
微服务网关Spring Cloud Gateway的应用实战

今天和大家聊一下微服务网关 Spring Cloud Gateway。Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于Spring 5.0、Spring Boot 2.0 和Project Reactor 等组件技术,Sprin...

aoho
2019/02/12
0
0
Spring Cloud Gateway VS Zuul 比较,怎么选择?

Spring Cloud Gateway 是 Spring Cloud Finchley 版推出来的新组件,用来代替服务网关:Zuul。 那 Spring Cloud Gateway 和 Zuul 都有哪些区别呢,咱们来比较一下。 1、开源组织 Spring Clo...

Java技术栈
2019/05/10
1.3K
0
微服务下使用网关 Spring Cloud Gateway

Spring Cloud Gateway 工作原理 客户端向 Spring Cloud Gateway 发出请求,如果请求与网关程序定义的路由匹配,则将其发送到网关 Web 处理程序,此处理程序运行特定的请求过滤器链。 过滤器之...

Anoyi
2018/06/27
0
0
Spring Cloud Alibaba迁移指南(四):零代码兼容 Api-Gateway

自 Spring Cloud 官方宣布 Spring Cloud Netflix 进入维护状态后,我们开始制作《Spring Cloud Alibaba迁移指南》系列文章,向开发者提供更多的技术选型方案,并降低迁移过程中的技术难度。 ...

中间件小哥
2019/02/26
0
0
Spring Cloud Gateway 整合Eureka路由转发

前面我们对Spring Cloud Gateway进行了一个入门的学习,具体文章可以查看《Spring Cloud Gateway 网关尝鲜》进行学习。 网关负责转发工作,那么它需要知道后端的服务信息,今天我们来学习下S...

尹吉欢
2018/07/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

检查字符串是否不为空且不为空

如何检查字符串是否不为null也不为空? public void doStuff(String str){ if (str != null && str != "**here I want to check the 'str' is empty or not**") { /* handl......

javail
6分钟前
7
0
No module named 'apscheduler.schedulers'

关于 ModuleNotFoundError: No module named 'apscheduler.schedulers' 和 ModuleNotFoundError: No module named 'apscheduler' 的问题,网上有不少解决。大多数都是因为,文件起名与模块名......

開援带碼
28分钟前
27
0
如何查看Android的系统版本?

有谁知道我怎么能检查系统版本(例如1.0 , 2.2 ,等)编程? #1楼 我无法对答案发表评论,但是Kaushik的答案存在一个严重错误:SDK_INT与系统版本不同,但实际上是指API级别。 if(Build.VER...

技术盛宴
53分钟前
35
0
引入AI变量,精准农业正在加速豹变?

  不久前,“江苏省脱贫率达 99.99%,尚未脱贫人数仅剩 6 户、17 人”这样一则新闻刷屏。“把这 17 个人迁出,江苏就全省脱贫”、“最后这 6 户人家拖了后腿”,在网民们的调侃和质疑声背后...

水果黄瓜
57分钟前
41
0
Elasticsearch系列---结构化搜索

概要 结构化搜索针对日期、时间、数字等结构化数据的搜索,它们有自己的格式,我们可以对它们进行范围,比较大小等逻辑操作,这些逻辑操作得到的结果非黑即白,要么符合条件在结果集里,要么...

清茶豆奶
今天
69
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部