今天给各位同学带来的是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来实现规则动态更改