五、Spring Cloud之网关服务 zuul

甲子神王文卿
• 阅读 1808

前言

问:什么是网关服务?
答:给外部提供单一的访问接口,并做过滤和拦截处理的服务。

问:微服务架构中网关服务有什么作用?
答:我们微服务架构中项目众多,如果直接抛给外部,将会很容易引起调用错误并且大大增加了维护成本,所以我们需要提供单一访问接口,外部请求全部通过统一端口网关,然后在分发到不同的服务器。如果熟悉nginx 的同学想必就知道,其实就是nginx 反向代理的功能。

问:那为什么不使用nginx,而是使用zuul
答: nginx 确实可以实现网关的功能,但是我们同样的要维护nginx.conf 文件,如果项目够多,是很容易出问题的,使用zuul 的话,可以和eureka 天然的融合,使得管理维护起来更加方便。

下面我们就来看下怎么实现zuul 吧。

pom.xml

我们创建一个zuul 的模块,pom.xml 文件中引入zuul 和erueka

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

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

    </dependencies>

启动类

在启动类中我们加入@EnableZuulProxy 注解
将springBootApplication 注解换成@SpringCloudApplication 注解。
EnableZuulProxy 注解表示启动zuul 网关服务。
SpringCloudApplication 注解,我们来看下源码

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public @interface SpringCloudApplication {
}

可以看到包含的注解主要是SpringBootApplication、EnableDiscoveryClient、EnableCircuitBreaker 而这三个注解,我们前面都接触过的,SpringBootApplication就是Springboot项目启动的专用注解,EnableDiscoveryClient注解是将服务注册到服务中心,并发现服务的。EnableCircuitBreaker 是实现熔断处理的注解,所以说SpringCloudApplication 注解是对三个的一层封装,所以我们以后构建微服务的时候,使用SpringCloudApplication 注解会更方便。

application.properties

接下来我们在配置问价中增加如下配置

server.port=9007
spring.application.name=zuul
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

zuul.routes.test-a.path=/a/**
zuul.routes.test-a.service-id=ribbon-consumer

server.port和spring.application.name 用来指定项目启动的端口和项目在注册中心的名称,eureka.client.serviceUrl.defaultZone用来指定注册中心的地址。
zuul.routes.*.path 和zuul.routes.*.service-id 用来指定我们的目的项目。
比如我这里配置的ribbon-consumer 项目,将localhost:9007/a/** 转发到ribbon-consumer 对应的接口上。
# 测试
好了,我们现在就把网关配置好了。我们现在启动一下项目,启动如下几个项目进行测试吧就。
五、Spring Cloud之网关服务 zuul
其中EurekaServer是注册中心,ribbon-consumer 是服务消费者,ribbon-consumer 是服提供者,zuul 是网关。我们启动好这几个项目后,我们输入一下地址:

http://localhost:9007/a/index

五、Spring Cloud之网关服务 zuul
可以看到其实访问的是

 http://localhost:9003/index

默认映射

上面的可以看到,我们主要的配置就是在配置文件中配置好目标地址的路径。但是这样的话,和nginx 有什么区别呢,如果项目足够多配置起来还是会出错的,所以前面说zuul 和eureka 可以无缝连接,所以,这里zuul 做了一个默认映射,为所有注册到注册中心的服务提供了一个唯一对应的默认映射。怎么说呢,我们看一下服务中心的控制台。
五、Spring Cloud之网关服务 zuul
zuul 将eureka 中服务名作为映射前缀,比如

http://localhost:9007/ribbon-consumer/index

五、Spring Cloud之网关服务 zuul
可以看到,达到了一样的效果,ribbon-consumer 就是服务名。

请求过滤

前面我们讲了zuul 网关可以转发请求,但是它还有一个强大的功能,那就是请求过滤,我们知道具体项目中我们的接口会做安全限制,所以在具体的项目中会写过滤器和拦截器。在微服务项目中,我们既然提供了统一的网关服务,所以我们可以将安全校验和具体业务剥离出来,将安全校验放在zuul 网关中来统一处理,这样减少了冗余代码,也方便维护。
那么怎在zuul 中实现请求过滤呢?
继承ZuulFilter 类。

我们创建一个AccessFilter你类来继承ZuulFilter 。代码如下:

@Slf4j
public class AccessFilter extends ZuulFilter {
    @Override
    public String filterType() {
        return "pre";
    }

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

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

    @Override
    public Object run() throws ZuulException {
        RequestContext ctx=RequestContext.getCurrentContext();
        HttpServletRequest request=ctx.getRequest();
        String token=request.getParameter("token");

        if(token == null || !token.equals("123456")){
           log.info("token is error!");
           ctx.setSendZuulResponse(false);
           ctx.setResponseStatusCode(500);
           return "error";
        }
        log.info("token is ok");
        return null;
    }
}

直接将书上的解释拿出来了。主要的方法是run方法,获取请求中的request 和参数,对参数进行校验从而过滤。
五、Spring Cloud之网关服务 zuul
这里我就是对token 进行简单的校验,也就是说只有检验通过了才能访问目标接口。
昨晚上面这些还不够,还差一步,在项目zuul 服务启动的时候,需要将 AccessFilter bean 注册服务中。所以我们在启动类中注入

    @Bean
    public AccessFilter accessFilter(){
        return new AccessFilter();
    }

好了,我们来启动一下项目看看。
五、Spring Cloud之网关服务 zuul
可以看到就可以起到拦截的作用。

番外

到此为止,zuul 网关服务搭建好了,并运行一个非常简单的例子。

代码上传到github:
https://github.com/QuellanAn/SpringCloud

后续加油♡

欢迎大家关注个人公众号 "程序员爱酸奶"

分享各种学习资料,包含java,linux,大数据等。资料包含视频文档以及源码,同时分享本人及投递的优质技术博文。

如果大家喜欢记得关注和分享哟❤

五、Spring Cloud之网关服务 zuul

阅读原文

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
springboot2.0下的zuul路由网关初探
Zuul作为微服务系统的网关组件,用于构建边界服务,致力于动态路由、过滤、监控、弹性伸缩和安全。为什么需要ZuulZuul、Ribbon以及Eureka结合可以实现智能路由和负载均衡的功能;网关将所有服务的API接口统一聚合,统一对外暴露。外界调用API接口时,不需要知道微服务系统中各服务相互调用的复杂性,保护了内部微服务单元的API接口;网关可以做
Stella981 Stella981
3年前
Spring Cloud微服务架构从入门到会用(五)—服务网关鉴权
上一篇文章我们集成了服务网关SpringCloudGateway,所有的服务请求都可以通过Gateway访问。那我们就可在服务网关这一层对用户的请求进行鉴权,判断是否可以访问路由的API接口。接下来我们开始增加鉴权,这里我们使用jwt1\.创建授权服务module按照第二篇文章创建一个module,起名为appauth。
Easter79 Easter79
3年前
SpringCloud 组件之 Gateway
SpringCloud组件之Gateway(微服务网关)概述不同的微服务会有不同的网络地址,客户端需要调用多个服务的接口才能完成一个业务需求。网关的作用1.整合各个微服务功能,形成一套系统(最主要的作用)2.在微服务网关
Wesley13 Wesley13
3年前
API网关原理
1、API网关介绍 API网关是一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。 API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有
Easter79 Easter79
3年前
SpringCloud学习之Zuul路由转发、拦截和熔断处理(七)
SpringCloudZuul服务网关是微服务架构中一个不可或缺的部分。通过服务网关统一向外系统提供RESTAPI的过程中,除了具备服务路由、均衡负载功能之外,它还具备了权限控制等功能。SpringCloudNetflix中的Zuul就担任了这样的一个角色,为微服务架构提供了前门保护的作用,同时将权限控制
Easter79 Easter79
3年前
SpringCloud微服务(05):Zuul组件,实现路由网关控制
一、Zuul组件简介1、基础概念Zuul网关主要提供动态路由,监控,弹性,安全管控等功能。在分布式的微服务系统中,系统被拆为了多个微服务模块,通过zuul网关对用户的请求进行路由,转发到具体的后微服务模块中。2、Zuul的作用1)按照不同策略,将请求转发到不同的服务上去;
Easter79 Easter79
3年前
SpringCloud学习笔记(七)之路由网关Zuul
是什么Zuul包含了对请求路由和过滤两个最主要的功能:其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础。而过滤功能则负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础。Zuul和Eureka进行整合,将zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他微
Stella981 Stella981
3年前
Spring Cloud(五)
微服务网关在微服务架构中,后端服务往往不直接开放给调用端,而是通过一个API网关根据请求的url,路由到相应的服务。当添加API网关后,在第三方调用端和服务提供方之间就创建了一面墙,这面墙直接与调用方通信进行权限控制,后将请求均衡分发给后台服务端。为什么需要APIGateway1\.简化客户端调用复杂度在微服
Easter79 Easter79
3年前
SpringCloud Alibaba微服务实战二十七
!(https://oscimg.oschina.net/oscnet/63bfb38b1cd9446fb1ba906d1353ad39.png)前言使用SpringCloud架构后我们希望所有的请求都需要经过网关才能访问,在不作任何处理的情况下我们是可以绕过网关直接访问后端服务的。如下,我们绕过网关直接访问后端服务也是可以获取到数
Stella981 Stella981
3年前
Spring Cloud Gateway限流浅析之一段脚本实现令牌桶
前言在一个分布式高并发的系统设计中,限流是一个不可忽视的功能点。如果不对系统进行有效的流量访问限制,在双十一和抢票这种流量洪峰的场景下,很容易就会把我们的系统打垮。而作为系统服务的卫兵的网关组件,作为系统服务的统一入口,更需要考虑流量的限制,直接在网关层阻断流量比在各个系统中实现更合适。SpringCloudGateway的实现
甲子神王文卿
甲子神王文卿
Lv1
唯有门前镜湖水,春风不改旧时波。
文章
3
粉丝
0
获赞
0