Zuul例子配置文件

spring.application.name=switch-gateway

server.port=5555

请求路由

传统路由方式

zuul.routes.api-a-url.path=/api-a-url/**

zuul.routes.api-a-url.url=http://localhost:8080

转发规则如下:

访问链接

http://localhost:5555/api-a-url/hello

转发到

http://localhost:8080/hello

上面是单实例配置,多实例配置如下

zuul.routes.api-a.path=/api-a/**

zuul.routes.api-a.serviceId=hello-service

#没有eureka,所以置为false

ribbon.eureka.enabled=false

hello-service.ribbon.listOfServers=http://localhost:8080/,http://localhost:8081/

面向服务的路由方式

结合eureka的发现服务功能,实现如下

zuul.routes.api-a.path=/api-a/**

zuul.routes.api-a.serviceId=hello-service

zuul.routes.api-b.path=/api-b/**

zuul.routes.api-b.serviceId=hello-client

eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka

分别有服务hello-service和hello-client在eureka上注册

访问链接

http://localhost:5555/api-a/hello

会转发到服务hello-service的某个实例上去

服务路由默认配置规则

如果没有以下配置

zuul.routes.api-a.path=/api-a/**

zuul.routes.api-a.serviceId=hello-service

则会生成默认的配置如下

http://localhost:5555/hello-service/hello

即网关路径+服务实例名+访问路径

可通过设置如下取消默认配置规则

zuul.ignored-services=*

忽略表达式配置

如果设置了配置项如下

zuul.routes.api-a.path=/api-a/**

zuul.routes.api-a.serviceId=hello-service

所有访问路径/api-a/**都会被路由,但是如果有一个特定的路径/api-a/abc并不想被路由,则只需要配置如下

zuul.ignored-patterns=/**/abc/**

zuul路由时带上cookie和头部信息

zuul在默认情况下会过滤掉http请求头信息的一些敏感信息,防止传递到下游服务器。默认的敏感头信息通过zuul.sensitiveHeaders参数定义,包括Cookie、set-cookie、authorization三个属性。所以cookie在默认的zuul中是不会传递的,这样会影响到一些登录鉴权的场景。可以通过以下设置,让cookie可以传递:

zuul.routes.<router>.customSensitiveHeaders=true

或者

zuul.routes.<router>.sensitiveHeaders=

Hystrix和Ribbon支持

Zuul本身就有线程隔离和断路器的自我保护功能,以及负载均衡功能(前提是配置采用path和serviceId的方式)

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=120000

该参数可以用来设置api网关中路由转发请求的hystrixCommand执行超时时间

ribbon.ConnectTimeout=60000

该参数用来设置路由转发请求的时候,创建请求链接的超时时间。如果该值小于第一个值如果链接超时会自动重试,重试失败会抛出错误。

ribbon.ReadTimeout=60000

该参数用来设置路由转发请求的超时时间。如果该值小于第一个值如果链接超时会自动重试,重试失败会抛出错误。

如果不想要重试机制,可以如下配置

zuul.retryable=false

zuul.routes.<router>.retryable=false

第一个是关闭全局的,第二个是关闭指定的。

Zuul过滤器详解

过滤器的类别有

pre:可以在请求被路由之前调用

route:在路由被请求时调用

post:在route和error过滤器之后调用

error:处理请求时发生错误时被调用

路由请求时发生异常后自定义处理方法,可以定义个error类型的filter来实现。

可以通过以下配置项,来禁用过滤器

zuul.<SimpleClassName>.<filterType>.disable=true

请求过滤拦截

在路由转发前实现token、权限等鉴权验证(场景例如:普通操作人员oper可以访问/order/**,不可以访问/refund/**链接,超级管理人员admin可以访问所有)

@Component

public class AccessControlFilter extends ZuulFilter {

    @Override

    public boolean shouldFilter() {

        //该过滤器是否需要被执行

        return true;

    }

    @Override

    public Object run() throws ZuulException {

        //过滤器的具体逻辑

        RequestContext rc = RequestContext.getCurrentContext();

        HttpServletRequest req = rc.getRequest();

        //根据req参数做权限校验

        String accessType = req.getParameter("accessType");

        if(!StringUtils.equals("success", accessType)) {

            //拒绝通过

            rc.setSendZuulResponse(false);

            rc.setResponseStatusCode(401);

            rc.setResponseBody("自定义返回内容");

            return null;

        }

        //可以通过

        return null;

    }

    @Override

    public String filterType() {

        //过滤器类型,pre代表会在请求被路由之前执行

        return "pre";

    }

    @Override

    public int filterOrder() {

        //过滤器的执行次序

        return 0;

    }

}

总结网关的有点如下:

1.屏蔽所有微服务的实现细节,提供统一入口

2.与微服务治理框架结合,实现自动化服务实例维护和负载均衡

3.鉴权功能和业务分离

网关服务spring cloud zuul的更多相关文章

  1. SpringCloud---API网关服务---Spring Cloud Zuul

    1.概述 1.1 微服务架构出现的问题   及  解决: 1.1.1 前言 每个微服务应用都提供对外的Restful API服务,它通过F5.Nginx等网络设备或工具软件实现对各个微服务的路由与负载 ...

  2. 网关服务Spring Cloud Gateway(二)

    上一篇文章服务网关 Spring Cloud GateWay 初级篇,介绍了 Spring Cloud Gateway 的相关术语.技术原理,以及如何快速使用 Spring Cloud Gateway ...

  3. 网关服务Spring Cloud Gateway(一)

    Spring 官方最终还是按捺不住推出了自己的网关组件:Spring Cloud Gateway ,相比之前我们使用的 Zuul(1.x) 它有哪些优势呢?Zuul(1.x) 基于 Servlet,使 ...

  4. 网关服务Spring Cloud Gateway(三)

    上篇文章介绍了 Gataway 和注册中心的使用,以及 Gataway 中 Filter 的基本使用,这篇文章我们将继续介绍 Filter 的一些常用功能. 修改请求路径的过滤器 StripPrefi ...

  5. Consul集群加入网关服务(Spring Cloud Gateway)

    Consul集群加入网关服务 架构示意图 外部的应用或网站通过外部网关服务消费各种服务,内部的生产者本身也可能是消费者,内部消费行为通过内部网关服务消费. 一个内部网关和一个外部网关以及一个Consu ...

  6. Spring Cloud Zuul 1(API 网关服务)

    API网关是一个更为智能的应用服务器,它的存在就像是整个微服架构系统的门面一样,所有的外部客户端访问都需要经过它来进行调度和过滤. 它实现的功能包括:请求路由.负载均衡.校验过滤等功能. Spring ...

  7. Spring Cloud Zuul 网关使用与 OAuth2.0 认证授权服务

    API 网关的出现的原因是微服务架构的出现,不同的微服务一般会有不同的服务地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题: 客户端会 ...

  8. 第七章 API网关服务:Spring Cloud Zuul

    API网关是一个更为智能的应用服务器, 它的定义类似于面向对象设计模式中的Facade模式, 它的存在就像是整个微服务架构系统的门面一样,所有的外部客户端访问都需要经过它来进行调度和过滤.它除了要实现 ...

  9. Spring Cloud 微服务二:API网关spring cloud zuul

    前言:本章将继续上一章Spring Cloud微服务,本章主要内容是API 网关,相关代码将延续上一章,如需了解请参考:Spring Cloud 微服务一:Consul注册中心 Spring clou ...

随机推荐

  1. PHP中的MySQLi扩展学习(一)MySQLi介绍

    关于 PDO 的学习我们告一段落,从这篇文章开始,我们继续学习另外一个 MySQL 扩展,也就是除了 PDO 之外的最核心的 MySQLi 扩展.可以说它的祖先,也就是 MySQL(原始) 扩展是我们 ...

  2. navicat导出DDL语句

    工作中有的时候需要将某个库中的表.视图.函数.存储过程等创建语句导出,又不需要表中的数据. 方法一:需要拷贝的创建语句条数不多,可以选择直接拷贝DDL语句 方法二:使用Navicat的备份功能

  3. Charles抓包工具断点修改返回内容

    在测试过程中,往往需要让服务器返回指定的内容,测试一些特殊情况.例如列表内容为空.数据异常的情况等.如果通过操作服务器配合构造相应的数据会比较麻烦,甚至不好构造数据.此时,可以使用Charles的断点 ...

  4. Jmeter压测学习5---HTTP Cookie管理器

    我司项目暂时不需要,直接转载:https://www.cnblogs.com/yoyoketang/p/11963342.html 前言 web网站的请求大部分都有cookies,jmeter的HTT ...

  5. easy-rule 学习

    Easyrule是个规则引擎,类似于drools,我们来熟悉一下这个东西 [ ] 一个简单实例规则,这个规则会被一直触发,然后行为是打印helloWorld @Rule(name="hell ...

  6. android 使用SQLite的基本操作

    Android操作数据库SQLite使用sql语句基本操作 1:自定义自己的SQLiteOpenHelper public class DBHelper extends SQLiteOpenHelpe ...

  7. 几何 三垂模型 及 正方形 及 弦图 及 jio拉jio模型 及 中位线

    Q:$AO\bot OB,AO=OB,CO\bot OD,CO=OD,BC\bot EF$ 求证 $E$ 为 $AD$ 中点 A:作如图 $AI\bot IH\bot HD$ $\because AO ...

  8. redis学习笔记-02 list列表类型命令

    一.lpush key value1 value2 value3 value4(命令将一个或多个值插入到列表头部. 如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作) lpush k1 ...

  9. 【java】关键字this怎么用?

    摘至:https://www.php.cn/java/guide/462643.html java中this关键字的用法:1.当成员变量和局部变量重名时,在方法中使用this时,表示的是该方法所在类中 ...

  10. ShutdownHook原理

    微信搜索"捉虫大师",点赞.关注是对我最大的鼓励 ShutdownHook介绍 在java程序中,很容易在进程结束时添加一个钩子,即ShutdownHook.通常在程序启动时加入以 ...