1. 概述
API网关是 一 个更为智能的应用服务器, 它的定义类似于面向对象设计模式中的Facade模式, 它的存在就像是整个微服务架构系统的门面 一 样,所有的外部客户端访问都需要经过它来进行调度和过滤。它除了要实现请求路由、 负载均衡、 校验过滤等功能之外, 还需要更多能力, 比如与服务治理框架的结合、 请求转发时的熔断机制、 服务的聚合等 一 系列高级功能。
SpringCloud Zuul通过与SpringCloudEureka进行整合, 将自身注册为Eureka服务治理下的应用, 同时从Eureka中获得了所有其他微服务的实例信息。 这样的设计非常巧妙地将服务治理体系中维护的实例信息利用起来, 使得将维护服务实例的工作交给了服务治理框架自动完成, 不再需要人工介入。
zuul的使用重点基本在于路由配置和过滤器。
2. 基本使用
1. 引入配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
2. 添加启动类
启动类加上注解@EnableZuulProxy,如果需要zuul自动实现容错,还需要加上@EnableHystrix
3. 配置文件
设置端口,应用名称,eureka地址等
4. 配置路由(可选)
默认情况下,zuul与eureka联合使用,zuul会自动读取eureka中注册的服务,并且自动代理。自定义的路由配置比如去除某个服务,添加前缀,自定义路由等,暂且不说。
5. 添加过滤器
编写类继承ZuulFilter,并配置到spring
6. 启动eureka,业务服务(service-A),zuul,
如果zuul端口为8883,则访问http://localhost:8883/service-A/api就可以看到响应的结果
3. 对Hystrix和Ribbon的支持
1. 添加容错
编写类实现ZuulFallbackProvider接口,getRoute方法返回服务的名称。ClientHttpResponse的getBody方法可以给前台返回错误信息。需要注意的是,这个容错只有在服务掉线或者超时才会触发。
4. 过滤器详解
zuul共有四种过滤器,分别是pre,route,post和error过滤器。具体如下图所示:
首先它会进入第 一 个阶段pre, 在这里它会被pre类型的过滤器进行处理, 该类型过滤器的主要目的是在进行请求路由之前做 一 些前置加工, 比如请求的校验等。
在完成了pre类型的过滤器处理之后, 请求进入第二个阶段rou巨ng, 也就是之前说的路由请求转发阶段, 请求将会被routing类型过滤器处理。这里的具体处理 内容就是将外部请求转发到具体服务实例上去的过程, 当服务实例将请求结果都返回之后, routing 阶段完成, 请求进入第三个阶段post。
此时请求将会被post类型的过滤器处理,这些过滤器在处理的时候不仅可以获取到请求信息, 还能获取到服务实例的返回信息, 所以在 post类型的过滤器 中, 我们可以对处理结果进行一 些加工或转换等内容。
另外, 还有 一 个特殊的阶段error, 该阶段只有在上述三个阶段中发生异常的时候才会触发,但是它的最后流向还是 po江类型的过滤器,因为它需要通过post过滤器将最终结果返回给请求客户端
过滤器的异常处理,主要是error过滤器,在此先不详细描述
5. 禁用过滤器
zuul.AccessFilter.pre.disable = true
6. 动态路由
通过配置中心实现
7. 动态过滤器
通过动态语言groovy实现