为什么80%的码农都做不了架构师?>>>   

至此,已实现基于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。

编码

  • 加依赖

    <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上展示如下:

反向代理测试

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

本文首发

http://www.itmuch.com/spring-cloud/finchley-16/

干货分享

转载于:https://my.oschina.net/eacdy/blog/3005430

跟我学Spring Cloud(Finchley版)-16-Zuul相关推荐

  1. Spring Cloud Finchley版中Consul多实例注册的问题处理

    由于Spring Cloud对Etcd的支持一直没能从孵化器中出来,所以目前来说大多用户还在使用Eureka和Consul,之前又因为Eureka 2.0不在开源的消息,外加一些博眼球的标题党媒体使得 ...

  2. hystrix 全局熔断_跟我学Spring Cloud(Finchley版)14Feign使用Hystrix

    Feign默认已经整合了Hystrix,本节详细探讨Feign使用Hystrix的具体细节. 服务降级 1 加配置,默认Feign是不启用Hystrix的,需要添加如下配置启用Hystrix,这样所有 ...

  3. 跟我学Spring Cloud(Finchley版)-10-Feign深入

    上一节( 跟我学Spring Cloud(Finchley版)-09-Feign )讲了Feign的入门姿势并深入对比了RestTemplate,本节来深入探讨Feign的高级特性.总的来说,Feig ...

  4. 跟我学Spring Cloud(Finchley版)-07-Ribbon入门

    经过前文讲述,我们已经实现了服务发现.本节来解决 跟我学Spring Cloud(Finchley版)-02-构建分布式应用 提到的如下问题: 负载均衡如何考虑?难道得在电影微服务和用户微服务之间加个 ...

  5. 跟我学Spring Cloud(Finchley版)-04-服务注册与服务发现-原理剖析

    为什么80%的码农都做不了架构师?>>>    第2节( 跟我学Spring Cloud(Finchley版)-02-构建分布式应用 )说过: 地址硬编码问题--电影微服务中将用户微 ...

  6. 告诉老默我想学Spring Cloud了(新手篇):从0到1搭建Spring Cloud项目(实际项目开发的浓缩精华版)

    告诉老默我想学Spring Cloud了(新手篇):从0到1搭建Spring Cloud项目 一.前言 二.如何选择版本 2.1 SpringCloud 和 Spring Boot 版本选型 2.1. ...

  7. 一起来学Spring Cloud | 第五章:熔断器 ( Hystrix)

    在微服务项目中,一个系统可以分割成很多个不同的服务模块,不同模块之间我们通常需要进行相互调用.springcloud中可以使用RestTemplate+Ribbon和Feign来调用(工作中基本都是使 ...

  8. Spring Cloud Finchley OpenFeign的重试配置相关的坑

    如题,本文基于Spring Cloud Finchley.SR2 OpenFeign的重试 OpenFeign配置重试后,逻辑分析 对比Daltson和Finchley的基本组件,发现Ribbon还有 ...

  9. Spring Cloud(四) API网关Zuul

    前文回顾: Spring Cloud(一)Eureka Server-单体及集群搭建 Spring Cloud(二) 配置Eureka Client Spring Cloud(三) 熔断器Hystri ...

最新文章

  1. js如何实现扫描身份证识别_人脸识别是如何实现的
  2. 北大校长王恩哥送给毕业生的十句话
  3. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1069:乘方计算
  4. (七)数据结构之“字典”
  5. 如何使用Dockerfile构建镜像
  6. 5个不收费的自学网站:学英语、学编程、学电脑办公统统有
  7. sysV init服务脚本(入门级)
  8. 云课堂智慧职教计算机基础答案,云课堂智慧职教题库答案护理系内科,智慧职教职业生涯规划答案,智慧职教mooc学院计算机文化基础答案...
  9. CSDN-markdown编辑器使用教程存档
  10. Multisim元件库介绍以及中英文全面解析
  11. cad特性匹配快捷键命令_cad特性匹配快捷键命令_cad快捷键命令大全
  12. Android技术分享| 自定义LayoutManager
  13. 从循环条件的代码里,我能在面试中甄别程序员是否是高级
  14. faststone capture注册码
  15. Docker安装Rally
  16. Android 中 View 的手势事件处理
  17. localhost和127.0.0.1有什么区别?
  18. 程序算法之逆推法(口算猴子摘桃问题正解、详解)
  19. 如何查询澳大利亚药监局(TGA)药品信息数据
  20. 【深度学习 功法篇】win10操作系统PC端环境的部署(如何并存 不同的、多种版本的深度学习框架)

热门文章

  1. Ubuntu 16.04 LTS GNOME版本下载
  2. 如何修改系统时间显示格式
  3. SQL语句的增删改查
  4. 自动禁止ssh的root登陆
  5. nginx+tomcat实现集群负载均衡(实现session复制)
  6. Upgrade after a crash is not supported. The redo log was created with Maria的解决办法
  7. 简述数学建模的过程_数学建模研究过程指导:从高中数学体会数学概貌和数学建模...
  8. echarts geo地图示例_用Python,炫酷地图轻松绘制,一起来学习吧
  9. 【Python自学笔记】10个爬虫入门实例,附源码与注释
  10. python爬虫scrapy框架教程_Python爬虫教程-30-Scrapy 爬虫框架介绍