springcloud之gateway服务网关
目录
- 微服务中网关的作用
- `gateway` 与 `zuul`
- `springcloud gateway` 简介
- 相关概念
- 工作流程
- 特征
- 快速上手
- `Maven` 依赖
- `application.properties` 配置文件
- 启动类
- `eureka-client-producer`的 `controller`
- 测试
- `gateway` 网关路由的配置方式
- `gateway` 网关的动态路由(通过注册中心获取路由服务实例)
- `Maven` 依赖
- `application.properties` 配置文件
- 启动类
- 测试
- `gateway` 网关的过滤器,熔断,限流
微服务中网关的作用
- 统一入口:为全部微服务提供一个唯一的入口,网关起到外部和内部隔离的作用,保障了后台服务的安全性
- 鉴权校验:识别每个请求的权限,拒绝不符合要求的请求
- 动态路由:动态的将请求路由到不同的后端集群中
- 减少客户端与服务端的耦合:服务可以独立发展,通过网关层来做映射
gateway
与 zuul
gateway
是springcloud
微服务平台的一个子项目,属于spring
开源社区,依赖名叫:spring-cloud-starter-gateway
。官网:https://spring.io/projects/spring-cloud-gatewayzuul
是netflix
公司的开源项目,springcloud
在netflix
项目中也已经集成了zuul
,依赖名叫:spring-cloud-starter-netflix-zuul
。官网:https://github.com/Netflix/zuulspringcloud gateway
基于spring 5、projec treactor、springboot 2
,使用非阻塞式的API
,内置限流过滤器,支持长连接(比如websockets
),在高并发和后端服务响应慢的场景下比zuul 1
的表现要好zuul
基于servlet2.x
构建,使用阻塞的API
,没有内置限流过滤器,不支持长连接
springcloud gateway
简介
springcloud gateway
是springcloud
的一个全新项目,该项目是基于spring 5.0,springboot 2.0
和Project Reactor
等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的API
路由管理方式springcloud gateway
作为springcloud
生态系统中的网关,目标是替代netflix zuul
,其不仅提供统一的路由方式,并且基于Filter
链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流
相关概念
Route
(路由):这是网关的基本构建块。它由一个ID
,一个目标URI
,一组断言和一组过滤器定义。如果断言为真,则路由匹配Predicate
(断言):这是一个Java 8
的Predicate
。输入类型是一个ServerWebExchange
。我们可以使用它来匹配来自Http
请求的任何内容,例如headers
或参数Filter
(过滤器):这是org.springframework.cloud.gateway.filter.GatewayFilter
的实例,我们可以使用它修改请求和响应
工作流程
客户端向 SpringCloud Gateway
发出请求。如果 Gateway Handler Mapping
中找到与请求相匹配的路由,将其发送到 Gateway Web Handler
。Handler
再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。 过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(pre
)或之后(post
)执行业务逻辑
特征
- 基于
Spring 5,Project Reactor
和SpringBoot 2.0
- 动态路由
Predicates
和Filters
作用于特定路由- 集成
Hystrix
- 集成
SpringCloud
注册中心 - 易于编写的
Predicates
和Filters
- 限流
- 路径重写
快速上手
继续依赖 上一篇 文章的项目结构,再新建服务网关项目如下
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
,后面*
是通配符
上面这段配置的意思是:配置了一个 id
为 eureka-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-producer
的 controller
它的端口是 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-gateway
,eureka-client-producer
(不需要启动 eureka
服务端以及 config
服务端),访问接口 http://localhost:9000/user/selectUserById?id=1
,如下
说明 gateway
服务网关已经路由成功。在看看接口 http://localhost:8080/user/selectUserById?id=1
,也就是被路由转发的原服务地址的返回结果如下
gateway
网关路由的配置方式
- 在配置文件
properties
或yml
中配置(如上) - 通过
@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();}
}
- 上面配置了一个
id
为path_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
:目标,要路由的服务地址。lb
是LoadBalancer
负载均衡的意思,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-one
,eureka-client-producer
,eureka-client-gateway
服务 - 其中
eureka-client-producer
启动两个实例,端口分别为8080
与8081
,用于测试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服务网关相关推荐
- SpringCloud 组件Gateway服务网关【断言工厂过滤器工厂】
目录 1:断言工厂 2:过滤器工厂 2.1:路由过滤器的种类 2.2:请求头过滤器 2.3:默认过滤器 2.4:总结 1:断言工厂 路由断言工厂Route Predicate Factory 路由配置 ...
- 【Spring Cloud Alibaba】Gateway 服务网关
[Spring Cloud Alibaba]Gateway 服务网关 1 架构图 2 Predicate 断言 3 路由 3.1 静态路由 3.2 动态路由 3.3 Nacos 配置 4 过滤器 4. ...
- 微服务01SpringCloud Eureka Ribbon Nacos Feign Gateway服务网关
微服务技术栈导学 SpringCloud01 1.认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构.这些架构之间有怎样的差别呢? 1.0.学 ...
- Spring cloud Gateway 服务网关 实战
Spring cloud Gateway 服务网关 一.简介 优点: 特性: 总结: 二.核心概念 三.路由规则 1.Path 2.Query 3.Method 4.Datetime 5.Romote ...
- 微服务笔记:第一章_微服务简介|Eureka注册中心|Nacos注册中心|Nacos配置管理|Feign|Gateway服务网关
微服务笔记:第一章_微服务简介|Eureka注册中心|Nacos注册中心|Nacos配置管理|Feign|Gateway服务网关 1. 微服务简介 1.1 服务架构演变 1.2 SpringCloud ...
- Spring Cloud入门-Gateway服务网关(Hoxton版本)
文章目录 Spring Cloud入门系列汇总 摘要 Gateway 简介 相关概念 创建 api-gateway模块 在pom.xml中添加相关依赖 两种不同的配置路由方式 使用yml配置 使用Ja ...
- SpringCloud Gateway 服务网关,限流
SpringCloud Gateway 提供了基于Redis 和lua脚本实现的令牌桶算法进行限流,即 RequestRateLimiterGatewayFilterFactory类,通过设置过滤器实 ...
- SpringCloud Gateway 服务网关,断言
SpringCloud Gateway 是SpringCloud 生态系中的网关,不仅提供统一路由功能,通过 Filter 过滤链实现网关的基本功能,比如用户验证,鉴权,限流等功能.它使用非阻塞模式, ...
- Gateway服务网关使用教程
目录 1.为什么需要网关 2.gateway快速入门 1)创建gateway服务,引入依赖 2)编写启动类 3)编写基础配置和路由规则 4)重启测试 5)网关路由的流程图 3.断言工厂 4.过滤器工厂 ...
- Spring Cloud —— Gateway 服务网关
导航 一.什么是服务网关 二.业界常见网关组件 三.Spring Cloud Gateway 四.Gateway 快速入门 4.1 创建 gateway 服务 4.2 添加 gateway 依赖和 n ...
最新文章
- 王者归来:分布式调度解决方案 ElasticJob 重启!
- Delphi编程之系统OEM DIY
- MySQL 5.7建表时date类型提示默认值类型错误的问题处理
- ACM练习 校赛183F:公平的游戏(TLE)【set的使用,给迭代器增加指定偏移量】
- REVIT使用中遇到的各种问题汇总
- IOS绘制小黄人,对绘图知识的一个练习
- Leetcode 771. Jewels and Stones
- mysql 异步复制建立过程_mysql生产环境高可用---基于GTID异步复制项目实施
- 什么意思中文翻译_os常见意思介绍
- JDBC工具类DataSourceUtils,dao接口代码示例;
- Android 热修复的相关总结(主要是阿里百川的)
- IC卡防批量复制破解 Mifare卡一卡一密方案说明 门禁卡校园卡水卡会员卡防破解方案
- 计算机网络第五章课后答案第七版(谢希仁著)
- 计算机网络(第六版)
- 从校园人到职业人的转变
- linux qt 扫雷,qt制作扫雷
- 压缩软件如何删除压缩包密码(zip、rar、7-zip),忘记密码如何删除密码?
- js / java 文档对比
- python中关于np.array初始化不同维度矩阵的有趣现象
- 在有无缓冲层镊酸锏(LaNiO3,LNO)的 Pt/Ti/SiO-/Si(111)基片上沉积了单层BFO多晶薄膜
热门文章
- 锚框 anchor box bounding box 动手学深度学习v2 pytorch
- 在线工具:找到神器,助你轻松应对各种职场难题
- 171.Excel表列序号
- 计算机一级考证心得体会,计算机一级考试的心得体会
- BAT[阿里、百度、腾讯]等互联网公司数据结构面试题(一) python分析实现
- 现代通信原理2.3:为什么我们这么关注傅立叶变换?
- Deep Reinforcement Learning for Dialogue Generation-关于生成对话的深度强化学习
- windows vs2012 cuda6.5 caffe 简单安装方法
- 操作系统课设 Nachos 实验二:Nachos 的 Makefiles
- 计算机组成原理完整学习笔记(三):存储器