欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

网关

程序员文章站 2022-06-03 18:59:44
...

一、什么是网关

网关就是指系统的统一入口,它封装了应用程序的内部接口,为客户端提供统一服务,一些与业务本身功能无关的功能逻辑可以在这里实现,比如认证、鉴权、监控、路由转发等等。它很好的解决了上述问题。为我们访问微服务带来了便捷。

二、为什么使用网关

用户在访问微服务时需要记住每个微服务的地址,这样并不是太方便,它也为带来几个问题:
• 客户端多次请求不同的微服务,增加客户端代码或者配置编写的复杂性
• 认证复杂,每个服务都需要进行认证
• 存在跨域请求,在一定场景下处理相对复杂
网关很好的解决了上述问题。为我们访问微服务带来了便捷。

三、常见的网关

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

相关标签: 自我感悟