概述
① 什么是网关?
API 网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过 API 网关这一层。
网关的出现原因是伴随微服务架构的出现而出现,因为不同的微服务一般有不同的网络地址(ip+port),但客户端的一个请求可能需要多个微服务的接口互调才可以实现。
它是Spring Cloud团队的一个全新项目,基于Spring 5.0、SpringBoot2.0、Project Reactor 等技术开发的网关。 旨在为微服务架构提供一种简单、有效、统一的API路由管理方式。
目标是替代Netflix Zuul。Gateway不仅提供统一路由方式,并且基于Filter链的方式提供网关的基本功能。例如:安全,监控/指标,和限流
② 网关可以做什么?
如果让客户端直接与各个微服务通信,存在下列问题:
客户端会多次请求不同的微服务,增加了客户端的复杂性。(客户端维护微服务的ip+port)
存在跨域请求,在一定场景下处理相对复杂。
认证复杂,每个服务都需要独立认证。
难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信,那么重构将会很难实施。
某些微服务可能使用了防火墙 / 浏览器不友好的协议,直接访问会有一定的困难。
网关的出现可以帮助开发者解决上述问题。
③ 网关的优点?
易于监控。可以在网关收集监控数据并将其推送到外部系统进行分析。
易于认证。可以在网关上进行认证,然后再将请求转发到后端的微服务,而无须在每个微服务中进行认证。
减少了客户端与各个微服务之间的交互次数
2.11 GateWay案例演示
0 明确点
Gateway作为springcloud的网关组件,它本身也是一个微服务,是专门用来处理客户端请求的,对于EurekaServer注册中心来说,网关微服务也是客户端,它也需要交给注册中心管理。
① 创建网关微服务项目
(1)创建gateway_service网关项目,导入依赖
<dependencies>
<!--网关依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- Eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
② 标注启动类为注册中心客户端
@SpringBootApplication
@EnableDiscoveryClient
public class GateWayApplication {
public static void main(String[] args) {
SpringApplication.run(GateWayApplication.class,args);
}
}
③ 编写application.yml配置文件,配置基础路由
#配置网关服务端口
server:
port: 8084
#配置网关服务的名称
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
- id: user-service #id是唯一标识,可以任意起名
uri: http://127.0.0.1:8081 #此时的路由地址是写死的,只能访问一个微服务
predicates:
#/user/**所有以/user开始的请求都将被路由到uri指定的服务地址
- Path=/user/**
#指定eureka的注册中心地址
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:7001/eureka
④ 启动网关服务,测试
我们通过访问http://localhost:8084/user/find/1,通过网关配置路由到http://localhost:8081/user/find/1
⑤ 动态路由
之前说上面的路由方式是将微服务写死的,实际开发中我们的微服务如果是集群方式,那么静态路由就不再方便使用了,下面我们就看下动态路由如何配置!!!
#配置网关服务的名称
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
- id: user-service #id是唯一标识,可以任意起名
#uri: http://127.0.0.1:8081 #此时的路由地址是写死的,只能访问一个微服务
#lb协议表示从Eureka注册中心获取服务请求地址 lb://服务名称
#路由地址如果通过lb协议加服务名称时,会自动使用负载均衡访问对应服务
uri: lb://user-producer
predicates:
#/user/**所有以/user开始的请求都将被路由到uri指定的服务地址
- Path=/user/**
测试:负载均衡Ribbon(默认轮询)
路由配置中uri所用的协议为lb时,gateway将把user-producer解析为实际的主机和端口,并通过Ribbon进行负载均衡
1默认过滤器
Gateway api网关服务 参数解释:
Route(路由):路由是网关的基本单元,由ID、URI、一组Predicate、一组Filter组成,根据Predicate进行匹配转发。
Predicate(谓语、断言):路由转发的判断条件
Filter(过滤器):过滤器是路由转发请求时所经过的过滤逻辑,可用于修改请求、响应内容。
① 过滤器作用
过滤器作为Gateway的重要功能。常用于请求鉴权、服务调用时长统计、修改请求或响应header、限流、去除路径等
② 过滤器分类
(1)默认过滤器 出厂自带 已经实现好的,可以直接使用
全局默认过滤器
局部默认过滤器
(2)自定义过滤器
全局自定义过滤器
局部自定义过滤器
(3)全局过滤器和局部过滤器区别
全局是对所有的id有效,局部只是对某一个id有效
③ 全局过滤器案例演示
需求一:使用全局过滤器,实现对输出响应头设置属性
(1)配置网关服务中的application文件
#配置网关服务的名称
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
- id: user-service #id是唯一标识,可以任意起名
#uri: http://127.0.0.1:8081 #此时的路由地址是写死的,只能访问一个微服务
#lb协议表示从Eureka注册中心获取服务请求地址 lb://服务名称
#路由地址如果通过lb协议加服务名称时,会自动使用负载均衡访问对应服务
uri: lb://user-producer
predicates:
#/user/**所有以/user开始的请求都将被路由到uri指定的服务地址
- Path=/user/**
default-filters: #配置默认全局过滤器
- AddResponseHeader=X-Response-Default-MyName,swk
(2)访问测试
④ 局部过滤器案例演示
需求一:添加路径前缀
(1)修改网关服务的application文件,添加前缀路径
#配置网关服务的名称
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
- id: user-service #id是唯一标识,可以任意起名
#uri: http://127.0.0.1:8081 #此时的路由地址是写死的,只能访问一个微服务
#lb协议表示从Eureka注册中心获取服务请求地址 lb://服务名称
#路由地址如果通过lb协议加服务名称时,会自动使用负载均衡访问对应服务
uri: lb://user-producer
predicates:
#/user/**所有以/user开始的请求都将被路由到uri指定的服务地址
#- Path=/user/**
- Path=/** #注意:这个要修改
filters: #局部过滤器添加前缀
- PrefixPath=/user
default-filters: #配置默认全局过滤器
- AddResponseHeader=X-Response-Default-MyName,swk
(2)路由地址信息:
(3)测试
需求二:去除路径前缀
注意:去除前缀和添加前缀不可以同时使用
(1)修改网关服务的application文件,去除前缀路径
#配置网关服务的名称
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
- id: user-service #id是唯一标识,可以任意起名
#uri: http://127.0.0.1:8081 #此时的路由地址是写死的,只能访问一个微服务
#lb协议表示从Eureka注册中心获取服务请求地址 lb://服务名称
#路由地址如果通过lb协议加服务名称时,会自动使用负载均衡访问对应服务
uri: lb://user-producer
predicates:
#/user/**所有以/user开始的请求都将被路由到uri指定的服务地址
#- Path=/user/**
- Path=/**
filters:
#- PrefixPath=/user #添加前缀
- StripPrefix=1 #去除前缀(添加和去除不可以同时使用)
default-filters: #配置默认全局过滤器
- AddResponseHeader=X-Response-Default-MyName,swk
(2)路由地址信息
(3)测试
2自定义过滤器
① 自定义全局过滤器
需求:模拟登陆校验
基本逻辑:如果请求中有Token参数,则认为请求有效放行,如果没有则拦截提示授权无效
(1)在网关服务中,编写全局过滤器
@Component
public class LoginGlobalFilter implements GlobalFilter, Order {
@Override
public Class<? extends Annotation> annotationType() {
return null;
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
//从参数中获取token
String token = request.getQueryParams().getFirst("token");
if(StringUtils.isEmpty(token)){
//token不存在,则没有登录,状态设置401
response.setStatusCode(HttpStatus.UNAUTHORIZED);
//结束请求
return response.setComplete();
}
//带有token,直接放行
return chain.filter(exchange);
}
/***
* 定义过滤器执行顺序
* 返回值越小,越靠前执行
* @return
*/
@Override
public int value() {
return 0;
}
}
(2)访问接口测试,带token和不带token
② 自定义局部过滤器
自定义局部过滤器,该过滤器在控制台输出配置文件中指定名称的请求参数及参数的值。
局部过滤器作用范围:该局部过滤器在哪个id下配置,则该局部过滤器只针对该id的路由规则有效。
(1)编写自定义局部过滤器
//注意:局部过滤器类起名时MyParam后面部分是固定的,主要是前面部分
@Component
public class MyParamGatewayFilterFactory extends AbstractGatewayFilterFactory {
/**
* 拦截当前id对应的请求
* @param config
* @return
*/
@Override
public GatewayFilter apply(Object config) {
return new GatewayFilter() {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("局部拦截器!!!");
return chain.filter(exchange);
}
};
}
/***
* 构造函数
*/
public MyParamGatewayFilterFactory() {
super(MyParamGatewayFilterFactory.Config.class);
}
/****
* 在该类执行初始化后,可以在这里执行相关初始化操作
*/
public static class Config {
}
}
(2)指定使用局部过滤器
#配置网关服务的名称
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
- id: user-service #id是唯一标识,可以任意起名
#uri: http://127.0.0.1:8081 #此时的路由地址是写死的,只能访问一个微服务
#lb协议表示从Eureka注册中心获取服务请求地址 lb://服务名称
#路由地址如果通过lb协议加服务名称时,会自动使用负载均衡访问对应服务
uri: lb://user-producer
predicates:
#/user/**所有以/user开始的请求都将被路由到uri指定的服务地址
#- Path=/user/**
- Path=/**
filters:
#- PrefixPath=/user #添加前缀
- StripPrefix=1 #去除前缀(添加和去除不可以同时使用)
- MyParam #配置局部过滤器
default-filters: #配置默认全局过滤器
- AddResponseHeader=X-Response-Default-MyName,swk
(3)测试
3 总结
①掌握网关的作用
②会配置动态路由
③会配置过滤器
④能自定义全局过滤器
最后
以上就是冷静画笔为你收集整理的springcloud五大神兽之Gateway的全部内容,希望文章能够帮你解决springcloud五大神兽之Gateway所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复