Spring Cloud微服务架构简介
最近阅读了周立的《Spring Cloud与Docker》收获挺大的,抽了一点时间对书中的内容做了总结。方便大家快速了解什么是Spring Cloud,Spring Cloud主要的功能及Spring Cloud服务治理。如下博客的内容都出自这本书。
什么是微服务
微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并且可通过全自动部署机制独立部署。这些服务共用一个最小型的集中式的管理,服务可用不同的语言开发,使用不同的数据存储技术。
微服务架构应该具备以下特性:
每个微服务可独立运行在自己的进程里。
一系列独立运行的微服务共同构建起整个系统。
每个服务为独立的业务开发,一个微服务只关注某个特定的功能,例如订单管理,用户管理等。
微服务之间通过一些轻量的通信机制进行通信,例如通过RESTful API进行调用。
可以使用不同的语言与数据存储技术
- 全自动部署机制
微服务架构的优点
易于开发和维护
- 一个微服务只会关注一个特定的业务功能,所以它业务清晰,代码量较少。
单个微服务启动较快
- 单个微服务代码量较少,所以启动会比较快。
局部修改容易部署
- 单体应用只要有修改,就得重新部署整个应用,微服务解决了这样的问题。
技术栈不受限
- 在微服务架构中,可以结合项目业务及团队的特点,合理地选择技术栈。
按需伸缩
- 可根据需求,实现细粒度的扩展。
微服务架构面临的挑战
运维要求高
- 更多的服务意味着更多的运维投入。
分布式固有的复杂性
- 使用微服务架构是分布式系统。对于一个分布式系统,系统容错,网络延迟,分布式事务等都会带来巨大的挑战。
接口调整成本高
- 微服务之间通过接口进行通信。如果修改某一个微服务的API,可能所有使用了该接口的微服务都需要做调整。
重复劳动
- 很多服务可能都会使用到相同的功能,而这个功能并没有达到分解为一个微服务的程度,这个时候,可能各个服务都会开发这一功能,从而导致代码重复。
微服务整体架构图
服务注册于发现
各个服务在启动时,将自己的网络地址等信息注册到服务发现组件中,服务发现组件会存储这些信息。
服务消费者可以从服务发现组件查询服务提供者的网络地址,并使用该地址调用服务提供者的接口。
各个微服务与服务发现组件使用一定机制(例如心跳)通信。服务发现组件如长时间无法与某为服务实例通信,就会注销该实例。
微服务网络地址发生变更(例如实例增减或者IP端口发生变化等)时,会重新注册到服务发现组件。使用这种方式,服务消费者就无须人工修改提供者的网络地址了。
Fegion实现声明式REST调用
REST(Representational State Transfer ),用中文翻译为"具象状态传输"(也有:"代表性状态传输")。是由 Roy Thomas Fielding博士 在2000年就读加州大学欧文分校期间在学术论文中提出的一个术语。REST 定义了一组体系架构原则,您可以根据这些,包括使用不同语言编写的客户端如何通过 HTTP 处理和传输资源状态。Feign是一个声明式的WebService客户端。使用Feign能让编写WebService客户端更加简单,它的使用方法是定义一个接口,然后在接口上添加注解,同时也支持JAX-RS标准的注解。Feign也支持可插拔式的编码器和×××。SpringCloud对Feign进行了封装,使其支持SpringMVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。
使用Hystrix实现微服务的容错处理
Hystrix是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统,服务或者第三方库,防止级联失败,从而提升系统的可用性和容错性。Hystrix主要通过以下几点实现延迟和容错。
包裹请求:使用HystrixCommand包裹对依赖的调用逻辑,每个命令在独立线程中执行。这使用到了设计模式中的"命令模式"。
- 跳闸机制:当某服务的错误率超过一定阈值时,Hystrix可以自动或者手动跳闸,停止请求该服务一段时间。
- 资源隔离:Hystrix为每个依赖都维护了一个小型的线程池(或者信号量)。如果该线程池已满,发往该依赖的请求就被立即拒绝,而不是排队等候,从而加速失败判定。
- 监控:Hystrix可以近乎实时地监控运行指标和配置变化,例如成功,失败,超时以及被拒绝的请求等。
- 回退机制:当请求失败,超时,被拒绝,或当断路器打开时,执行回退逻辑。回退逻辑可由开发人员自行提供,例如返回一个缺省值。
- 自我修复:断路器打开一段时间后,会自动进入"半开"状态。
如果没有容错处理,"基础服务故障"导致"级联故障"从而形成右边的雪崩效应
使用Zuul构建微服务网关
Zuul是Netflix开源的微服务网关,它可以和Eureka,Ribbon,Hystrix等组件配合使用。Zuul的核心是一系列的过滤器,这些过滤器可以完成以下功能。
- 身份认证与安全
- 动态路由
- 压力测试
- 负载分配
- 静态响应处理
- 多区域弹性
Zuul大部分功能是通过过滤器实现的,如右图所示。
使用Spring CloudConfig统一管理微服务配置
Spring Cloud Config支持在Git, SVN和本地存放配置文件,使用Git或者SVN存储库可以很好地支持版本管理,Spring默认配置是使用Git存储库。具有如下优点:
集中管理配置:一个使用微服务架构的应用系统可能会包含成百上千个微服务,因此几种管理配置是非常有必要的。
不同环境不同配置:例如,数据源配置在不同的环境(开发,测试,预发布,生产等)中是不同的。
运行期间可动态调整:例如可根据各个微服务的负载情况,动态调整数据源连接池大小或熔断阈值,并且在调整配置是不停止微服务。
配置修改后可自动更新。如配置内容发生变化,微服务能够自动更新配置。
Spring Cloud服务治理
注册中心监控
容错处理监控
微服务健康检查
微服务调用追踪