介绍:服务网关是微服务架构中一个不可或缺的部分。通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由、均衡负载功能之外,它还具备了权限控制等功能。
Zuul是Netflix开源的微服务网关,他可以和Eureka,Ribbon,Hystrix等组件配合使用。Zuul组件的核心是一系列的过滤器,这些过滤器可以完成以下功能:
#身份认证和安全: 识别每一个资源的验证要求,并拒绝那些不符的请求
#审查与监控:
#动态路由:动态将请求路由到不同后端集群
#压力测试:逐渐增加指向集群的流量,以了解性能
#负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求
#静态响应处理:边缘位置进行响应,避免转发到内部集群

搭建一个Zuul服务网关

1.新建模块ZuulGateWay,增加所需依赖包
 <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>

注意,eureka-client导包,是:spring-cloud-starter-netflix-eureka-client
不是:spring-cloud-netflix-eureka-client

2.在程序启动类增加注解@EnableZuulProxy开启Zuul

@SpringCloudApplication注解,通过源码我们看到,它整合了@SpringBootApplication、@EnableDiscoveryClient、@EnableCircuitBreaker,主要目的还是简化配置。

package com.offcn;import com.offcn.filter.AccessFilter;
import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;@SpringCloudApplication //组合注解
@EnableZuulProxy
public class ZuulGatwayStarter {public static void main(String[] args) {SpringApplication.run(ZuulGatwayStarter.class,args);}//初始化过滤器为bean@Beanpublic AccessFilter createAccessFilter(){return new AccessFilter();}
}
3.修改application.yml属性配置文件
spring:application:name: ZUULGATEWAY
server:port: 80

完成上面的工作后,Zuul已经可以运行了,但是如何让它为我们的微服务集群服务,还需要我们另行配置,下面详细的介绍一些常用配置内容。

Zuul服务网关路由配置

方式一:通过url直接映射

1.修改项目ZuulGateWay的属性配置文件application.yml
zuul:routes:userprovider001:path: /userprovider001/**url: http://localhost:9003/userprovider002:path: /userprovider002/**url: http://localhost:9004/

该配置,定义了,所有到Zuul中的规则为:/userprovider001/**的访问都映射到http://localhost:9003/上,也就是说当我们访问http://localhost/userprovider001/的时候,Zuul会将该请求路由到:http://localhost:9003/上
注意:配置属性zuul.routes.userprovider001.path中的userprovider001部分为路由的名字,可以任意定义,但是一组映射关系的path和url要相同

2测试url直接映射方式

(测试该服务的某个接口功能)
http://localhost/userprovider001/user/getAll

方式二:通过在Eureka服务注册的serviceId进行映射

通过url映射的方式对于Zuul来说,并不是特别友好,Zuul需要知道我们所有微服务的地址,才能完成所有的映射配置。而实际上,我们在实现微服务架构时,服务名与服务实例地址的关系在eureka server中已经存在了,所以只需要将Zuul注册到eureka server上去发现其他服务,我们就可以实现对serviceId的映射。

1.修改服务网关ZuulGateWay的属性配置文件application.yml
eureka:client:service-url:defaultZone: http://localhost:10086/eureka,http://localhost:10087/eureka
zuul:routes:userprovider:path: /service/**   #自定义访问规则service-id: USERPROVIDER  #注册的提供服务名,就不需要再配置服务地址了
2.测试ServiceId映射方式

http://localhost/service/user/getAll

3.修改客户端调用Zuul网关地址

使用Fegin方式实现接口的
1.修改注解FeignClient
@FeignClient(value = “ZUULGATEWAY”,configuration = feignConfig.class,fallback = UserServiceImpl.class)
2.调用方法按照Zuul定义的规则修改即可
例:
@GetMapping("/service/user/getAll")
public List getAll(…);

Zuul服务网关过滤器使用

在服务网关中定义过滤器只需要继承ZuulFilter抽象类实现其定义的四个抽象函数就可对请求进行拦截与过滤。

比如下面的例子,定义了一个Zuul过滤器,实现了在请求被路由之前检查请求中是否有accessToken参数,若有就进行路由,若没有就拒绝访问,返回401 Unauthorized错误。

1.编写Zuul过滤器(在模块ZuulGateWay下)

package com.offcn.filter;import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;import javax.servlet.http.HttpServletRequest;public class AccessFilter extends ZuulFilter {//设置过滤器的类型,决定了过滤器的执行时间@Overridepublic String filterType() {//常见过滤器类型pre 路由请求转发之前执行  routing 在路由转发同时执行  post 在routing和error过滤器之后被调用  error:处理请求时发生错误时被调用return "pre";}@Overridepublic int filterOrder() {return 0;  //过滤器的执行顺序,数字越小越先执行}//开关@Overridepublic boolean shouldFilter() {return true;  //true 表示丐萝氯气处于可运行状态  false表示该过滤器不可用}//该过滤器做身份验证@Overridepublic Object run() throws ZuulException {//获取到当前请求上下文环境RequestContext context = RequestContext.getCurrentContext();//从上下文环境获取当前请求对象HttpServletRequest request = context.getRequest();//从请求对象获取传递的凭证String token = request.getParameter("token");//判断凭证是否存在if(token==null){//凭证不存在,禁止路由转发context.setSendZuulResponse(false);//提示错误状态码   401 权限不足的意思context.setResponseStatusCode(401);}return null;}
}
2.实例化该过滤器

我们只需要在启动类中增加如下内容:

 @Beanpublic AccessFilter accessFilter() {return new AccessFilter();}
3.测试过滤器

http://localhost/service/user/getAll
发现:

因为没有传token的值,所以被过滤器拦截了
我们再测试:
http://localhost/service/user/getAll?token=token
可以发现能正常访问该接口了

spring clude ---服务网关组件Netflix Zuul相关推荐

  1. 服务网关配置:Zuul

    目录 第一章 Zuul介绍 1.1.什么是Zuul 1.2.为啥用Zuul 第二章 Zuul路由功能 2.1.项目准备与启动 2.2.工程搭建与测试 2.3.配置自定义路由 2.4.禁止默认的路由 2 ...

  2. SPRING CLOUD服务网关之ZUUL

    服务网关是微服务架构中一个不可或缺的部分.通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由.均衡负载功能之外,它还具备了权限控制等功能.Spring Cloud Netflix中 ...

  3. Spring Cloud服务网关 Zuul

    服务网关是在微服务前边设置一道屏障,请求先到服务网关,网关会对请求进行过滤.校验.路由等处理.有了服务网关可以提高微服务的安全性,校验不通过的请求将被拒绝访问. Spring Cloud Zuul是整 ...

  4. Spring Cloud服务网关(Zuul)的配置项sensitiveHeaders

    如果我们在一个服务中添加了Cookie,如下图所示: public static void set(HttpServletResponse response,String name,String va ...

  5. spring cloud服务发现组件Eureka详解

    Eureka是Netflix开发的服务发现组件,本身是一个基于REST的服务.Spring Cloud将它集成在其子项目spring-cloud-netflix中,以实现Spring Cloud的服务 ...

  6. 微服务网关总结之 —— zuul

    前言 随着微服务的盛行和广泛的使用,选择一套完整的微服务架构解决方案是作为技术选型的前置条件,不管是基于dubbo的或是spring-cloud,还是基于alibaba的升级版cloud的微服务,应用 ...

  7. 【SpringCloud】服务网关 gateway 和 zuul

    文章目录 1.概述 2.特性 3.区别 3. zuul1 模型 4. Spring Cloud Gateway 5. 3大核心概念 6.案例 6.1 案例1 6.1.1 maven 6.1.2 主类 ...

  8. 微服务实战|微服务网关Zuul入门与实战

    网关的作用 微服务架构中,服务实例的地址可能经常会发生变化,所以我们不能直接将服务的地址暴露出来.如果每一个微服务都直接暴露接口,会导致一系列的问题,比如调用过于复杂,涉及到账户.权限不能统一处理等. ...

  9. 《深入理解 Spring Cloud 与微服务构建》第十一章 服务网关

    <深入理解 Spring Cloud 与微服务构建>第十一章 服务网关 文章目录 <深入理解 Spring Cloud 与微服务构建>第十一章 服务网关 一.服务网关简介 二. ...

最新文章

  1. TVM设计与构架构建
  2. 用Python解“龟兔赛跑”题
  3. Python3字符串的编码
  4. WIN10 vnc 与Jeson ubuntu18.04 vncserver 远程控制的实现(亲测有效)
  5. Jexus针对Asp.net core应用程序的六大不可替代的优势
  6. MySQL checkpoint机制详解
  7. 使用 pyinstaller 打包 py 文件成 exe 程序
  8. 面向对象【day07】:新式类和经典类(八)
  9. Android仿苹果版QQ下拉刷新实现(二) ——贝塞尔曲线开发鼻涕下拉粘连效果
  10. java代码求IP和mac地址
  11. android开发mvp,Android开发模式之MVP
  12. 一种全新易用的基于Word-Word关系的NER统一模型,刷新了14种数据集并达到新SoTA...
  13. 【Sencha Toucha】Sencha Touch ExtJs 给 Button 添加图片
  14. java jconsole 远程连接_jconsole连接远程tomcat
  15. python断言语句_Python断言assert的用法代码解析
  16. 低盈利、高现金流:紫光财报背后的半导体另类求生之路
  17. 【面试题记录】2020前端秋招笔试面试题目记录
  18. 直播带货行业如何入局?先了解一下直播商城源码吧
  19. 广域网接口规范(v.35)
  20. Python挑战游戏( PythonChallenge)闯关之路Level- 1

热门文章

  1. 企企通SRM:由“制造”到“智造”,高科技电子行业如何打造智慧供应链?
  2. 网络推广恶意点击js_百度搜索推广碰到恶意点击该怎么解决
  3. 模拟电路仿真LTspice(3):三极管共发射极放大电路
  4. 微信推出热搜排行榜,微博压力山大?
  5. 关于华为应用市场审核App无法启动的问题
  6. 工作能力强的人,都有哪些特点?
  7. GIS开发:Contour(轮廓线)
  8. 世界上最简单的会计书(利润表)
  9. k8s——kubeadm工具使用
  10. Sharpen 的调试步骤