全面而且简洁介绍SpringCloud微服务( 二 )


@Autowired@LoadBalancedprivate RestTemplate restTemplate;@RequestMapping("/")public String consume() { ProducerResponse response = restTemplate.getForObject("http://producer", ProducerResponse.class); return String.format("{"value": %s}", response.getValue());}Hystrix 为分布式系统提供了常见的容错模式的实现(如断路器 和隔板) 。断路器通常被实现为状态机 , 其示例在图5中找到 。

全面而且简洁介绍SpringCloud微服务

文章插图
 
断路器可以放置在服务和其远程依赖之间 。如果电路关闭 , 则对依赖关系的调用正常通过 。如果呼叫失败 , 则计算该失败 。如果故障次数在可配置的时间段内达到阈值 , 则电路跳闸以打开 。在打开状态下 , 调用不再发送到依赖项 , 并且生成的行为是可自定义的(抛出异常 , 返回伪数据 , 调用不同的依赖关系等) 。
定期地 , 状态机将转换到“半开”状态 , 以确定依赖关系是否再次健康 。在这种状态下 , 请求再次通过 。如果请求成功 , 机器将返回到关闭状态 。如果请求失败 , 机器将转回到打开状态 。
Spring Cloud应用程序可以通过添加spring-cloud-starter-hystrix 依赖关系并注释@EnableCircuitBreaker其配置类来利用Hystrix 。然后 , 您可以通过以下方式对任何Spring Bean方法用@HystrixCommand添加断路器:
@HystrixCommand(fallbackMethod = "getProducerFallback")public ProducerResponse getValue() { return restTemplate.getForObject("http://producer", ProducerResponse.class);}此示例指定一个名为getProducerFallback的后备方法 。当断路器处于断开状态时 , 这种方法将被用来代替getValue:
private ProducerResponse getProducerFallback() { return new ProducerResponse(42);}除了提供状态机行为外 , Hystrix还会从每个断路器发出一个指标流 , 提供重要的遥测 , 如请求测量 , 响应时间直方图以及成功 , 失败和短路请求的数量(图6) 。
全面而且简洁介绍SpringCloud微服务

文章插图
 
Zuul处理Netflix边缘服务的所有传入请求 。它与其他Netflix组件(如Ribbon和Hystrix)结合使用 , 为Netflix服务提供灵活而有弹性的路由选择层 。
Netflix使用动态加载到Zuul中的过滤器执行以下功能:
  1. 身份验证和安全性: 识别每个资源的身份验证要求 , 并拒绝不满足他们的请求 。
  2. 洞察和监控: 跟踪边缘的有意义的数据和统计数据 , 以便我们准确地了解生产情况 。
  3. 动态路由: 根据需要将请求动态路由到不同的后端集群 。
  4. 压力测试: 逐渐增加到集群的流量 , 以衡量性能 。
  5. 卸载: 为每种类型的请求分配容量并删除超过限制的请求 。
  6. 静态响应处理: 直接在边缘构建一些响应 , 而不是将它们转发到内部集群 。
  7. 多区域弹性: 跨AWS地区的路由请求 , 以使我们的ELB使用多样化 , 并使我们的边缘更接近我们的成员 。
此外 ,  Netflix利用Zuul的功能,通过canary 版本执行外部路由和压力测试 。
对于一个UI应用程序想要代理对一个或多个后端服务的呼叫等非常常见的用例 , Spring Cloud已经创建了一个嵌入式的Zuul代理 , 以简化开发 。该功能便于用户前端对其所需的后端服务进行代理 , 避免了对所有后端单独管理CORS(跨原始资源共享)和身份验证问题的需求 。Zuul代理是API网关模式的一个重要应用(图7)
全面而且简洁介绍SpringCloud微服务

文章插图
 
Spring Cloud增强了嵌入式Zuul代理 , 提供文件上传的自动处理功能 , 并且通过添加Spring Cloud Security可以轻松提供OAuth2 SSO , 以及向下游服务提供令牌继承 。Zuul使用Ribbon作为其客户端和所有出站请求的负载均衡器 。Ribbon的动态服务器列表通常由Eureka导入 , 但Spring Cloud能够从其他来源导入 。
进入微服务世界使我们直接进入分布式系统的世界 , 分布式系统并不总是“正常工作” , 所以我们必须假设我们系统的组件的行为和位置往往会是以不可预知的方式不断变化 。
转自:https://www.jdon.com/soa/spring-cloud.html



推荐阅读