您当前的位置: 首页 >  学无止境 >  文章详情

微服务架构之Gateway网关篇

时间: 2023-10-21 【学无止境】 阅读量:共317人围观

简介 在微服务架构里,服务的粒度被进一步细分,各个业务服务可以被独立的设计、开发、测试、部署和管理。这时,各个独立部署单元可以用不同的开发测试团队维护,可以使用不同的编程语言和技术平台进行设计,这就要求必须使用一种语言和平 台无关的服务协议作为各个单元间的通讯方式。

Gateway是什么

Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。

为什么用Gateway

  • Spring Cloud Gateway 可以看做是一个 Zuul 1.x 的升级版和代替品,比 Zuul 2 更早的使用 Netty 实现异步 IO,从而实现了一个简单、比 Zuul 1.x 更高效的、与 Spring Cloud 紧密配合的 API 网关。
  • Spring Cloud Gateway 里明确的区分了 Router 和 Filter,并且一个很大的特点是内置了非常多的开箱即用功能,并且都可以通过 SpringBoot 配置或者手工编码链式调用来使用。
  • 比如内置了 10 种 Router,使得我们可以直接配置一下就可以随心所欲的根据 Header、或者 Path、或者 Host、或者 Query 来做路由。
    比如区分了一般的 Filter 和全局 Filter,内置了 20 种 Filter 和 9 种全局 Filter,也都可以直接用。当然自定义 Filter 也非常方便。

最重要的几个概念

  • Route(路由):这是网关的基本构建块。它由一个D,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。
  • Predicate(断言):输入类型是一个 ServerWebExchange。我们可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。
  • filter(过滤器 ):Gateway中的Filter 分为两种类型的Filter,分别是GatewayFilter和Global Filter。 过滤器Filter 将会对请求和响应进行修改处理。

引入依赖

<!--网关--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!--nacos服务发现依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>

Gateway基础配置名称介绍

server: port: 8080 spring: application: name: spring-gateway cloud: nacos: server-addr: localhost:8848 # nacos地址 gateway: routes: #路由数组[路由就是指定当请求满足什么条件的时候转到哪个微服务] # 系统模块 - id: spring-system #当前路由的标示,要求唯一 uri: http://localhost:9201/ #请求要转发到的地址,另一种种表示方式:uri: lb://data-producer #在服务注册中心找服务名为 data-producer的服务 predicates: #断言(就是路由转发要满足的条件) - Path=/system/** #当前请求路径满足Path指定的规则时,才进行路有转发,system路由前端指定传过来的,想不通的话可以参考收藏中的vue博客 filters: #过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改 - StripPrefix=1 #转发之前去掉1层路径

假如通过nginx转发或者本地直接请求到gateway服务器,请求为:localhost:8080/system/user/1,那么会自动跳转到 localhost:9201/user/1,其中路径中的system被过滤掉,8080变成9201,上图在配置文件中写死了转发路径的地址,我们可以使用nacos注册中心获取此地址,配置uri: lb://spring-system,请求转发指定的微服务如果部署多个机器,会自动实现负载均衡。

Gateway动态路由

spring: cloud: nacos: server-addr: localhost:8848 # nacos地址 gateway: discovery: locator: enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名进行路由 routes: - id: auth #授权服务 uri: lb://spring-auth predicates: - Path=/auth/** - After=2020-02-05T15:10:03.685+08:00[Asia/shanghai]# 断言,路条相匹配的进行路由 - Before=2020-02-05T15:10:03.685+08:00[Asa/Shanghai]# 断言,路多相匹配的进行路由 - Between=2020-02-92T17:45:03.685+08:00[Asa/Shanghai],2020-03-25T18:59:06.206+08:00[Asia/shanghai] - id: user #用户服务 uri: lb://spring-user predicates: - Path=/user/**

断言工厂

我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件
例如Path=/user/**是按照路径匹配,这个规则是由
org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来处理的,像这样的断言工厂在SpringCloudGateway还有十几个:

After 是某个时间点后的请求 - After=2037-01-20T17:42:47.789-07:00[America/Denver] Before 是某个时间点之前的请求 - Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai] Between 是某两个时间点之前的请求 - Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver] Cookie 请求必须包含某些cookie - Cookie=chocolate, ch.p Header 请求必须包含某些header - Header=X-Request-Id, \d+ Host 请求必须是访问某个host(域名) - Host=.somehost.org,.anotherhost.org Method 请求方式必须是指定方式 - Method=GET,POST Path 请求路径必须符合指定规则 - Path=/red/{segment},/blue/** Query 请求参数必须包含指定参数 - Query=name, Jack或者- Query=name RemoteAddr请求者的ip必须是指定范围 - RemoteAddr=192.168.1.1/24 Weight 权重处理

如何获取时间格式

import java.time.ZoneId; import java.time.ZonedDateTime; public class T2{ public static void main(String[] args){ ZonedDateTime zbj = ZonedDateTime.now(); // 默认时区 system.out.println(zbj); //2020-02-21T15:51:37.485+08:00[Asia/shanghai] } }
文章评论
总共 0 条评论
这篇文章还没有收到评论,赶紧来抢沙发吧~
Copyright (C) 2023- 小祥驿站 保留所有权利 蜀ICP备 17034318号-2  公安备案号 50010302004554