我是靠谱客的博主 冷静画笔,最近开发中收集的这篇文章主要介绍springcloud五大神兽之Gateway,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

① 什么是网关?
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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部