单体应用的情况下,很简单,客户端只需要发起一次服务请求,就可以获取多个需要的服务结果。
而在微服务的情况下,显示在产品页面的数据可能分布在不同的为微服务上,例如:

购物车服务——购物车中的件数
●订单服务——历史订单
●目录服务——商品基本信息,如名称、图片和价格
●评论服务——客户的评论
●库存服务——低库存预警
●送货服务——送货选项、期限和费用,这些信息单独从送货方 API 获取
●推荐服务——推荐商品

我们加载一个商品页面时,客户端要向至少7个微服务发送请求,并接收返回结果。

在微服务架构下,客户端直接与服务器进行的方式很少在实际中使用。我们就需要一个前置服务,即网关,来解决上面的问题。

网关:封装了应用程序的内部结构,客户端只需关心与网关交互。具有服务请求路由、服务请求组合、协议转换等功能。

缺点是:是增加了一个必须开发、部署和维护的高可用组件,然后每次开发微服务新模块或更新端点,都需要更新API网关。

spring cloud的网关,Zuul,一个提供了动态路由、监控、弹性负载和安全功能的网关组件。

Zuul是Netflix的基于JVM的路由器和服务器端的负载均衡器。Zuul中的所有请求都在Hystrix Command中执行。所以当断路器打开时,代理将不会重试连接后端服务。

uul中,所有路由默认的Hystrix的隔离模式为SEMAPHORE,可以使用“zuul.ribbonIsolationStrategy”参数改为其他的隔离策略(如THREAD)。
回顾:
THREAD(线程隔离):使用该方式,HystrixCommand将会在单独的线程上执行,并发请求受线程池中线程数量的限制。
SEMAPHORE(信号量隔离):使用该方式,HystrixCommand将会在调用线程上执行,开销相对较小,并发请求受到信号量个数的限制。
启动注解“@EnableCircuitBreaker”,Zuul中的所有请求都在Hystrix Command中执行。

@EnableCircuitBreaker
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(ZuulProxyMarkerConfiguration.class)
public @interface EnableZuulProxy {
}
可以看到是有Hystrix的启动注解“