在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用(七)
一、在阿里云容器服务上开发Spring Cloud微服务应用
三、服务发现
四、服务间通信与集成
五、服务智能路由
六、集中配置管理
七、高可用和容错(本文)
八、监控和日志
服务降级和容错Spring Cloud 提供了Netflix Hystrix智能断路器能力。当服务调用超时或出错的时候,可以将对失效服务的调用断路,尽量使得错误不会在系统中产生雪崩效应。
在这里简单介绍一下如何在应用中添加Hystrix支持。由于篇幅所限,本文的示例代码中没有包含这部分内容。读者可以访问Spring Cloud Netflix 文档获取详细描述。
在build.gradle中添加项目对Hystrix和Eureka的依赖包。
dependencies { compile(org.springframework.cloud:spring-cloud-starter-hystrix) compile(org.springframework.cloud:spring-cloud-starter-eureka) }
在应用里添加@EnableCircuitBreaker注解。由于已经引入了Hystrix依赖,这实际上是使用Hystrix的熔断器能力。
@SpringBootApplication @EnableDiscoveryClient @EnableCircuitBreaker public class FoobarHystrixApplication { public static void main(String[] args) { SpringApplication.run(FoobarHystrixApplication.class, args); }
在服务调用时,针对可能出错的下游服务通过@HystrixCommand设置出错时的fallback方法,一旦调用超时或出错会调用fallback方法。
@Service public class BarService { @Autowired @LoadBalanced private RestTemplate restTemplate; @HystrixCommand(fallbackMethod = "getMessageFallback") public String getMessage() { return restTemplate.getForObject("http://bar/message", String.class); public String getMessageFallback(){ return "Bar service (fallback result)";
通过引入Hystrix,可以完成服务一级的出错断路功能,提供了fallback方法后,可以在下游服务失效的时候返回临时替代结果,一定程度上实现了服务降级的能力。
跨可用区部署实现应用的高可用的方式之一是将容器实例部署到多个可用区中。阿里云容器服务支持跨可用区的编排,以及其它很多部署模式。
比如我们想按照如下架构部署应用:
容器集群的节点分布在两个可用区里,每个服务至少为两个容器实例,同一容器实例不要在一个可用区内。外面申请一个SLB将流量导入,进行跨可用区的负载均衡。
这样的部署描述文件可以声明如下:
... svc1: image: xxx svc2: image: xxx environment: - affinity:service!=svc1 foo: image: xxx labels: aliyun.scale: "2" environment: - availability:az==2 ...
在svc2的描述中affinity:service!=svc2表示svc2不能部署在svc1所在节点。
foo的描述中aliyun.scale: "2"表示有两个节点,这两个节点必须在不同的可用区(availability:az==2)
节点失效时容器重新调度容器服务支持对Docker容器的重新调度:当一个节点失效时,容器可以被自动调度到其他可用节点自动运行。缺省情况下,容器的重新调度策略是关闭的。根据需要可以用如下配置来让重调度策略生效:
redis: image: redis environment: - reschedule:on-node-failure
这里演示的只是很小一部分容器服务的服务治理能力,详细内容请参见服务编排文档
本文演示了如何利用阿里云容器服务的服务编排能力实现应用的高可用,以及Spring Cloud Hystrix 熔断器的使用方式。
Docker下的Spring Cloud三部曲之三:在线横向扩容 本章是《Docker下的Spring Cloud三部曲》的最后一篇,前面两篇我们实践了开发和制作镜像文件,运行一个基于spring cloud的RPC服务环境,今天我们来试试docker-compose的扩容功能,将我们的RPC服务做在线扩容
Docker下的Spring Cloud三部曲之二:细说Spring Cloud开发 《Docker下的Spring Cloud三部曲》系列的第二篇,详细讲解上一篇实例中用到的eureka、provider、consumer等三个应用的开发过程
libinjingshan 李斌,目前负责阿里云容器服务解决方案的研发工作。加入阿里之前,李斌曾在IBM工作,专注于企业软件开发,DevOps,微服务和Docker实践。
相关文章
- spring学习笔记(19)mysql读写分离后端AOP控制实例
- 【Spring Boot】Spring Boot之跨域解决方案
- 微服务架构实践 - 你只懂docker与spring boot就够了吗?
- Spring Boot与Docker部署
- WebFlux 集成 Thymeleaf 、 Mongodb 实践 - Spring Boot(六)
- spring boot: 用thymeleaf嵌套循环展示多层数据(spring boot 2.3.2)
- spring boot:实现图片文件上传并生成缩略图(spring boot 2.3.1)
- 使用 Docker 部署 Spring Boot 项目
- Spring Cloud Alibaba基础教程:Nacos配置的加载规则详解
- 让你的Spring Boot工程支持HTTP和HTTPS
- Spring AOP的最佳实践
- 在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用(二)
- 在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用(八)
- Spring依赖注入(四):Bean的循环依赖是如何产生和解决的?
- 学习Spring Boot:(十四)spring-shiro的密码加密
- 在Spring Boot + Mybatis 中,使用@Repository失效
- 毕业设计 Spring Boot的垃圾分类管理系统(含源码+论文)
- Spring Cloud Alibaba微服务第24章之Docker部署