前言:前面说过,由于微服务过多,可能某一个小业务就需要调各种微服务的接口,不可避免的就会需要负载均衡和反向代理了,以确保ui不直接与所有的微服务接口接触,所以我们需要使用一个组件来做分发,跨域等各种请求。

一、微服务网关ZUUL

  ZUUL是Netflix开源的微服务网关,它可以和Eureka、Ribbon、Hystrix等组件配合使用,它主要用作反向代理、Filter扩展、动态加载、动态路由、压力测试、弹性扩展、审查监控、安全检查等。
  

二、ZUUL与SpringCloud各组件的整合使用

  1、创建一个Maven工程,gateway-zuul,添加依赖:

  <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
</parent> <dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 添加spring-boot的maven插件 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

  2、在启动类上添加注解@EnableZuulProxy,声明ZUUL代理,通过观察Zuul的类库发现,zuul的依赖库中除了有它本身的核心包外还有actuator、hystrix的整合包,默认实现了监控和熔断机制,所有经过zuul的请求都会在hystrix命令中执行:

@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication { public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
} }

  3、编写配置文件application.properties:

server.port=8000
spring.application.name=zuul-8000
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
#由于zuul中的actuator默认的安全权限为ture,需改为false,若不修改则会导致无法访问路由管理(localhost:8000/routes)
management.security.enabled=false

(注:下面的测试,是基于之前做的几个关于Ribbon、Hystrix的demo来做的,若感兴趣可以看一下我之前的文章:SpringCloud-客户端的负载均衡Ribbon(三)SpringCloud-容错处理Hystrix熔断器(五)

  4、测试路由网关是否启动:

  分别启动 eureka-ribbon-server、 eureka-ribbon-client、 eureka-ribbon-client2 和  gateway-zuul,打开服务配置中心,并访问http://localhost:8000/client-8762/getUser:

  

  

  通过网关访问成功!

  5、测试负载均衡是否可用:

  分别启动  eureka-ribbon-servereureka-feign-hystrix-client、修改 eureka-ribbon-client2 端口为8763、修改 eureka-ribbon-client2 端口为8764 和  gateway-zuul,打开服务配置中心,并多次访问http://localhost:8000/client-8762/loadInstance,观察返回结果:

  

  

  

  根据观察结果知,通过网关实现负载均衡!

  6、测试熔断与路由端点是否可用:

  熔断:

    分别启动 eureka-ribbon-server、 eureka-feign-hystrix-client、 eureka-ribbon-client2 和  gateway-zuul,打开服务配置中心,并多次访问http://localhost:8000/client-8762/loadInstance,观察返回结果:

    

    

    将CLIENT-87实例关闭,再次调用:

    

    注:由于client-87的实例关闭后要等eureka将实例移除后,然后eureka通知zuul,zuul再将client-87从网关列表中移除,最后访问,才可以看到熔断,走回调函数了!

  启动项目与上面 测试5相同,注意网关中的application.properties一定要将安全权限打开或者以其他方式,才可访问localhost:8000/routes/

#由于zuul中的actuator默认的安全权限为ture,需改为false,若不修改则会导致无法访问路由管理(localhost:8000/routes)
management.security.enabled=false

  

三、ZUUL过滤器的实践

  

  Zuul提供一个框架,可以对Groovy写的过滤器进行动态的加载、编译、运行。过滤器之间没有直接的相互通信,通过一个RequestContext的静态类中ThreadLocal变量来进行数据传递,过滤器类型:

  PRE:这种过滤器在请求到达Origin Server之前调用。比如身份验证,在集群中选择请求的Origin Server,记log等;

  ROUTING:在这种过滤器中把用户请求发送给Origin Server。发送给Origin Server的用户请求在这类过滤器中build。并使用Apache HttpClient或者NetfilxRibbon发送给Origin Server;

  POST:这种过滤器在用户请求从Origin Server返回以后执行。比如在返回的response上面加response header,做各种统计等。并在该过滤器中把response返回给客户;

  ERROR:在其他阶段发生错误时执行该过滤器;

  客户定制:比如我们可以定制一种STATIC类型的过滤器,用来模拟生成返回给客户的response;

  1、创建过滤器类,继承ZuulFilter抽象类,实现该方法:

/**
* @program: springcloud-example
* @description:
* @author:
* @create: 2018-06-20 16:53
**/
public class RequestLogFilter extends ZuulFilter { private Logger logger = LoggerFactory.getLogger(RequestLogFilter.class); /**
* @Description: 返回过滤器类型,就是上面介绍的那几种类型
* @Param:
* @return:
* @Author:
* @Date: 2018/6/20
*/
@Override
public String filterType() {
return "pre";
} /**
* @Description:指定过滤器执行的顺序
* @Param:
* @return:
* @Author:
* @Date: 2018/6/20
*/
@Override
public int filterOrder() {
return 1;
} /**
* @Description:指定该过滤器是否执行
* @Param:
* @return:
* @Author:
* @Date: 2018/6/20
*/
@Override
public boolean shouldFilter() {
return true;
} /**
* @Description: 过滤器的具体方法逻辑
* @Param:
* @return:
* @Author:
* @Date: 2018/6/20
*/
@Override
public Object run() {
RequestContext currentContext = RequestContext.getCurrentContext();
HttpServletRequest request = currentContext.getRequest();
String url = request.getRequestURL().toString();
logger.info("请求URL:"+url);
return null;
}
}

  2、在启动类,将该过滤器注入到Spring容器中:

    @Bean
public RequestLogFilter getRequestLogFilter() {
return new RequestLogFilter();
}

  3、分别启动 eureka-ribbon-server、 eureka-ribbon-client、 eureka-ribbon-client2、 gateway-zuul测试:

  

参考书籍:《SpringCloud与Docker微服务架构实战》周力著

代码示例:https://gitee.com/lfalex/springcloud-example( eureka-feign-hystrix-client、 eureka-hystrix-client、 eureka-ribbon-client、 eureka-ribbon-client2、 eureka-ribbon-server、 gateway-zuul

SpringCloud-微服务网关ZUUL(六)的更多相关文章

  1. 【SpringCloud构建微服务系列】微服务网关Zuul

    一.为什么要用微服务网关 在微服务架构中,一般不同的微服务有不同的网络地址,而外部客户端(如手机APP)可能需要调用多个接口才能完成一次业务需求.例如一个电影购票的手机APP,可能会调用多个微服务的接 ...

  2. 微服务SpringCloud之服务网关zuul二

    Zuul的核心 Filter是Zuul的核心,用来实现对外服务的控制.Filter的生命周期有4个,分别是“PRE”.“ROUTING”.“POST”.“ERROR”,整个生命周期可以用下图来表示. ...

  3. 微服务SpringCloud之服务网关zuul一

    前面学习了Eureka.Feign.Hystrix.Config,本篇来学习下API网关zuul.在微服务架构中,后端服务往往不直接开放给调用端,而是通过一个API网关根据请求的url,路由到相应的服 ...

  4. 八、springcloud之服务网关zuul(一)

    一.Zuul简介 zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用. Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器. ...

  5. 微服务网关Zuul和Gateway的区别

    spring-cloud-Gateway是spring-cloud的一个子项目.而zuul则是netflix公司的项目,只是spring将zuul集成在spring-cloud中使用而已.因为zuul ...

  6. 二十一、springcloud(七)服务网关zuul

    1.简介 Eureka用于服务的注册于发现,Feign支持服务的调用以及均衡负载,Hystrix处理服务的熔断防止故障扩散,Spring Cloud Config服务集群配置中心,在微服务架构中,后端 ...

  7. 微服务网关Zuul过滤器Filter

    Zuul本质 Zuul是一个网关,关于网关的介绍参考:亿级流量架构之网关设计思路.常见网关对比, 可知Zuul是一个业务网关, 而深入了解Zuul, 基本就是一系列过滤器的集合: Zuul的过滤器 下 ...

  8. springcloud系列11 整合微服务网关zuul

    这个模块是一个独立的模块所以需要建立一个模块, 首先引入: 依赖pom.xml <?xml version="1.0" encoding="UTF-8"? ...

  9. SpringCloud的服务网关zuul

    演示如何使用api网关屏蔽各服务来源 一.概念和定义 1.zuul最终还是使用Ribbon的,顺便测试一下Hystrix断路保护2.zuul也是一个EurekaClient,访问服务注册中心,获取元数 ...

  10. 九、springcloud之服务网关zuul(二)

    一.路由熔断 当我们的后端服务出现异常的时候,我们不希望将异常抛出给最外层,期望服务可以自动进行一降级.Zuul给我们提供了这样的支持.当某个服务出现异常时,直接返回我们预设的信息. 我们通过自定义的 ...

随机推荐

  1. [翻译] LiquidFloatingActionButton

    LiquidFloatingActionButton https://github.com/yoavlt/LiquidFloatingActionButton LiquidFloatingAction ...

  2. 工具类-vim在shell中卡死的情况

    time:2015/11/35 在xshell下面使用vim编辑,有时候会出现突然卡死的情况.但是如果重新开一个终端的话,打开文件又是一大堆问题,今天又碰到了,搜了一下就找到一个帮助了[1] 原因:按 ...

  3. 转载:python的编码处理(一)

    以下内容转载自: http://in355hz.iteye.com/blog/1860787 最近业务中需要用 Python 写一些脚本.尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些, ...

  4. Redis学习---Redis操作之Hash

    hash表现形式上有些像pyhton中的dict,可以存储一组关联性较强的数据[有点像嵌套字典] hset(name, key, value) --> 设置hash的操作 # 参数:     # ...

  5. 'Table is Marked as crashed and should be repaired Error'.Mysql表损坏解决方案

    问题表现:由于服务器崩溃导致表损坏无法打开或者能打开但是无法写入数据(提示主键重复但实际没有该主键且该主键值在最大值范围内). 本文提供两种检查修复方式:mysqlcheck 和 myisamchk ...

  6. Jmeter入门3 http请求—content-type与参数

    本文讲三种content-type以及在Jmeter中对应的参数输入方式 第一部分:目前工作中涉及到的content-type 有三种: content-type:在Request Headers里, ...

  7. eclipse导入maven工程missing artifact(实际是存在的)错误解决

    找到出错的jar包文件位置,删掉_maven.repositories文件(或用文本编辑器打开,将“>main=”改为“>=”,即删除main,当然main也可能是其他值),然后updat ...

  8. Leetcode Weekly Contest 86

    Weekly Contest 86 A:840. 矩阵中的幻方 3 x 3 的幻方是一个填充有从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等. 给定一个 ...

  9. oracle 禁用/启动job

    注意:dbms_job只能在job的所在用户使用,如果broken其它用户的job用dbms_ijob dbms_job只能在当期用户内创建job.修改和删除job,不能对其他用户的job进行操作;s ...

  10. js(window.open)浏览器弹框居中显示

    <span style="background-color: rgb(204, 204, 204);"><html> <meta name=" ...