专栏首页A周立SpringCloud跟我学Spring Cloud(Finchley版)-16-Zuul

跟我学Spring Cloud(Finchley版)-16-Zuul

至此,已实现基于Eureka的服务发现,基于Ribbon的负载均衡,Feign也为我们提供了很不错的远程调用能力,使用Hystrix后,高并发场景下应用也不会被别人拖死——咱们的微服务架构已经日趋完善!

然而,迄今为止,只讨论了微服务之间的调用,尚没讨论如何应对外部请求。应对外部请求时,就会发现,我们的架构依然存在一些问题——

为什么要使用网关

不同的微服务一般会有不同的网络地址,而外部客户端(例如手机APP)可能需要调用多个服务的接口才能完成一个业务需求。例如一个电影购票的手机APP,可能会调用多个微服务的接口,才能完成一次购票的业务流程,如下图所示。

如果让客户端直接与各个微服务通信,会有以下的问题:

  • 客户端会多次请求不同的微服务,增加了客户端的复杂性。
  • 存在跨域请求,在一定场景下处理相对复杂。
  • 认证复杂,每个服务都需要独立认证。
  • 难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信,那么重构将会很难实施。
  • 某些微服务可能使用了防火墙/浏览器不友好的协议,直接访问会有一定的困难。

以上问题可借助微服务网关解决。微服务网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过微服务网关。使用微服务网关后,架构如下所示。

此时,微服务网关封装了应用程序的内部结构,客户端只须跟网关交互,而无须直接调用特定微服务的接口。这样,开发就可以得到简化。不仅如此,使用微服务网关还有以下优点:

  • 易于监控。可在微服务网关收集监控数据并将其推送到外部系统进行分析。
  • 易于认证。可在微服务网关上进行认证,然后再将请求转发到后端的微服务,而无须在每个微服务中进行认证。
  • 减少了客户端与各个微服务之间的交互次数。

Zuul简介

Zuul是Netflix开源的微服务网关,它可以和Eureka、Ribbon、Hystrix等组件配合使用。Zuul的核心是一系列的过滤器,这些过滤器帮助我们完成以下功能:

  • 身份认证与安全:识别每个资源的验证要求,并拒绝那些与要求不符的请求;
  • 审查与监控:在边缘位置追踪有意义的数据和统计结果,从而为我们带来精确的生产视图;
  • 动态路由:动态地将请求路由到不同的后端集群;
  • 压力测试:逐渐增加指向集群的流量,以了解性能;
  • 负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求;
  • 静态响应处理:在边缘位置直接建立部分响应,从而避免其转发到内部集群;
  • 多区域弹性:跨越AWS Region进行请求路由,旨在实现ELB(Elastic Load Balancing)使用的多样化;以及让系统的边缘更贴近系统的使用者。

注1:以上介绍来自Zuul官方文档,但其实开源版本的Zuul以上功能一个都没有——开源的Zuul只是几个Jar包而已,以上能力指的应该是Netflix官方自用的Zuul的能力。 注2:Netflix自用的Zuul能力是比较强大的,可使用Groovy编写过滤器,并且可动态加载/卸载、修改规则,而且使用Cassandra作为数据库,然而开源版本这些一个都没有注3:Spring Cloud中,Zuul绝大部分功能都是Spring Cloud团队为Zuul开发的注4:所以Zuul 2.x的开源进度延后一年,Spring Cloud团队开发了自己的Spring Cloud Gateway,并宣布Spring Cloud不打算支持Zuul 2.x,你还觉得意外吗? 注5:看到这里,很多人可能没有动力学习Zuul了,个人认为还是可以了解一下的,后面讲到Spring Cloud Gateway时,你会发现很多设计理念是相通的。

Spring Cloud对Zuul进行了整合与增强。目前,Zuul使用的默认HTTP客户端是Apache HTTP Client,也可以使用RestClient或者 okhttp3.OkHttpClient 。 如果想要使用RestClient,可以设置 ribbon.restclient.enabled=true ;想要使用 okhttp3.OkHttpClient ,可以设置 ribbon.okhttp.enabled=true

TIPS

Zuul的GitHub:https://github.com/Netflix/zuul

入门

下面通过一个简单的例子帮助大家快速入门Zuul。

编码

1 加依赖

<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>

2 加注解: @EnableZuulProxy

3 写配置:

server:
  port: 8040
spring:
  application:
    name: microservice-gateway-zuul
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

由代码可知,我们编写了一个Zuul,并将其注册到了Eureka上。

测试

准备工作

启动多个应用,Eureka Server上展示如下:

反向代理测试

  • 访问 http://127.0.0.1:8040/microservice-provider-user/users/1 ,会发现请求被转发到了 microservice-provider-user 服务的 /users/1 端点;
  • 访问 http://127.0.0.1:8040/microservice-consumer-movie/movies/users/1 ,发现请求被转发到了 microservice-consumer-movie 服务的 /movies/users/1 端点;

负载均衡测试

多次访问访问 http://127.0.0.1:8040/microservice-provider-user/users/1 ,会发现两个 microservice-provider-user 都会打印类似如下的日志:

Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.balance as balance3_0_0_, user0_.name as name4_0_0_, user0_.username as username5_0_0_ from user user0_ where user0_.id=?
...

断路器测试

application.yml 中添加如下配置后,并重启Zuul:

management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: always

此时,此时访问 http://localhost:8040/actuator/health ,可看到类似如下结果:

{
  ...
  "hystrix":{"status":"UP"}
}

并且,当Zuul转发API后,访问 http://localhost:8040/actuator/hystrix.stream 可看到类似如下的信息:

data: {"type":"HystrixCommand","name":"microservice-provider-user",.....}

说明Zuul整合了Hystrix。

配套代码

  • GitHub:https://github.com/eacdy/spring-cloud-study/tree/master/2018-Finchley/microservice-gateway-zuul
  • Gitee:https://gitee.com/itmuch/spring-cloud-study/tree/master/2018-Finchley/microservice-gateway-zuul

本文分享自微信公众号 - IT牧场(itmuch_com),作者:周立

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-01-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 微服务之间的最佳调用方式

    在微服务架构中,需要调用很多服务才能完成一项功能。服务之间如何互相调用就变成微服务架构中的一个关键问题。

    用户1516716
  • 跟我学Spring Cloud(Finchley版)-02-构建分布式应用

    本书使用服务提供者与服务消费者来描述微服务之间的调用关系。下表解释了服务提供者与服务消费者。

    用户1516716
  • 跟我学Spring Cloud(Finchley版)-04-服务注册与服务发现-原理剖析

    地址硬编码问题——电影微服务中将用户微服务的地址写死,如果用户微服务地址发生变化,难道要重新上线电影微服务吗?

    用户1516716
  • 落地实践——Service Mesh下的微服务落地实践 | Techo大会精彩回顾第五期

    ? 全文共3637字,阅读需要7分钟 ? 导读 刘冠军《万象伊始——集中式架构为何演进到微服务架构》 秦金卫《转型求通——微服务架构的最佳实践和发展趋势》 曹...

    腾讯云中间件团队
  • 微服务相关

    是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。

    java攻城狮
  • 基于dubbo框架,如何进行大型微服务系统架构设计?

    一,为什么需要微服务框架 Nginx+tomcat组成的集群,这已经是非常灵活的集群技术,但是当我们的系统遇到更大的瓶颈,全部应用的单点服务器已经不能满足我们的...

    架构师小秘圈
  • 微服务(Microservice)那点事

    摘要: 微服务架构被提出很短的时间内,就被越来越多的开发人员推崇,简单来说其主要的目的是有效的拆分应用,实现敏捷开发和部署 。本分享即尝试介绍微服务架构的一些实...

    纯洁的微笑
  • 微服务(Microservice)那点事

    现在是资源共享的时代,同样也是知识分享的时代,如果你觉得本文能学到知识,请把知识与别人分享。

    互扯程序
  • (译)Medium 的微服务架构

    微服务架构的目标是帮助工程团队安全快速地完成高质量的产品交付。良好解耦的服务能够在最小化对其它系统的影响的条件下进行快速迭代。

    崔秀龙
  • 安防摄像机监控网页无插件视频直播综合管理平台EasyNVS如何对服务设备信息进行修改

    运维产品是平安城市发展到一定阶段的必然产物,用户花了大量经费来建设平安城市,随着前端、网络、存储、共享平台、实战平台、智能分析平台等建设的日趋完善,运行维护工作...

    EasyNVR

扫码关注云+社区

领取腾讯云代金券