`

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

 
阅读更多

说明:SpringCloud系列笔者自学系列,学习来源是周立的博客  http://www.itmuch.com/ 。而此处转载其博客只是为了方便自己以后的学习。

本篇来源 http://www.itmuch.com/spring-cloud/finchley-16/

 

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

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

为什么要使用网关

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

用户请求多个微服务

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

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

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

图8-2 使用微服务网关

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

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

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。

编码

  • 加依赖

     
    <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>
  • 加注解:@EnableZuulProxy

  • 写配置:

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

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

测试

准备工作

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

Eureka首页

反向代理测试

  • 访问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。

配套代码

相关文章

 

 

分享到:
评论

相关推荐

    spring-cloud-starter-netflix-zuul-2.0.0.RELEASE

    可用的spring-cloud-starter-netflix-zuul-2.0.0.RELEASE包,maven上的spring-cloud-starter-netflix-zuul-2.0.0.RELEASE已经没了。

    spring-cloud-netflix-zuul-websocket, Zuul反向代理网络套接字支持.zip

    spring-cloud-netflix-zuul-websocket, Zuul反向代理网络套接字支持 spring-cloud-netflix-zuul-websocketspring 应用程序中支持Zuul反向代理web套接字支持的简单库。用法spring-cloud-netflix-zuul-websocket可以从...

    spring-cloud-starter-netflix-zuul.zip已经闭源的jar包,pom

    《Spring Cloud Netflix Zuul:一个已经闭源的API网关组件》 在现代微服务架构中,API网关起着至关重要的角色,它作为一个统一的入口,负责路由、安全、监控等多种职责。Spring Cloud Netflix Zuul就是这样一款组件...

    springcloud-ribbon-feign-hystrix-zuul-config

    在Spring Cloud框架中,"springcloud-ribbon-feign-hystrix-zuul-config"这个标题涉及到四个关键组件:Ribbon、Feign、Hystrix和Zuul,以及配置管理Config。这些组件都是构建分布式系统时常用的服务发现、客户端负载...

    Spring Cloud Finchley SR2全套(集成Spring Gateway)

    ├──cloud-zuul-server────────────────第一代服务网关(Zuul)[8080] ├──cloud-gateway-server─────────────第二代服务网关(Gateway)[8080] ├──cloud-modules-app──────...

    spring-cloud-netflix-hystrix应用

    《深入理解Spring Cloud Netflix Hystrix:构建弹性微服务...在实际项目中,结合Spring Cloud其他组件,如Eureka(服务发现)、Zuul(API网关)等,可以构建出更为完善的微服务体系,提升整体系统的稳定性和可维护性。

    SpringCloud zuul jar包

    SpringCloud Zuul是Spring Cloud生态系统中的一个边缘服务和API网关组件。它的主要功能是作为微服务架构中的统一入口,负责路由转发、过滤器处理、负载均衡以及安全控制等任务。Zuul允许开发者在微服务架构中实现...

    spring-cloud-examples

    spring-cloud-config-eureka-bus:配置中心和消息总线示例(配置中心终结版) gateway-service-zuul:Spring Cloud Zuul使用初级篇 网关 均衡负载 spring-cloud-zuul:Spring Cloud Zuul使用高级篇 Filter 鉴权 熔断...

    springcloud-learning-master.zip springcloud学习合集

    8. **Spring Cloud Gateway**:Spring Cloud的新一代API网关,替代了Zuul,性能更好,功能更强大,支持更多路由策略和过滤器。 9. ** Sleuth** 和 **Zipkin**:分布式跟踪。Sleuth提供分布式日志追踪,Zipkin则是一...

    spring-cloud-demo-master.zip

    本篇文章将围绕"spring-cloud-demo-master.zip"这个入门项目,深入解析其中的关键组件——Eureka、Zuul、JPA、Hystrix以及File-Upload,旨在帮助读者快速掌握Spring Cloud的基础应用。 一、Eureka:服务注册与发现 ...

    spring-cloud-netflix-zuul-2.1.0.RELEASE.jar

    spring-cloud-netflix-zuul-2.1.0.RELEASE

    spring-cloud-starter-netflix-zuul-2.1.0.RELEASE.jar

    spring-cloud-starter-netflix-zuul-2.1.0.RELEASE

    spring-cloud-examples-master

    《Spring Cloud实战详解:基于spring-cloud-examples-master的深度解析》 在当今的软件开发领域,微服务架构已经成为主流趋势,而Spring Cloud作为Java生态中的微服务治理框架,深受开发者们的喜爱。本篇文章将深入...

    springcloud-learning-master.zip

    3. API Gateway:Spring Cloud Zuul 或 Spring Cloud Gateway 作为统一的入口,实现路由转发、过滤器、限流等功能。 4. 负载均衡:Ribbon 提供客户端负载均衡器,可以在微服务之间智能分配请求。 5. 断路器模式:...

    SpringCloud-Learning-master.zip

    《SpringCloud深度学习指南》 SpringCloud作为微服务架构中的热门框架,因其强大的服务治理功能和易用性,被广大开发者广泛采用。本资源“SpringCloud-Learning-master.zip”是程序猿DD关于SpringCloud的学习资料,...

    springcloud2-hystrix-feign-zuul.zip

    标题 "springcloud2-hystrix-feign-zuul.zip" 提示了我们这是一组关于Spring Cloud 2的实现,具体涉及Hystrix、Feign和Zuul组件的实践项目。Spring Cloud 是一个用于构建分布式系统的服务发现、配置管理和微服务连接...

    spring-cloud项目_springcloud_springcloud项目_springcloud_spring-clou

    Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具集,它为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)...

    spring-cloud-demo-main.zip

    在我们的项目中,可能有一个名为`zuul-api-gateway`的模块,负责统一对外提供接口。 3. **断路器Hystrix**:断路器模式是微服务架构中的一种重要设计,Hystrix是Netflix开源的实现。它可以帮助我们防止服务间的级联...

    spring-cloud使用的各种示例

    - [springcloud(四):熔断器Hystrix](http://www.ityouknow.com/springcloud/2017/05/16/springcloud-hystrix.html) - [springcloud(五):熔断监控Hystrix Dashboard和Turbine]...

    springcloud-demo-master.zip

    本篇文章将围绕"springcloud-demo-master.zip"这个项目,深入解析其中集成的Ribbon、Netflix Zuul、Eureka等核心组件,帮助读者掌握SpringCloud的实战应用。 首先,"springcloud-demo-master.zip"是一个基于Spring...

Global site tag (gtag.js) - Google Analytics