Spring cloud系列十三 服务网关Zuul

1. 概述

本文介绍Zuul的相关的内容,主要包括如下内容

  • 服务网关的作用
  • Spring Cloud集成Zuul的demo:包括配置各种各样的路由关系
  • 自定义Zuul的Filter

2. 服务网关Zuul的作用

服务网关的作用,其作用类似我们常用Ngnix

  • 1 对外提供统一的REST API接口,收缩所有的服务到服务网关后面
  • 2 放置到对外访问的前端,可以做权限验证
  • 3 可以做均衡负载器
  • 4 可以做服务路由的功能

3. Spring Cloud集成Zuul的demo

3.1. 相关的工程说明

cloud-registration-center
注册中心,比较简单,这里代码略

cloud-service-zuul
作为服务方的工程,提供服务的工程,这里代码略。其具体实现方法可以参数Spring cloud系列一 包含所有基本要素的完整Spring Cloud demo。这个服务的注册名称为”cloud-service-zuul”。此服务提供一个服务:URL为http://127.0.0.1:14606/zuul-test/simple

cloud-zuul
提供服务网关的功能。本工程我们演示通过各种配置实现访问cloud-zuul的URL达到访问cloud-service-zuul服务接口(URL为http://127.0.0.1:14606/zuul-test/simple)的目的

3.2. cloud-zuul工程

3.2.1. pom.xml:

引入zuul的依赖jar

<!-- 引入zuul-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
3.2.2. 启动类ZuulSimpleCloudApplication

@EnableZuulProxy:注解此服务为zuul代理服务

@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class ZuulSimpleCloudApplication {

    public static void main(String[] args) {
        args = new String[1];
        args[0] = "--spring.profiles.active=zuul-simple";
        SpringApplication.run(ZuulSimpleCloudApplication.class, args);
    }
….
}
3.2.3. @EnableZuulProxy和@EnableZuulServer

有一个和@EnableZuulProxy很相似的@EnableZuulServer,这里说明这两个异同:@EnableZuulProxy包括@EnableZuulServer的所有功能,@EnableZuulServer是@EnableZuulProxy的功能子集。@EnableZuulProxy比@EnableZuulServer的多了代理的功能

3.2.4. 属性文件

bootstrap-zuul-simple.yml
bootstrap-zuul-simple.yml :配置服务注册到注册中心,服务名称为cloud-zuul

# port
server:
  port: 14601

spring:
  application:
    # 本服务注册到注册到服务器的名称, 这个名称就是后面调用服务时的服务标识符
    name: cloud-zuul
eureka:
  client:
    serviceUrl:
      # 服务器注册/获取服务器的zone
      defaultZone: http://127.0.0.1:10761/eureka/
  instance:
    prefer-ip-address: true

application-zuul-simple.yml
配置URL的路由关系,下节会详细介绍

3.3. 详细的Zuul路由配置

属性配置在application-zuul-simple.yml,本节对配置进行详细说明
路由配置以“zuul.routes.**”开头

3.3.1. 默认配置的路由

如果我们没有配置任何路由,则zuul默认已经自动配置类似的关系:

"/服务名称/**":"服务名称"
"/cloud-service-zuul/**":"cloud-service-zuul"

此时:访问http://127.0.0.1:14601/cloud-service-zuul/zuul-test/simple等价于 http://127.0.0.1:14606/zuul-test/simple

3.3.2. 设置忽略哪些服务

如果设置为*,则相当于关闭默认路由

zuul:
  # 此参数设置忽略哪些服务,如果是*,则忽略所有服务
  ignoredServices: '*
3.3.3. 通过url直接映射

Zuul的规则为:/api-a-url/**的访问都映射到http://127.0.0.1:14606/
也就是说当我们访问http://127.0.0.1:14601/api-a-url/zuul-test/simple的时候,Zuul会将该请求路由到:http://127.0.0.1:14606/zuul-test/simple
对于url映射不是通过HystrixCommand执行,也不能通过ribbon进行负载,需要进行额外配置,详细见spring 文档

zuul:
  routes:
    # 此名称任意
    api-url:
      # 所有到Zuul的中规则为:/api-a-url/**的访问都映射到http://127.0.0.1:14606/上,
      # 也就是说当我们访问http://127.0.0.1:14601/api-a-url/zuul-test/simple的时候,Zuul会将该请求路由到:http://127.0.0.1:14606/zuul-test/simple
      path: /api-a-url/**
      # 对于url映射不是通过HystrixCommand执行,也不能通过ribbon进行负载,需要进行额外配置,详细见spring 文档
      url: http://127.0.0.1:14606
3.3.4. 通过服务名进行映射关系

所有访问/api-a/开头的URL都会转到服务 cloud-service-zuul上
如访问 http://127.0.0.1:14601//api-a//zuul-test/simple 等价于 http://127.0.0.1:14606/zuul-test/simple

zuul:
  routes:
    # 此名称任意
    api-application-name:
      # 服务名与服务实例地址的关系: 即 http://127.0.0.1:14601//api-a//zuul-test/simple 等介于 http://127.0.0.1:14606/zuul-test/simple
      path: /api-a/**
      url: cloud-service-zuul
3.3.5. 关于stripPrefix的值说明

默认值为true,如果设置为false,则重定向时,访问的新的URL,不删除path部分的前缀
如访问http://127.0.0.1:14601/zuul-test/simple 等价于 http://127.0.0.1:14606/zuul-test/simple
路径请不要使用/zuul测试,这是zuul自己预留的

zuul:
  routes:
    # 此名称任意
    api-strip-prefix:
      # http://127.0.0.1:14601/zuul-test/simple 等介于 http://127.0.0.1:14606/zuul-test/simple
      # 路径请不要使用/zuul测试,这是zuul自己使用的
      path: /zuul-test/**
      url: cloud-service-zuul
      # 默认值为true,如果设置为false,则重定向时,访问的新的URL,不删除path部分的前缀
      stripPrefix: false
3.3.6. 设置忽略以下的请求

忽略所有URL中二级路径是admin的请求

zuul:
  # 此参数可以设置忽略以下的请求
   ignoredPatterns: /**/admin/**
3.3.7. 关闭安全监管
management:
  security:
    # 关闭安全监管, 查看详细信息,可以访问这个接口 http://127.0.0.1:14601/routes
    enabled: false
3.3.8. 查看当前Zuul的所有配置的路由信息

先关闭安全监管,再访问这个接口 http://127.0.0.1:14601/routes,可以获取所有的当前的路由

{
    "/api-a-url/**":"http://127.0.0.1:14606/",
    "/api-a/**":"cloud-service-zuul",
    "/zuul-test/**":"cloud-service-zuul",
    "/cloud-service-zuul/**":"cloud-service-zuul",
    "/cloud-registration-center/**":"cloud-registration-center"
}
3.3.8. 测试

运行ZuulSimpleCloudApplication服务,可以进行以上的测试

4. 自定义Zuul的Filter

我们可以通过 ZuulFilter的扩展Zuul的功能,这是Zuul最强大的地方

4.1. ZuulFilter 接口说明

ZuulFilter各个方法的说明:

filterType() 方法
设置过滤器类型,主要有4类filter类型
- 1 pre:在请求被路由前被调用
- 2 routing:在路由请求时被调用
- 3 post:在routing和error过滤器之后被调用
- 4 error:发生异常时被调用

filterOrder()
设置执行的顺序,值越小越早执行。不同过滤器的值可以相同

shouldFilter()
这个方法决定是否启用这个过滤器,可以通过配置属性完成

run()
真正的处理逻辑

4.2. 自定义ZuulFilter

我们定义一个ZuulFilter ,功能是在请求被路由前打印请求的IP地址
详细内容见代码

@Component // 初始化过滤类,zuul启动时,会自动找到此filter
public class MyPreFilter extends ZuulFilter {
    @Override
    public String filterType() {
        // 设置过滤器类型:error post pre route
        return FilterConstants.PRE_TYPE;
    }

    @Override
    public int filterOrder() {
        // 设置执行的顺序,值越小越早执行。不同过滤器的值可以相同
        return FilterConstants.PRE_DECORATION_FILTER_ORDER  - 1; // run before PreDecoration
    }

    @Override
    public boolean shouldFilter() {
        // 这个方法决定是否启用这个过滤器,可以通过配置属性完成,这里简单测试,直接使用返回true
        return true;
    }

    @Override
    public Object run() {
        // 通过 RequestContext的getCurrentContext获取RequestContext对象可以进行相关的操作
        RequestContext ctx = RequestContext.getCurrentContext();
        // 这里只打印一些请求信息
        HttpServletRequest request = ctx.getRequest();
        System.out.println("================ MyPreFilter begin================");
        System.out.println("请求来源:" + request.getRemoteAddr() + ":" + request.getRemotePort());
        System.out.println("================ MyPreFilter end================");
        return null;
    }

4.3. 启动类ZuulFilterCloudApplication

@EnableZuulProxy:注释此类

@SpringBootApplication
@EnableEurekaClient // 配置本应用将使用服务注册和服务发现
@EnableZuulProxy
public class ZuulFilterCloudApplication {

    public static void main(String[] args) {
        args = new String[1];
        args[0] = "--spring.profiles.active=zuul-filter";
        SpringApplication.run(ZuulFilterCloudApplication.class, args);
    }
…
}

4.4. 配置参数

application-zuul-filter.yml

zuul:
  routes:
    api-url:
      # 通过url直接映射
      # 所有到Zuul的中规则为:/api-a-url/**的访问都映射到http://127.0.0.1:14606/上,
      # 也就是说当我们访问http://127.0.0.1:14602/api-url/zuul-test/simple的时候,Zuul会将该请求路由到:http://127.0.0.1:14606/zuul-test/simple
      path: /api-url/**
      # 对于url映射不是通过HystrixCommand执行,也不能通过ribbon进行负载,需要进行额外配置,详细见spring 文档
      url: http://127.0.0.1:14606/

4.5. 测试

访问http://127.0.0.1:14602/api-url/zuul-test/simple
控制台输出:说明我们filter启作用了

================ MyPreFilter begin================
请求来源:127.0.0.1:54256
================ MyPreFilter end================

5. 代码

以上的详细的代码见下面
github代码,请尽量使用tag v0.10,不要使用master,因为我不能保证master代码一直不变

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值