Zuul

zuul本质:通过过滤器实现服务映射、请求转发、权限校验...

----------------

路由规则

在zuul配置中,为服务提供者添加路由规则,外部请求网关暴露的服务对应地址,网关自动路由到实际的服务地址(通过过滤器,借助eureka和ribbon实现转发)

zuul网关服务作为eureka的客户端时,会自动发现服务列表,并自动为每个服务创建一个默认路由规则,不需要手动配置,自动配置项格式如下:

zuul.routes.serviceAAA.path=/serviceAAA/**

zuul.routes.serviceAAA.url=serviceAAA

路由规则是按LinkedHashMap有序存储,如果某个请求匹配多个路由规则,则按照第一个匹配进行路由。properties文件不能保证有序,yaml文件可以 

----------------

去除路由规则

即不通过网关对外暴露服务serviceAAA

zuul.ignore-services=serviceAAA

----------------

请求过滤

继承ZuulFilter实现过滤器,实现4个方法

在run()中执行具体的过滤逻辑,比如判断request的session中是否存在登录信息;

在shouldFilter()中判断过滤器是否要对当前请求生效,比如此过滤器只针对某些服务的请求进行过滤;

---------------

过滤器详解

按生命周期划分过滤器类型:pre、routing、post、error

流程:request -> pre -> routing -> service实例 -> routing -> post -> response,若过滤链中抛出异常则 -> error 再-> post

try{
    preRoute();
}catch(ZuulException e){
     error();
     postRoute();  
}
try{
    route();
}catch(ZuulException e){
     error();
     postRoute();  
}
try{
    postRoute();
}catch(ZuulException e){
     error();
}
过滤器执行异常处理流程

postRoute()过滤器抛异常后进入error()过滤器,然后不再进postRoute()过滤器,直接返回了。请求收不到响应,也没有异常信息

通过实现一个只处理post过滤器抛出异常的error()过滤器进行兜底P251

又遇到新的问题:怎么知道是post过滤器抛出的异常?自定义一个FilterProcessor,记录下来P253

---------------

过滤器异常处理机制 P244

自定义的过滤器中的run方法要用try catch包起来,若抛出异常则必须在catch中 对上下文信息设置异常参数,才能被后续的核心过滤器SendErrorFilter(P243它是post类型不是error类型过滤器)处理

--------------

动态路由

由于网关服务A不能停机,利用SpringCloudConfig构建配置中心服务B,将git作为配置存储地

1.服务A在配置bootstrap.properties中指定去哪里加载,即指定配置中心服务B的地址

2.修改git中修改A.properties文件,推送到git仓库

3.服务A中手动访问/refresh刷新配置

--------------

动态过滤器(groovy,不是重点)

原文地址:https://www.cnblogs.com/yfzhou528/p/13536713.html