微服务网关背景及简介
    不同的微服务一般有不同的网络地址,而外部的客户端可能需要调用多个服务的接口才能完
    成一个业务需求。比如一个电影购票的收集APP,可能回调用电影分类微服务,用户微服
    务,支付微服务等。如果客户端直接和微服务进行通信,会存在一下问题:
    # 客户端会多次请求不同微服务,增加客户端的复杂性
    # 存在跨域请求,在一定场景下处理相对复杂
    # 认证复杂,每一个服务都需要独立认证
    # 难以重构,随着项目的迭代,可能需要重新划分微服务,如果客户端直接和微服务通信,
    那么重构会难以实施
    # 某些微服务可能使用了其他协议,直接访问有一定困难
    上述问题,都可以借助微服务网管解决。微服务网管是介于客户端和服务器端之间的中间
    层,所有的外部请求都会先经过微服务网关,架构演变成:
    image.png
    这样客户端只需要和网关交互,而无需直接调用特定微服务的接口,而且方便监控,易于认
    证,减少客户端和各个微服务之间的交互次数
    zuul微服务网关
    Zuul是Netflix开源的微服务网关,他可以和Eureka,Ribbon,Hystrix等组件配合使用。Zuul
    组件的核心是一系列的过滤器,这些过滤器可以完成以下功能:
    # 动态路由:动态将请求路由到不同后端集群
    # 压力测试:逐渐增加指向集群的流量,以了解性能# 负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求
    # 静态响应处理:边缘位置进行响应,避免转发到内部集群
    # 身份认证和安全: 识别每一个资源的验证要求,并拒绝那些不符的请求
    Spring Cloud对Zuul进行了整合和增强。目前,Zuul使用的默认是Apache的HTTP
    Client,也可以使用Rest Client,可以设置ribbon.restclient.enabled=true.
    编写一个简单微服务网关见示例:08-ms-gateway-zuul
    添加依赖并在启动类上增加注解@EnableZuulProxy,声明一个zuul代理。该代理使用
    Ribbon来定位注册在 Eureka server中的微服务;同时,该代理还整合了Hystrix,从而实
    现了容错,所有经过 zuul的请求都会在 Hystrix命令中执行。
    image.png
    配置文件application.yml如下:
    image.png
    运行项目(需启动两个用户微服务和一个订单微服务,参看视频),访问地址:
    http://localhost:8040/microservice-provider-user/getIpAndPort
    发现zuul会代理所有注册到eureka server的微服务,并使用ribbon做负载均衡,zuul的路
    由规则如下,可以访问地址:http://localhost:8040/routes
    http://ZUUL_HOST:ZUUL_PORT/微服务在Eureka上的serviceId/**会被转发到
    serviceId对应的微服务
    zuul还自动整合了hystrix,访问地址:http://localhost:8040/hystrix.stream