微服务系列文章之Zuul网关

在微服务系列文章之服务发现的基础上。这里继续来讲解添加网关zuul到项目中去。

简介

Zuul is the front door for all requests from devices and web sites to the backend of the Netflix streaming application. As an edge service application, Zuul is built to enable dynamic routing, monitoring, resiliency and security. It also has the ability to route requests to multiple Amazon Auto Scaling Groups as appropriate.

Zuul 是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。

为什么需要网关?

从安全角度,避免暴露了我们实体机器的IP地址。
实用角度,可以动态维护服务列表。
API网关主要为了服务本身对外的调用该怎么调用来解决的,还有解决权限校验的问题,你可以在这里整合调用一系列过滤器的,例如整合shiro,springsecurity之类的东西。


微服务系列文章之Zuul网关_第1张图片

Zuul可以通过加载动态过滤机制,从而实现以下各项功能:

1.验证与安全保障: 识别面向各类资源的验证要求并拒绝那些与要求不符的请求。

2.审查与监控: 在边缘位置追踪有意义数据及统计结果,从而为我们带来准确的生产状态结论。

3.动态路由: 以动态方式根据需要将请求路由至不同后端集群处。

4.压力测试: 逐渐增加指向集群的负载流量,从而计算性能水平。

5.负载分配: 为每一种负载类型分配对应容量,并弃用超出限定值的请求。

6.静态响应处理: 在边缘位置直接建立部分响应,从而避免其流入内部集群。

7.多区域弹性: 跨越AWS区域进行请求路由,旨在实现ELB使用多样化并保证边缘位置与使用者尽可能接近。

Zuul在项目中的使用

步骤1

新建一个module,添加zuul依赖


微服务系列文章之Zuul网关_第2张图片
    
        
            org.springframework.cloud
            spring-cloud-starter-zuul
        
    
步骤2 在启动类上添加@EnableZuulProxy
@EnableZuulProxy
@EnableDiscoveryClient
@SpringBootApplication
public class ZuulApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication.class, args);
    }
}
步骤3 添加application.yml配置

这里设置端口为8766,将之前添加的service-ant-pay这个服务添加到zuul 的服务路径配置里。

添加eureka的相关配置。eureka的注册url为http://localhost:8761/eureka/

server:
  port: 8766
spring:
  application:
    name: service-geteway
zuul:
  routes:
    #标识你服务的名字,这里可以自己定义,一般方便和规范来讲还是跟自己服务的名字一样
    service-ant-pay:
      #服务映射的路径,通过这路径就可以从外部访问你的服务了,目的是为了不暴露你机器的IP,面向服务的路由了,给你选一个可用的出来,
      #这里zuul是自动依赖hystrix,ribbon的,不是面向单机
      path: /service-ant-pay/**
      #这里一定要是你Eureka注册中心的服务的名称,是所以这里配置serviceId因为跟eureka结合了,如果单独使用zuul,那么就必须写自己机器的IP了,
      #如url:http://localhost:8080/  这样的不好就是写死IP了,万一这IP挂了,这高可用性,服务注册那套东西就用不起来了
      serviceId: service-ant-pay
      stripPrefix: false

eureka:
  instance:
    prefer-ip-address: true
  client:
    service-url:  # Eureka Server register center
      defaultZone: http://localhost:8761/eureka/

zuul还能进行请求过滤,那么我们进行一下token校验来演示一下,首先我们需要先新建一个TokenFilter类来继承ZuulFilter这个类,实现它的四个接口,代码如下:

public class TokenFilter extends ZuulFilter {
    //四种类型:pre,routing,error,post
    //pre:主要用在路由映射的阶段是寻找路由映射表的
    //routing:具体的路由转发过滤器是在routing路由器,具体的请求转发的时候会调用
    //error:一旦前面的过滤器出错了,会调用error过滤器。
    //post:当routing,error运行完后才会调用该过滤器,是在最后阶段的
    @Override
    public String filterType() {
        return "pre";
    }

    //自定义过滤器执行的顺序,数值越大越靠后执行,越小就越先执行
    @Override
    public int filterOrder() {
        return 0;
    }

    //控制过滤器生效不生效,可以在里面写一串逻辑来控制
    @Override
    public boolean shouldFilter() {
        return true;
    }

    //执行过滤逻辑
    @Override
    public Object run() {

        RequestContext context = RequestContext.getCurrentContext();
        HttpServletRequest request = context.getRequest();
        String token = request.getParameter("token");
        if (token == null){
            context.setSendZuulResponse(false);
            context.setResponseStatusCode(401);
            context.setResponseBody("unAuthrized");


            return null;
        }
        return null;
    }
}

filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:

1.pre:可以在请求被路由之前调用,用在路由映射的阶段是寻找路由映射表的

2.route:在路由请求时候被调用,具体的路由转发过滤器是在routing路由器具体的请求转发的时候会调用

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

4.post:当routing,error运行完后才会调用该过滤器,是在最后阶段的
按照Eureka ,AntPay,Zuul的顺序进行启动。


微服务系列文章之Zuul网关_第3张图片

访问eureka ,发现zuul和antpay都成功启动,到这里zuul网关添加成功。


微服务系列文章之Zuul网关_第4张图片

对应的代码已经提交到github 项目AntMicroService,
下面是对应的tag,可以对应查看。

微服务系列文章之Zuul网关_第5张图片

参考文章

SpringCloud实战6-Zuul网关服务

你可能感兴趣的:(微服务系列文章之Zuul网关)