今天给各位同学带来的是zuul网关的使用,网关在springcloud项目中起到了路由转发、限流等作用,那今天我们来分析一下为什么我们要添加zuul网关。

一、Zuul介绍

Zuul是Netflix开源的微服务网关,他可以和Eureka,Ribbon,Hystrix等组件配合使用。Zuul组件的核心是一系列的过滤器

二、Zuul带来什么好处

1.统一请求url
在微服务中,我们是将业务以服务来划分的,拿一个电商来说,我们有商品服务、购物车服务、活动服务、支付服务等。对我们而言每一个都是一个微服务,都会部署在不同的服务器上。所以我们在前后端进行联调时,如果每一个服务域名或ip都不一样的话,对于前端来说会很混乱和复杂。所以这个时候,我们需要引进zuul来进行统一管理以及请求的分发。
2.跨域以及校验业务等问题统一处理
在我们实际开发业务中,肯定会存在一些权限校验问题,试想如果没有zuul,我们需要在每一个微服务中都进行权限逻辑编写,试想这个时候如果权限业务发生变化,我们需要维护对所有服务业务进行维护。当然,我们也可以抽出出来一个专门做权限校验的服务,然后别的业务通过远程调用来进行校验。但是如果这个时候调用方式或传参发生了变化,还是要进行每一个微服务的业务修改。所以添加zuul可以避免以上问题,并进行统一解决。(跨域问题同理)
3.为灰度发布、限流、监控等功能提供了基础

三、Zuul搭建

好了,上面说了这么多,还是为了证明添加zuul是很有必要的,接下来我们就来看一下如何搭建一个zuul,并且与Eureka以及Ribbon、Hystrix等结合。具体解释我都会通过图片注释和代码注解的方式进行讲解,请各位同学仔细阅读。

3.1 项目创建

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

3.2 添加配置

1.添加依赖
在这里插入图片描述

	implementation 'org.springframework.cloud:spring-cloud-starter-netflix-zuul'
	implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'

2.设置开关
在这里插入图片描述3.添加配置
在这里插入图片描述

server.port=5111
spring.application.name=demozuul
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
#设置路由规则
#输入url为localhost:5111/gwshop/**时,跳到服务名为demoshop的服务的对应的**url中
#例:localhost:5111/gwshop/get/info 则跳到名为demoshop服务的get/info接口中
zuul.routes.shop.path=/gwshop/**
zuul.routes.shop.url=demoshop
#输入url为localhost:5111/gwscar/**时,跳到服务名为democar的服务的对应的**url中
#例:localhost:5111/gwcar/get/info 则跳到名为democar服务的get/info接口中
zuul.routes.car.path=/gwcar/**
zuul.routes.car.url=democar

#zuul.host.socket-timeout-millis=8000
#zuul.host.connect-timeout-millis=8000
#设置ribbon
ribbon.OkToRetryOnAllOperations=false
ribbon.ReadTimeout=10000
ribbon.ConnectTimeout=2000
ribbon.MaxAutoRetries=0
ribbon.MaxAutoRetriesNextServer=1
#设置hystrix
hystrix.command.default.execution.timeout.enabled=true
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=20000

启动项目,访问注册中心,观察zuul是否注册其中。

在这里插入图片描述

其实这个时候我们zuul已经搭建好了,不信我们可以以刚才的规则访问一下接口,如下图所示。
其实实际访问的事shop服务的shop/hello/one接口。
在这里插入图片描述

3.3 编写过滤器

上面我们也提到了,真实场景下,我们需要做权限验证等功能,zuul为我们提供了zuulFilter来让我们实现此类功能

在这里插入图片描述

package com.beyondli.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.stereotype.Component;

/**
 * Created by beyondLi
 * Date 2019/5/21 14:43
 * Desc .
 */
@Component
public class OneAccessFilter extends ZuulFilter {

    //决定过滤器在哪个生命周期执行
    @Override
    public String filterType() {
        return "pre";
    }
    //过滤器的执行顺序
    @Override
    public int filterOrder() {
        return 1;
    }
    //过滤的范围
    @Override
    public boolean shouldFilter() {
        return true;
    }
    //实际业务
    @Override
    public Object run() throws ZuulException {
        System.out.println("================gw one test=================");
        return null;
    }
}

此时我们在访问刚才的接口,zuul服务的控制台输出如下。

在这里插入图片描述

好了,以上就是zuul的基本搭建以及使用,网关这层更加看重的是规则,我们可以通过配置规则结合config来实现规则动态更改,除了做转发,我们还可以实现限流、灰度发布等高级功能,各位同学可以自己进行思考和深入,这里只是带大家入个门,希望可以帮助到各位同学。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐