时间: 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
最重要的几个概念
引入依赖
<!--网关--> <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]
}
}