微服务架构Spring Cloud学习笔记1
基本概念
- Spring Cloud是一种微服务开发模板,模板中包含了许多常用组件,例如配置管理,服务发现,断路器,智能路由,微代理,控制总线等,Spring Cloud基于云原生的思想
- 云原生(Cloud Native)是一种软件开发风格,包括DevOps、持续交付(Continuous Delivery)、微服务(MicroServices)、敏捷基础设施(Agile Infrastructure)、康威定律(Conways Law)等,以及根据商业能力对公司进行重组。Cloud Native既包含技术(微服务,敏捷基础设施),也包含管理(DevOps,持续交付,康威定律,重组等)。Cloud Native也可以说是一系列Cloud技术、企业管理方法的集合
- Spring Cloud是基于Spring Boot的, 用于管理Spring Boot创建的各个微服务应用
- Spring Cloud为微服务架构开发涉及的配置管理,服务治理,熔断机制,智能路由,微代理,控制总线,一次性token,全局一致性锁,leader选举,分布式session,集群状态管理等操作提供了一种简单的开发方式
Spring Cloud Config
- spring cloud config是分布式配置中心组件
- 在分布式系统中,每一个功能模块都能拆分成一个独立的服务,一次请求的完成,可能会调用很多个服务协调来完成
- spring cloud config支持配置文件放在在配置服务的内存中,也支持放在远程Git仓库里
- config server用来管理所有的配置文件,维护的时候需要更改配置时,只需要在本地更改后,推送到远程仓库,所有的服务实例都可以通过config server来获取配置文件,为了保证系统的稳定,配置服务端config server可以进行集群部署
- 每个服务实例向config server获取配置文件,相当于配置服务的客户端config client
- 别人的架构图
Spring Cloud Bus
- Spring cloud bus通过轻量消息代理连接各个分布的节点
- 作用是管理和传播所有分布式项目中的消息
- 其实本质是利用了MQ的广播机制在分布式的系统中传播消息,目前常用的有Kafka和RabbitMQ
- 别人的架构图
Spring Cloud Netflix
针对多种Netflix组件提供的开发工具包,其中包括Eureka、Hystrix、Zuul、Archaius等。
Netflix Eureka
- Eureka是服务发现组件
参考什么是服务发现
- 服务启动后向Eureka注册,Eureka Server会将注册信息向其他Eureka Server进行同步
- 当服务消费者要调用服务提供者,则向服务注册中心获取服务提供者地址,然后会将服务提供者地址缓存在本地,下次再调用时,则直接从本地缓存中取
- 当Eureka Server检测到服务提供者因为宕机、网络原因不可用时,则在服务注册中心将服务置为DOWN状态
- 服务提供者在启动后,周期性(默认30秒)向Eureka Server发送心跳,以证明当前服务是可用状态。Eureka Server在一定的时间(默认90秒)未收到客户端的心跳,则认为服务宕机,注销该实例
- 别人的架构图
Netflix Hystrix
- 容错管理工具,实现断路器模式,通过控制服务的节点,从而对延迟和故障提供更强大的容错能力
- 在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。为了解决这个问题,业界提出了断路器模型(引用)
- 当失败的请求达到一个阈值(默认5秒失败20次),断路器生效,在一段时间内,所有尝试调用这个service的请求都会立即失败。在时间窗口过期后,断路器允许一小部分请求过去验证service是否已经恢复正常
- 别人的逻辑图
Netflix Ribbon
- 主要功能是提供客户端的软件负载均衡算法
- Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等
- 别人的架构图
Netflix Feign
- Feign是spring cloud中的调用框架,通常与ribbon,hystrix等组合使用
- 参考文章
Netflix Zuul
- zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用
- zuul 在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架
- Zuul做为网关层,自身也是一个微服务,跟其它服务Service-1,Service-2, … Service-N一样,都注册在eureka server上,可以相互发现,同时又以服务名为ContextPath的方式创建路由映射
- zuul的核心是一系列的filters
- zuul把Request route到 用户处理逻辑 的过程中,这些filter参与一些过滤处理,比如Authentication,Load Shedding等
- 别人的架构图
参考文章
Netflix Archaius
- archaius是基于java的配置管理类库,主要用于多配置存储的动态获取
- 在云平台开发中可以将其用作分布式配置管理依赖构件
- 能够实现动态类型化属性、配置改变时的回调机制、轮询框架、JMX,通过Jconsole检查和调用操作属性
组合配置 - 别人的架构图
Spring Cloud Sleuth
- Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案,并且兼容支持了Dapper,Zipkin和HTrace操作
- Span:基本工作单元,例如,在一个新建的span中发送一个RPC等同于发送一个回应请求给RPC,span通过一个64位ID唯一标识,span在不断的启动和停止,同时记录了时间信息,当你创建了一个span,你必须在未来的某个时刻停止它
- Trace:一系列spans组成的一个树状结构,例如,如果你正在跑一个分布式大数据工程,你可能需要创建一个trace
- Annotation:用来及时记录一个事件的存在,一些核心annotations用来定义一个请求的开始和结束
- cs - Client Sent -客户端发起一个请求,这个annotion描述了这个span的开始
- sr - Server Received -服务端获得请求并准备开始处理它,如果将其sr减去cs时间戳便可得到网络延迟
- ss - Server Sent -注解表明请求处理的完成(当请求返回客户端),如果ss减去sr时间戳便可得到服务端需要的处理请求时间
- cr - Client Received -表明span的结束,客户端成功接收到服务端的回复,如果cr减去cs时间戳便可得到客户端从服务端获取回复的所有所需时间
- 架构图
- 案例
Spring Cloud Data Flow
- Spring Cloud DataFlow用于开发和执行大范围数据处理包括ETL、批量计算和持续计算的统一编程模型和托管服务
- 开发者可以通过Spring Cloud DataFlow,在数据获取、实时分析、批处理等常见用例中执行数据流的创建和编排
- 参考文档
Spring Cloud Security
- 安全工具包,为你的应用程序添加安全控制,主要是指OAuth2。
- 参考文档
Spring Cloud Consul
- 封装了Consul操作,consul是一个服务发现与配置工具,与Docker容器可以无缝集成
- 各种服务发现工具的比较
参考文档
Spring Cloud Zookeeper
- 操作Zookeeper的工具包,用于使用zookeeper方式的服务注册和发现
- ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、配置维护,名字服务、分布式同步、分布式锁和分布式队列等功能
- 参考文档
Spring Cloud Stream
- Spring Cloud Stream 是一个用来为微服务应用构建消息驱动能力的框架
- 他通过使用Spring Integration来连接消息代理中间件以实现消息事件驱动
- 目前仅支持RabbitMQ、Kafka、Redis
- 应用通过Spring Cloud Stream插入的input和output通道与外界交流
- 参考文章
Spring Cloud CLI
- 提供命令行工具