网小鱼Java的bug小集锦0030-springCloud中整合nacos中网关gateway配置路径错误记录

在SpringCloud中要通过nacos进行服务的发现,注册,还需要进行routes进行路由地址的配置,在配置routes的路由地址的时候,需要关注id要匹配,uri的路径必须是已经在nacos服务器当中已经注册好了,并且可以是可以正常提供服务的,在保证前面几个条件的情况下,我这里配置了predicates(匹配规则)的内容,但是,这里在编写匹配规则predicates的时候,由于不懂编写原理,还是犯了一个错误,先来截图看一下,后台访问localhost报的错误:
在这里插入图片描述
刚开始看到这这个问题的时候,我查了一些资料,给出的答案都是跨域问题导致的,但是检查了配置网关和文件中的跨域设置并没雨偶发现问题,回到后端代码,这里的报错信息就很明显了:
在这里插入图片描述
这里很明显是告知是:没有通过path路径,这时候因为不太清楚这里gateway的bootstrap文件中predicates部分的配置规则有哪些易错点,就去搜索了一下,看到一个小伙伴报了同样的错误,照着方法解决了一下:就是配置路径中空格问题,解决的过程截图如下:

在这里插入图片描述
解决之后,在此通过nacos进行服务间的调用就正常了,截图如下:在这里插入图片描述

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210604192337304.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzU1Mjg0NTI0,size_16,color_FFFFFF,t_70

SpringCloud中gateway网关中的priedicates文件的配置规范:

什么是谓词?predicates

即java.util.function.Predicate这个接口,Gateway使用Predicate实现路由的匹配条件
我打开了源码看了一下,在JAVA的nextflix中是这样定义的:

/**
 * A predicate that is composed from one or more predicates in "AND" relationship.
 * It also has the functionality of "fallback" to one of more different predicates.
 * If the primary predicate yield too few filtered servers from the {@link #getEligibleServers(List, Object)}
 * API, it will try the fallback predicates one by one, until the number of filtered servers
 * exceeds certain number threshold or percentage threshold. 
 * 
 * @author awang
 *
 */

其中它里面的主要方法,属性也来截图mark了解一下:
在这里插入图片描述

这里的意思来理解一下:
由一个或多个“与”关系中的谓词组成的谓词。它还具有“回退”到多个不同谓词之一的功能。如果主谓词从{@link #getEligibleServers(List, Object)}中产生的过滤服务器太少API,它会一个接一个地尝试回退谓词,直到被过滤的服务器数量,超过某个数量阈值或百分比阈值。

再翻译理解的直白一点就是:
所谓的"谓词"就是一个个的"过滤条件",如果一个对象想要调用目标服务器,那么久需要经过"重重关卡"的考验,满足这些1,2,3,4,5…这些条件,如果其中只满足了条件1,2,3,而没有满足后面的条件4,5…那么,不好意思,你这个对象就不能够经过我这里的"关卡",也就是不能够通过我这里去访问到你的目标服务器获取相应的服务.所以从本质上面来理解,就是这SpringMVC中的filter有异曲同工之妙,如果在servlet进入前端控制器后没有通过filter过滤器的考验,那么后面的@controller,和@service以及@Mapper里面的服务也就不能够获取啦.

 谓词逻辑的设计是怎样的?

如果往上面再刨一层,可以先看一下它里面的源码:

package com.google.common.base;

import com.google.common.annotations.GwtCompatible;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import org.checkerframework.checker.nullness.qual.Nullable;

@FunctionalInterface
@GwtCompatible
public interface Predicate<T> extends java.util.function.Predicate<T> {
    @CanIgnoreReturnValue
    boolean apply(@Nullable T var1);

    boolean equals(@Nullable Object var1);

    default boolean test(@Nullable T input) {
        return this.apply(input);
    }
}

实际上谓词这个接口里面只有3个需要实现的方法,而这三个全部是属于boolean类型的判断:
boolean apply(检测是否是这个应用)—是不是有我要的东西?
boolean equals(检测是否符合条件,或者理解为和这个条件相等)----你的东西和我要的东西是不是一模一样?
boolean test(这个不是特别理解,字面意思是不是用来做测试用的???)

总结一下:
谓词实际上就是一个个"判断",符合判断条件,OK,对象通过请求,前往下一个条件进行判断,知道所有的条件都满足,可获取服务,就像最开始我的代码中,几个谓词逻辑条件:如果第一个的pathway没有通过"条件判断",那么下面的代码:
before(判断对象的请求时间是否在某某时间之前)
method(判断请求的方式是不是post方式)
Query(判断有没有传入一个name进来)
如果第一步判断失败了,后面的判断直接就不进行了,所以这个里面的思想也是一种"链式过滤器"的思想,如果起个环节出现问题,那么请求立即会失败,这也是过滤器重重关卡最有力的一层保障,保证传入的不是"恶意的\不健康\不符合条件的请求"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值