Spring Cloud教程 第九弹 微服务网关Zuul

本文介绍Zuul作为微服务网关的功能特性,包括动态路由、认证鉴权等,并通过示例演示如何搭建Zuul工程及进行访问测试。

更多Spring与微服务相关的教程请戳这里 Spring与微服务教程合集

1、概述

1.1、什么是Zuul?

zuul是从设备和网站到后端应用程序所有请求的前门,为内部服务提供可配置的对外URL到服务的映射关系,基于JVM的后端路由器,其具备以下功能:

  • 认证与鉴权
  • 压力控制
  • 金丝雀测试
  • 动态路由
  • 负载削减
  • 静态响应处理
  • 主动流量管理

底层基于servlet,本质组件是一系列Filter所构成的责任链,zuul的逻辑引擎和Filter可以用其它基于JVM的语言编写,比如Groovy

2、入门案例

2.1、准备工作

首先我们准备好服务service-a和eureka server

假设service-a服务的地址为http://localhost:8010,上下文为/service-a,并且暴露一个接口,其路径为/common/port

2.2、搭建zuul工程

2.2.1、pom.xml

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
    </dependencies>

2.2.2、application.yml

代表所有以/service-a开头的请求会被转发到service-a服务上

server:
  port: 8040
  servlet:
    context-path: /zuul-server
spring:
  application:
    name: zuul-server

eureka:
  instance:
    prefer-ip-address: true
  client:
    service-url:
      defaultZone: http://localhost:8000/eureka/
    register-with-eureka: true


zuul:
  routes:
    service-a:
      path: /service-a/**
      serviceId: service-a

2.2.3、启动类

@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
public class ZuulServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZuulServerApplication.class, args);
    }

}

2.3、访问测试

接下来,我们通过访问网关,将请求转发到service-a服务上

访问地址为:http://localhost:8040/zuul-server/service-a/service-a/common/port

  • 红色部分是zuul的地址 
  • 蓝色部分是在application.yml中配置的zuul.routes.service-a.path的值,因此正好匹配上了,所以该请求会被转发到service-a服务
  • 绿色部分就是service-a服务暴露出来的接口的路径

访问结果如果,可以看到网关将请求成功转发到service-a服务了

3、Zuul Filter

zuul核心逻辑是由一系列的Filter完成的。Filter之间不直接通信,而是在请求线程中通过RequestContext来共享状态,它的内部通过ThreadLocal实现。

Filter类型:

  • pre
  • route
  • post
  • error

在ZuulServlet类中定义了四种类型的Filter的执行时机,如下图所示。

可以通过继承ZuulFilter自定义FIlter,如下代码所示。

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

@Component
public class AuthFilter extends ZuulFilter {
    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;
    }

    @Override
    public int filterOrder() {
        return 0;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() throws ZuulException {
        System.out.println("this is auth filter!");
        RequestContext context = RequestContext.getCurrentContext();
        HttpServletRequest request = context.getRequest();
        if(null != request.getParameter("token")){
            System.out.println("存在token,token="+request.getParameter("token"));
            context.set("success","true");
        }else{
            // 禁止访问
            context.setSendZuulResponse(false);
            context.set("success","false");
        }
        return null;
    }
}

也可以通过Groovy语言来编写Zuul的filter,其优点是可以在不重启服务的情况下动态生效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沸腾的冰川

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值