目录

  • 微服务中网关的作用
  • `gateway` 与 `zuul`
  • `springcloud gateway` 简介
    • 相关概念
    • 工作流程
    • 特征
  • 快速上手
    • `Maven` 依赖
    • `application.properties` 配置文件
    • 启动类
    • `eureka-client-producer`的 `controller`
    • 测试
  • `gateway` 网关路由的配置方式
  • `gateway` 网关的动态路由(通过注册中心获取路由服务实例)
    • `Maven` 依赖
    • `application.properties` 配置文件
    • 启动类
    • 测试
  • `gateway` 网关的过滤器,熔断,限流

微服务中网关的作用

  • 统一入口:为全部微服务提供一个唯一的入口,网关起到外部和内部隔离的作用,保障了后台服务的安全性
  • 鉴权校验:识别每个请求的权限,拒绝不符合要求的请求
  • 动态路由:动态的将请求路由到不同的后端集群中
  • 减少客户端与服务端的耦合:服务可以独立发展,通过网关层来做映射

gatewayzuul

  • gatewayspringcloud 微服务平台的一个子项目,属于 spring 开源社区,依赖名叫:spring-cloud-starter-gateway。官网:https://spring.io/projects/spring-cloud-gateway
  • zuulnetflix 公司的开源项目,springcloudnetflix 项目中也已经集成了 zuul,依赖名叫:spring-cloud-starter-netflix-zuul。官网:https://github.com/Netflix/zuul
  • springcloud gateway 基于 spring 5、projec treactor、springboot 2,使用非阻塞式的 API,内置限流过滤器,支持长连接(比如 websockets),在高并发和后端服务响应慢的场景下比 zuul 1 的表现要好
  • zuul 基于 servlet2.x 构建,使用阻塞的 API,没有内置限流过滤器,不支持长连接

springcloud gateway 简介

  • springcloud gatewayspringcloud 的一个全新项目,该项目是基于 spring 5.0,springboot 2.0Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式
  • springcloud gateway 作为 springcloud 生态系统中的网关,目标是替代 netflix zuul,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流

相关概念

  • Route(路由):这是网关的基本构建块。它由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配
  • Predicate(断言):这是一个 Java 8Predicate。输入类型是一个 ServerWebExchange。我们可以使用它来匹配来自 Http 请求的任何内容,例如 headers 或参数
  • Filter(过滤器):这是 org.springframework.cloud.gateway.filter.GatewayFilter 的实例,我们可以使用它修改请求和响应

工作流程


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

特征

  • 基于 Spring 5,Project ReactorSpringBoot 2.0
  • 动态路由
  • PredicatesFilters 作用于特定路由
  • 集成 Hystrix
  • 集成 SpringCloud 注册中心
  • 易于编写的 PredicatesFilters
  • 限流
  • 路径重写

快速上手

继续依赖 上一篇 文章的项目结构,再新建服务网关项目如下

Maven 依赖

eureka-client-gateway 服务网关添加依赖如下

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

application.properties 配置文件

eureka-client-gateway 服务网关的配置文件

server.port=9000spring.application.name=eureka-client-gateway#我们自定义的路由ID,保持唯一
spring.cloud.gateway.routes[0].id=eureka-client-gateway
#目标,要路由的服务地址
spring.cloud.gateway.routes[0].uri=http://localhost:8080
#路由条件
spring.cloud.gateway.routes[0].predicates[0]=Path=/user/**
  • id:我们自定义的路由 ID,保持唯一
  • uri:目标,要路由的服务地址。在这里路由的是 eureka-client-producer 提供方地址
  • predicates:路由条件,Predicate 接受一个输入参数,返回一个布尔值结果
  • filters:过滤规则,本示例暂时没用
  • /user/**:以 user 开头的接口 url,后面 * 是通配符

上面这段配置的意思是:配置了一个 ideureka-client-gateway 的路由规则,当访问地址 http://localhost:9000/user/** 时会自动转发路由到地址 http://localhost:8080/user/**

启动类

eureka-client-gateway 服务网关的启动类

@Slf4j
@SpringBootApplication
public class AppGateway {public static void main(String[] args) {SpringApplication.run(AppGateway.class, args);log.info("------AppGateway Running------");}
}

eureka-client-producercontroller

它的端口是 8080

@Slf4j
@Controller
@RequestMapping(path = "/user")
public class UserController {@Autowiredprivate UserService userService;@GetMapping(path = "/selectUserById")@ResponseBodypublic ResultVo selectUserById(Integer id) {return userService.selectOne(id);}
}

测试

分别启动项目 eureka-client-gatewayeureka-client-producer(不需要启动 eureka 服务端以及 config 服务端),访问接口 http://localhost:9000/user/selectUserById?id=1,如下


说明 gateway 服务网关已经路由成功。在看看接口 http://localhost:8080/user/selectUserById?id=1,也就是被路由转发的原服务地址的返回结果如下

gateway 网关路由的配置方式

  • 在配置文件 propertiesyml 中配置(如上)
  • 通过 @Bean 自定义 RouteLocator,在启动主类 Application 中配置(如下)
@SpringBootApplication
public class GateWayApplication {public static void main(String[] args) {SpringApplication.run(GateWayApplication.class, args);}@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route("path_route", r -> r.path("/about").uri("http://ityouknow.com")).build();}
}
  • 上面配置了一个 idpath_route 的路由,当访问地址 http://localhost:8080/about 时会自动转发到地址:http://www.ityouknow.com/about,只是这里转发的是以项目地址 /about 格式的请求地址

gateway 网关的动态路由(通过注册中心获取路由服务实例)

  • 上述路由的配置是写死了的,要路由的 uri 是固定的;而往往在微服务环境中,一个服务可能是要有多个实例的,这时就要有一种动态的路由机制,实现一种类似于 ribbon 的负载均衡机制,让其路由到某个服务的不同实例上
  • 动态配置路由是通过服务注册名来实现的,路由的配置不再是配置固定的访问端口,可以动态来实现。默认情况下 gateway 会根据注册中心注册的服务列表,以注册中心上服务名为路由创建动态路由进行转发,从而实现动态路由的功能

Maven 依赖

eureka-client-gateway 服务网关添加依赖如下

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

application.properties 配置文件

eureka-client-gateway 服务网关的配置文件修改如下

server.port=9000spring.application.name=eureka-client-gatewayeureka.client.service-url.defaultZone=http://eureka7001:8761/eureka/
eureka.instance.prefer-ip-address=true#我们自定义的路由ID,保持唯一
spring.cloud.gateway.routes[0].id=eureka-client-producer-1
#目标,要路由的服务地址
spring.cloud.gateway.routes[0].uri=lb://eureka-client-producer
#路由条件
spring.cloud.gateway.routes[0].predicates[0]=Path=/user/**
#网关服务注册进eureka,开启根据serviceId创建路由的功能
spring.cloud.gateway.discovery.locator.enabled=true
  • id:我们自定义的路由 ID,保持唯一
  • uri:目标,要路由的服务地址。lbLoadBalancer 负载均衡的意思,eureka-client-producer 是注册在服务中心的服务名
  • predicates:路由条件,Predicate 接受一个输入参数,返回一个布尔值结果
  • /user/**:以 user 开头的接口 url,后面 * 是通配符

启动类

eureka-client-gateway 服务网关的启动类

@Slf4j
@EnableEurekaClient
@SpringBootApplication
public class AppGateway {public static void main(String[] args) {SpringApplication.run(AppGateway.class, args);log.info("------AppGateway Running------");}
}

测试

  • 我们分别启动 eureka-client-oneeureka-client-producereureka-client-gateway 服务
  • 其中 eureka-client-producer 启动两个实例,端口分别为 80808081,用于测试 gateway 网关

  • 使用 postman 向接口 http://localhost:9000/user/selectUserById?id=1 发送 5 次请求,查看控制台日志如下

端口 8080 日志


端口 8081 日志

  • 从结果日志上可以看到:gateway 网关成功路由到了服务 eureka-client-producer 的不同实例上了,并且默认使用了轮询的负载均衡策略

gateway 网关的过滤器,熔断,限流

可以参考文章:http://www.ityouknow.com/springcloud/2019/01/26/spring-cloud-gateway-limit.html

springcloud之gateway服务网关相关推荐

  1. SpringCloud 组件Gateway服务网关【断言工厂过滤器工厂】

    目录 1:断言工厂 2:过滤器工厂 2.1:路由过滤器的种类 2.2:请求头过滤器 2.3:默认过滤器 2.4:总结 1:断言工厂 路由断言工厂Route Predicate Factory 路由配置 ...

  2. 【Spring Cloud Alibaba】Gateway 服务网关

    [Spring Cloud Alibaba]Gateway 服务网关 1 架构图 2 Predicate 断言 3 路由 3.1 静态路由 3.2 动态路由 3.3 Nacos 配置 4 过滤器 4. ...

  3. 微服务01SpringCloud Eureka Ribbon Nacos Feign Gateway服务网关

    微服务技术栈导学 SpringCloud01 1.认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构.这些架构之间有怎样的差别呢? 1.0.学 ...

  4. Spring cloud Gateway 服务网关 实战

    Spring cloud Gateway 服务网关 一.简介 优点: 特性: 总结: 二.核心概念 三.路由规则 1.Path 2.Query 3.Method 4.Datetime 5.Romote ...

  5. 微服务笔记:第一章_微服务简介|Eureka注册中心|Nacos注册中心|Nacos配置管理|Feign|Gateway服务网关

    微服务笔记:第一章_微服务简介|Eureka注册中心|Nacos注册中心|Nacos配置管理|Feign|Gateway服务网关 1. 微服务简介 1.1 服务架构演变 1.2 SpringCloud ...

  6. Spring Cloud入门-Gateway服务网关(Hoxton版本)

    文章目录 Spring Cloud入门系列汇总 摘要 Gateway 简介 相关概念 创建 api-gateway模块 在pom.xml中添加相关依赖 两种不同的配置路由方式 使用yml配置 使用Ja ...

  7. SpringCloud Gateway 服务网关,限流

    SpringCloud Gateway 提供了基于Redis 和lua脚本实现的令牌桶算法进行限流,即 RequestRateLimiterGatewayFilterFactory类,通过设置过滤器实 ...

  8. SpringCloud Gateway 服务网关,断言

    SpringCloud Gateway 是SpringCloud 生态系中的网关,不仅提供统一路由功能,通过 Filter 过滤链实现网关的基本功能,比如用户验证,鉴权,限流等功能.它使用非阻塞模式, ...

  9. Gateway服务网关使用教程

    目录 1.为什么需要网关 2.gateway快速入门 1)创建gateway服务,引入依赖 2)编写启动类 3)编写基础配置和路由规则 4)重启测试 5)网关路由的流程图 3.断言工厂 4.过滤器工厂 ...

  10. Spring Cloud —— Gateway 服务网关

    导航 一.什么是服务网关 二.业界常见网关组件 三.Spring Cloud Gateway 四.Gateway 快速入门 4.1 创建 gateway 服务 4.2 添加 gateway 依赖和 n ...

最新文章

  1. 王者归来:分布式调度解决方案 ElasticJob 重启!
  2. Delphi编程之系统OEM DIY
  3. MySQL 5.7建表时date类型提示默认值类型错误的问题处理
  4. ACM练习 校赛183F:公平的游戏(TLE)【set的使用,给迭代器增加指定偏移量】
  5. REVIT使用中遇到的各种问题汇总
  6. IOS绘制小黄人,对绘图知识的一个练习
  7. Leetcode 771. Jewels and Stones
  8. mysql 异步复制建立过程_mysql生产环境高可用---基于GTID异步复制项目实施
  9. 什么意思中文翻译_os常见意思介绍
  10. JDBC工具类DataSourceUtils,dao接口代码示例;
  11. Android 热修复的相关总结(主要是阿里百川的)
  12. IC卡防批量复制破解 Mifare卡一卡一密方案说明 门禁卡校园卡水卡会员卡防破解方案
  13. 计算机网络第五章课后答案第七版(谢希仁著)
  14. 计算机网络(第六版)
  15. 从校园人到职业人的转变
  16. linux qt 扫雷,qt制作扫雷
  17. 压缩软件如何删除压缩包密码(zip、rar、7-zip),忘记密码如何删除密码?
  18. js / java 文档对比
  19. python中关于np.array初始化不同维度矩阵的有趣现象
  20. 在有无缓冲层镊酸锏(LaNiO3,LNO)的 Pt/Ti/SiO-/Si(111)基片上沉积了单层BFO多晶薄膜

热门文章

  1. 锚框 anchor box bounding box 动手学深度学习v2 pytorch
  2. 在线工具:找到神器,助你轻松应对各种职场难题
  3. 171.Excel表列序号
  4. 计算机一级考证心得体会,计算机一级考试的心得体会
  5. BAT[阿里、百度、腾讯]等互联网公司数据结构面试题(一) python分析实现
  6. 现代通信原理2.3:为什么我们这么关注傅立叶变换?
  7. Deep Reinforcement Learning for Dialogue Generation-关于生成对话的深度强化学习
  8. windows vs2012 cuda6.5 caffe 简单安装方法
  9. 操作系统课设 Nachos 实验二:Nachos 的 Makefiles
  10. 计算机组成原理完整学习笔记(三):存储器