网关
一、什么是网关
网关就是指系统的统一入口,它封装了应用程序的内部接口,为客户端提供统一服务,一些与业务本身功能无关的功能逻辑可以在这里实现,比如认证、鉴权、监控、路由转发等等。它很好的解决了上述问题。为我们访问微服务带来了便捷。
二、为什么使用网关
用户在访问微服务时需要记住每个微服务的地址,这样并不是太方便,它也为带来几个问题:
• 客户端多次请求不同的微服务,增加客户端代码或者配置编写的复杂性
• 认证复杂,每个服务都需要进行认证
• 存在跨域请求,在一定场景下处理相对复杂
网关很好的解决了上述问题。为我们访问微服务带来了便捷。
三、常见的网关
1、 Ngnix+lua
使用nginx的反向代理和负载均衡可实现对api服务器的负载均衡及高可用lua是一种脚本语言,可以来编写一些简单的逻辑
nginx支持lua脚本
2、Kong
基于Nginx+Lua开发,性能高,稳定,有多个可用的插件(限流、鉴权等等)可以开箱即用。
问题:
只支持Http协议;二次开发,*扩展困难;
提供管理API,缺乏更易用的管控、配置方式。
3、Zuul
Netflix开源的网关,功能丰富,使用JAVA开发,易于二次开发
问题:
缺乏管控,无法动态配置;依赖组件较多;处理Http请求依赖的是Web容器,性能不如Nginx
4、Spring Cloud Gateway
• Spring Cloud Gateway是Spring公司基于Spring 5.0, Spring Boot 2.0 和Project Reactor 等技术开发的网关,它的目标是替代Netflix Zuul。 • 它不仅仅提供了统一的路由方式,并且基于Filter链的方式提供了网关的基本功能。
• 优点:
• 性能强劲:是第一代网关Zuul的1.6倍 • 功能强大:内置了很多实用的功能,例如转发、监控、限流等
• 设计优雅,容易扩展
• 缺点:
• 其实现依赖Netty与WebFlux,不是传统的Servlet编程模型,学习成本高
• 不能将其部署在Tomcat、 Jetty等Servlet容器里,只能打成jar包执行
• 需要Spring Boot 2.0及以上的版本,才支持
四、Spring Cloud Gateway核心构架
1、 路由(Route)
路由是Gateway中最基本组件之一,它定义了下面几个信息:
• id:路由标识符,要求唯一,区分于其他路由
• uri:路由指向的目的地uri,即请求最终被转发到的微服务
• order:用于多个路由的排序,数值越小排名越靠前,匹配优先级越高
• predicate:断言,即满足断言的条件路由才能被执行
• filter:过滤器,用于修改请求和响应的信息
2、断言(Predicate)
• 断言 用于进行条件判断,只有断言都返回真,才会真正的执行路由。
• 内置路由断言工厂
• 基于Datetime类型的断言工厂
• 基于远程地址的断言工厂
• 基于Cookie的断言工厂
• 基于Header的断言工厂
• 基于Host的断言工厂
• 基于Method请求方法的断言工厂
• 基于Path请求路径的断言工厂
• 基于Query请求参数的断言工厂
• 基于路由权重的断言工厂
3、过滤器
• 过滤器可以在请求和响应的过程中,进行一些操作。
• Gateway中过滤器的生命周期:
• PRE:执行路由器之前调用,可以实现验证、在集群中选择微服务、记录调试信息等。
• POST:路由到微服务之后执行,可以为响应信息添加一些内容。
• 分类:
• GatewayFilter:局部过滤器,应用到单个路由或一个分组的路由上
• GlobalFilter:全局过滤器,应用到所有路由上
4、网关限流
• 网关是所有请求的公共入口,所以可以在网关进行限流,而且限流的方式也
很多,我们本次采用前面学过的Sentinel组件来实现网关的限流。 Sentinel
支持对SpringCloud Gateway、 Zuul等主流网关进行限流。
• 从1.6.0版本开始, Sentinel提供了SpringCloud Gateway的适配模块,可
以提供两种资源维度的限流:
• route维度:即在Spring配置文件中配置的路由条目,资源名为对应的routeId
• 自定义API维度:用户可以利用Sentinel提供的API来自定义一些API分组
五、Spring Cloud Gateway基本代码实现
1、引入依赖包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
2、 添加配置文件
server:
port: 7000
spring:
application:
name: api-gateway
cloud:
gateway:
routes: # 路由数组[路由 就是指定当请求满足什么条件的时候转到哪个
微服务] - id: product_route # 当前路由的标识, 要求唯一
uri: http://localhost:8081 # 请求要转发到的地址
order: 1 # 路由的优先级,数字越小级别越高
predicates: # 断言(就是路由转发要满足的条件) - Path=/product-serv/** # 当请求路径满足Path指定的规则时,才进行路
由转发
filters: # 过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改
- StripPrefix=1 # 转发之前去掉1层路径
3、启动项目通过网关访问
• http://localhost:7000/product-serv/products/1
推荐阅读
-
Spring Cloud系列-Zuul网关集成JWT身份验证
-
SpringCloud+Eureka+Feign+Ribbon的简化搭建流程,加入熔断,网关和Redis缓存[2]
-
微服务架构下使用Spring Cloud Zuul作为网关将多个微服务整合到一个Swagger服务上
-
AspNetCore网关集成Swagger访问使用IdentityServer保护的webapi项目
-
数秦科技揭秘保全网关于司法存证领域的心路历程
-
【.NET Core项目实战-统一认证平台】第二章网关篇-重构Ocelot来满足需求
-
跟我学SpringCloud | 第十篇:服务网关Zuul高级篇
-
(springCloud-8 Zuul网关路由的基本配置feign实现接口调用)
-
【.NET Core项目实战-统一认证平台】第十六章 网关篇-Ocelot集成RPC服务
-
Linux系统下修改IP地址、网关、DNS的基本方法