API⽹关详解
1. 什么是API⽹关
API⽹关是⼀个服务器,是系统的唯⼀⼊⼝。从⾯向对象设计的⾓度看,它与外观模式类似。
API⽹关封装了系统内部架构,为每个客户端提供⼀个定制的API。它可能还具有其它职责,如⾝份验证、监控、负载均衡、缓存、请求分⽚与管理、静态响应处理。
API⽹关⽅式的核⼼要点是,所有的客户端和消费端都通过统⼀的⽹关接⼊微服务,在⽹关层处理所有的⾮业务功能。通常,⽹关也是提供REST/HTTP的访问API。
API⽹关出现的原因是微服务架构的出现,不同的微服务⼀般会有不同的⽹络地址,⽽外部客户端可能需要调⽤多个服务的接⼝才能完成⼀个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题:
客户端请求多个微服务,各个服务ip不⼀样,增加客户端复杂度。
存在跨域,在⼀定场景下处理相对复杂。
认证复杂,每个服务都需要独⽴认证。
与微服务耦合太强,微服务变更,客户端需要变更
2. 使⽤API⽹关的好处
所有的外部请求都会先经过API ⽹关这⼀层。也就是说,API 的实现⽅⾯更多的考虑业务逻辑,⽽安全、性能、监控可以交由 API ⽹关来做,这样既提⾼业务灵活性⼜不缺安全性。
易于监控
统⼀认证
减少客户端与微服务交互,解耦接⼝依赖
3. 常⽤⽹关
Nginx+lua
Zuul                              Zuul是⼀种提供动态路由、监视、弹性、安全性等功能的边缘服务。Zuul是Netflix出品的⼀个基于JVM路由和服务端的负载均衡器
SpringCoud Gateway                Spring Cloud GateWay是Spring Cloud的⼀个全新项⽬【SpringCloud
公司开发的】,⽬标是取代Netflix Zuul。
它基于Spring5.0+SpringBoot2.0+WebFlux(基于⾼性能的Reactor模式响应式通信框架Netty,异步⾮阻塞模型)等技术开发,性能⾼于Zuul。
官⽅测试,GateWay是Zuul的1.6倍,旨在为微服务架构提供⼀种简单有效的统⼀的API路由管理⽅式。
4. gateWay⼊门使⽤
4.-1 基本概念
路由:路由是构建⽹关的基本模块,它由ID,⽬标URI,⼀系列的断⾔Predicates和过滤器Filters组成,如果断⾔为true,则匹配该路由。
断⾔:参考Java8的java.util.function.Predicate,开发⼈员可以匹配HTTP请求中的所有内容,例如请求头或请求参数,如果请求与断⾔相匹配则进⾏路由。
过滤:Spring框架中GatewayFilter的实例,使⽤过滤器,可以在请求被路由前或后对请求进⾏修改。基于过滤器可以实现:安全,监控,限流等问题。
4.0 创建⼀个服务
ip配置为80端⼝,当访问这个服务,就是访问我们的getWay。
# 服务端⼝
server.port=80
# 服务名
spring.application.name=service-gateway
4.1 请求转发的实现
导⼊依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
nginx和网关怎么配合使用<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
添加配置⽂件
server:
port: 9527
spring:
application:
name: springcloud-gateway
cloud:
gateway:
routes:              # routes 是路由,⼀个GateWay可以包含多个route
- id: to-user                  # 路由的id,必须唯⼀
uri: localhost:8002    # 路由地址,表⽰⽬标跳转⽬的路径
predicates:      # predicates  是断⾔,⼀个gateWay可以包含多个predicate
- Path=/*/user/**          # 断⾔规则,表⽰代理什么路径
# 上述表⽰:当访问 localhost:9527/XX/user/XX/XX 时会真正访问 localhost:8002/XX/user/XX/XX
---若有注册中⼼,按如下配置---
spring:
application:
name: springcloud-gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848  # 当有了注册中⼼时,⽹关也是⼀个服务,所以需要注册到注册中⼼去。
gateway:
discovery:
locator:
enabled: true    # 让gateway从nacos中获取服务信息
routes:              # routes 是路由,⼀个GateWay可以包含多个route
- id: to-user                      # 路由的id,必须唯⼀
uri: lb://springcloud-consumer    # lb 动态路由。因为有了注册中⼼,uri可以不像上⾯那样写死了。所以这⾥  *****后⾯跟要调⽤的服务名称,⽽不再是具体哪个地址******,因为你可能⽤了rabbon做负载均衡,会有多个不同的端⼝。但是你的          predicates:                      # predicates  是断⾔,⼀个ateWay可以包含多个predicate
- Path=/*/user/**              # 断⾔规则,表⽰代理什么路径
# 动态路由          GateWay⽀持动态路由。
路由断⾔⼯⼚:Spring Cloud Gateway包括许多内置的路由断⾔⼯⼚。所有这些断⾔都与HTTP请求的不同属性匹配。您可以将多个路由断⾔⼯⼚与逻辑 and 语句结合使⽤。
4.2 跨域问题的解决
在4.1 getWay服务下,创建全局配置类:
@Configuration
public class CorsConfig {
@Bean
public CorsWebFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedMethod("*");
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
return new CorsWebFilter(source);
}
}
or
spring:
cloud:
gateway:
globalcors: # 全局的跨域处理
add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
corsConfigurations:
'[/**]':
allowedOrigins: # 允许哪些⽹站的跨域请求
- "localhost:8090"
- "www.leyou"
allowedMethods: # 允许的跨域ajax的请求⽅式
- "GET"
- "POST"
- "DELETE"
- "PUT"
-
"OPTIONS"
allowedHeaders: "*" # 允许在请求中携带的头信息
allowCredentials: true # 是否允许携带cookie
maxAge: 360000 # 这次跨域检测的有效期
内置⽹关
⽹关(局部)过滤器
5. Gateway内置
Gateway分为Pre类型的过滤器和Post类型的过滤器。
Pre类型的过滤器在请求转发到后端微服务之前执⾏,在Pre类型过滤器链中可以做鉴权、限流等操作。
Post类型的过滤器在请求执⾏完成之后、将结果返回给客户端之前执⾏。
在Spring Cloud Gateway中内置了很多Filter,⾃定义Filter有两种实现,分别是GatewayFilter和GlobalFilter。
GlobalFilter全局过滤器会应⽤到所有的路由上。
GatewayFilter⽹关过滤器只会应⽤到单个路由或者⼀个分组的路由上。
5.1 Path路径过滤器(常⽤)
Path过滤器可以实现URL重写,通过重写URL可以实现隐藏真实路径提⾼安全性。
5.1.1 RewritePath⽹关过滤器
RewritePath⽹关过滤器⼯⼚采⽤路径正则表达式参数和替换参数,使⽤Java正则表达式来灵活地重写请求路径。
⽹关(全局)过滤器
6. Gateway内置
内置⽹关
前⾔:全局过滤器加上⽹关过滤器组成过滤器链,该过滤器链的执⾏顺序是根据@Order注解指定的数字⼤⼩,从⼩到⼤进⾏排序,数字越⼩,优先级越⾼。
# 对输出响应头设置属性
spring:
cloud:
gateway:
# 配置全局默认过滤器
default-filters:
# 往响应过滤器中加⼊信息
- AddResponseHeader=token,48945165
7. Gateway⾃定义
⽹关(局部)过滤器GatewayFilter
⾃定义⽹关
⽹关(全局)全局过滤器GlobalFilter
8. Gateway⾃定义
⾃定义⽹关
常见需求:⽤户需要登录了才放⾏。
⾃定义类实现 GlobalFilter , Ordered 接⼝,加上@Component注解即可;
@Component
public class MyCustomerGlobalFilter implements GlobalFilter ,Ordered {
// 参数1:ServerWebExchange是⼀个HTTP请求-响应交互的契约。提供对HTTP请求和响应的访问,并公开额外的服务器端处理相关属性和特性,如请求属性。  // 参数2:⽤于承载请求相关的属性和请求体,Spring Cloud Gateway中底层使⽤Netty处理⽹络请求。
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("⾃定义全局过滤器"); // 在这⾥⾯做逻辑处理,判断token,并验证账号密码
return chain.filter(exchange);
}
// 该⽅法⽤于声明该过滤器执⾏的优先级
@Override
public int getOrder() {  // 返回值越低,表⽰过滤器执⾏的优先级越⾼。
return -2;
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。