SpringCloud 之Gateway组件详解(下)

简介: SpringCloud 之Gateway组件详解

根据权重

权重通常会有多个路由规则来组成,多个路由之间进行一个百分比的权重

权重需要配置两个参数,第一个参数是组名,第二个是权重值,多个路由如果是在一组中那么组名需要相同

spring:
  cloud:
    gateway:
      routes:
      - id: weight_high
        uri: https://weighthigh.org
        predicates:
        - Weight=group1,8
      - id: weight_low
        uri: https://weightlow.org
        predicates:
        - Weight=group1,2

该路由会将约 80% 的流量转发到weighthigh.org,将约 20% 的流量转发到weightlow.org

自定义断言工厂实现

首先在配置文件中添加如下,表示参数age年龄的范围,在这之间符合要求。

 gateway:
      routes: #路由数组,指当请求满足什么样的条件转发到哪个微服务上
        - id: order_router #当前路由标识,要求唯一
          uri: lb://provider #请求最终要被转发的地址,lb指的是从nacos中按照名称获取微服务,并按照负载均衡策略
          order: 1 #路由的优先级,数字越小代表路由的优先级越高
          predicates: #断言(条件判断,返回值是boolean,转发请求要满足的条件)
            - Path=/orderservice/**
            - Age=18,60
          filters:
            - StripPrefix=1

自定义代码实现如下

@Component
public class AgeRoutePredicateFactory extends AbstractRoutePredicateFactory<AgeRoutePredicateFactory.Config> {
    //断言逻辑
    public Predicate<ServerWebExchange> apply(AgeRoutePredicateFactory.Config config) {
        return new Predicate<ServerWebExchange>() {
            @Override
            public boolean test(ServerWebExchange serverWebExchange) {
                String age = serverWebExchange.getRequest().getQueryParams().getFirst("age");
                if(age!=null){
                    int myage = Integer.parseInt(age);
                    if(myage>config.minAge&&myage<config.maxAge)
                        return true;
                    else
                        return false;
                }
                return false;
            }
        };
    }
    public AgeRoutePredicateFactory() {
        super(AgeRoutePredicateFactory.Config.class);
    }
    //读取配置文件中的参数值,赋值到配置类上的属性上
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("minAge","maxAge");//这个位置的顺序必须和配置文件中的顺序对应
    }
    //用于接收配置文件中的对应参数
    @Data
    @NoArgsConstructor
    public static class Config{
        private int minAge;
        private int maxAge;
    }
}

1.2.5 过滤器

过滤器就是对于请求和响应做一些手脚。作用流程如下图:


从过滤器生命周期(影响时机点)的⻆度来说,主要有两个pre和post:

pre:这种过滤器在请求被路由之前调用。我们可以利用这类过滤器实现身份验证、在集群中选择 请求的微服务、记录调试信息等。

post:这种过滤器在路由到微服务以后执行。这类过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端。


从过滤器作用范围的角度来说,可分为另外两种,一种是针对于单个路由的gateway filter,它在配置文件中的写法同predict类似;另外一种是针对于所有路由的global gateway filer。现在从作用范围划分的维度来讲解这两种filter。


image.png


区别:

GatewayFilter:网关过滤器,需要通过spring.cloud.routes.filters配置在具体的路由下,只作用在当前特定路由上,也可以通过配置spring.cloud.default-filters让它作用于全局路由上。

GlobalFilter:全局过滤器,不需要再配置文件中配置,作用在所有的路由上,最终通过GatewayFilterAdapter包装成GatewayFilterChain能够识别的过滤器。



内置局部过滤器

5233ada672d64988a9b87d10e0ddbffd.png


全局过滤器


内置的全局过滤器如下图:


48d339d01a3d492abedc525c528ead5c.png


自定义全局过滤器


内置的过滤器已经可以完成大部分的功能,但是对于企业开发的一些业务功能处理,还是需要我们自己编写过滤器来实现的,那么我们一起通过代码的形式自定义一个过滤器,去完成统一的权限校验。

开发中的鉴权逻辑:

1.当客户端第一次请求服务时,服务端对用户进行信息认证(登录)

2.认证通过,将用户信息进行加密形成token,返回给客户端,作为登录凭证·以后每次请求,客户端都携带认证的token

3.服务端对token进行解密,判断是否有效。


如下图:


59d887ac4e3b4856ab3d856ac092aea8.png



自定义代码如下

@Component
@Order(-1)//越小优先级越高
@Slf4j
public class Filter implements GlobalFilter {
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = exchange.getRequest().getQueryParams().getFirst("token");
            if(token==null||!token.equals("admin")){
                //认证失败
                log.error("认证失败");
                exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
                return exchange.getResponse().setComplete();
            }
        return chain.filter(exchange);
    }
}
相关文章
|
5天前
|
SpringCloudAlibaba JavaScript 前端开发
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
分布式组件、nacos注册配置中心、openfegin远程调用、网关gateway、ES6脚本语言规范、vue、elementUI
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
|
6天前
|
负载均衡 Java Nacos
SpringCloud基础2——Nacos配置、Feign、Gateway
nacos配置管理、Feign远程调用、Gateway服务网关
SpringCloud基础2——Nacos配置、Feign、Gateway
|
17天前
|
安全 Java 开发者
强大!Spring Cloud Gateway新特性及高级开发技巧
在微服务架构日益盛行的今天,网关作为微服务架构中的关键组件,承担着路由、安全、监控、限流等多重职责。Spring Cloud Gateway作为新一代的微服务网关,凭借其基于Spring Framework 5、Project Reactor和Spring Boot 2.0的强大技术栈,正逐步成为业界的主流选择。本文将深入探讨Spring Cloud Gateway的新特性及高级开发技巧,助力开发者更好地掌握这一强大的网关工具。
71 6
|
1月前
|
负载均衡 监控 Java
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
|
2月前
|
负载均衡 Java Spring
Spring cloud gateway 如何在路由时进行负载均衡
Spring cloud gateway 如何在路由时进行负载均衡
288 15
|
2月前
|
Java Spring
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
59 3
|
2月前
|
Java 微服务 Spring
SpringCloud gateway自定义请求的 httpClient
SpringCloud gateway自定义请求的 httpClient
111 3
|
2月前
|
缓存 监控 Java
通用快照方案问题之Spring Boot Admin的定义如何解决
通用快照方案问题之Spring Boot Admin的定义如何解决
45 0
|
4月前
|
算法 NoSQL API
SpringCloud&Gateway网关限流
SpringCloud&Gateway网关限流
218 7
|
2月前
|
JSON 前端开发 Java
SpringCloud怎么搭建GateWay网关&统一登录模块
本文来分享一下,最近我在自己的项目中实现的认证服务,目前比较简单,就是可以提供一个公共的服务,专门来处理登录请求,然后我还在API网关处实现了登录拦截的效果,因为在一个博客系统中,有一些地址是可以不登录的,比方说首页;也有一些是必须登录的,比如发布文章、评论等。所以,在网关处可以支持自定义一些不需要登录的地址,一些需要登录的地址,也可以在网关处进行校验,如果未登录,可以返回JSON格式的出参,前端可以进行相关处理,比如跳转到登录页面等。