一、Spring Cloud简介
1、互联网应用架构发展
1)、单体应用架构
业务简单,数据量小,所有的模块部署在一个应用,一个服务容器。
优点:成本低,开发节奏快,架构简单,易于调试部署。
缺点:功能不断迭代,耦合严重;代码杂乱;沟通成功高 。
2)、垂直应用架构
为了解决单体架构的问题,开始做模块的垂直划分,划分依据业务特性,互相不影响。
优点:系统拆分流量分担,方便水平扩展,系统互不影响,可以独立优化。
缺点:系统之间调用硬编码,方式不统一,监控不到位;数据库资源浪费;集群负载均衡复杂。
3)、分布式SOA
Service-Oriented Architecture面向服务架构,业务逻辑下沉到服务层,在垂直划分基础上拆分出松耦合,独立部署的模块,模块之间相互独⽴,通过暴露接口供其他场景调用(通过Webservice/Dubbo等技术进⾏通信)。
优点:分布式、松耦合、扩展灵活、可重⽤。
缺点:服务抽取粒度复杂、接口数量不好控制,服务调用链路长,调用方和提供方耦合度较⾼,服务质量不稳定。
4)、微服务架构
是SOA的一种拓展,拆分粒度更小,服务更独立。不同的服务可以使⽤不同的开发语⾔,业务彻底的服务化和组件化 。
优点:业务功能聚焦,团队合作⼀定程度解耦,便于实施敏捷开发,便于重⽤和模块之间的组装。
缺点:分布式管理复杂,分布式链路跟踪难。
2、Spring Cloud是什么
由于单体结构的应用随着系统复杂度的增高,会暴露出各种各样的问题。微服务架构逐渐取代了单体架构。Spring Cloud是目前最常用的微服务开发框架,已经在企业级开发中大量的应用。
Spring Cloud规范及实现意图要解决的问题其实就是微服务架构实施过程中存在的⼀些问题,比如微服务架构中的服务注册发现问题、网络问题(比如熔断场景)、统⼀认证安全授权问题、负载均衡问题、链路追踪等问题。
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、智能路由、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。
Spring Cloud提供了一站式的微服务的解决方案。
3、核心组件发展比较
第⼀代 Spring Cloud(Netflix, SCN) | 第⼆代 Spring Cloud(主要就是Spring Cloud Alibaba, SCA) | |
注册中⼼ | Netflix Eureka | 阿⾥巴巴 Nacos |
客户端负载均衡 | Netflix Ribbon | 阿⾥巴巴 Dubbo LB、 Spring Cloud Loadbalancer |
熔断器 | Netflix Hystrix | 阿⾥巴巴 Sentinel |
网关 | Netflix Zuul:性能⼀般,未来将退出Spring Cloud ⽣态圈 | 官⽅ Spring Cloud Gateway |
配置中心 | 官⽅ Spring Cloud Config | 阿⾥巴巴 Nacos、携程 Apollo |
服务调⽤ | Netflix Feign | 阿⾥巴巴 Dubbo RPC |
消息驱动 | 官⽅ Spring Cloud Stream | |
链路追踪 | 官⽅ Spring Cloud Sleuth/Zipkin |
二、Eureka服务注册中心
1、服务注册与服务发现
服务提供者将所提供服务的信息(服务器IP和端口、服务访问协议等)注册/登记到注册中心,服务消费者能够从注册中心获取到较为实时的服务列表,然后根据⼀定的策略选择⼀个服务访问。
为了支持弹性扩缩容特性,微服务的提供者数量和分布往往是动态变化的,静态LB机制不再适用,所以需要额外引入注册中心组件。
服务注册中心本质上是为了解耦服务提供者和服务消费者。
2、服务注册中心原理
1)服务提供者启动
2)服务提供者将相关服务信息主动注册到注册中心
3)服务消费者获取服务注册信息:pull模式和push模式
4) 服务消费者直接调⽤服务提供者
3、Eureka注册中心原理
Eureka是Netflix出品服务注册发现工具,Spring Cloud封装了Netflix公司开发的Eureka模块来实现服务注册和发现。Eureka采用C-S的设计架构,包含Eureka Server 和Eureka Client两个组件。基于 RestfulAPI风格开发。
1)原理
2)细节详解
a、元数据
DiscoveryClient通过@EnableDiscoveryClient的方式进行启用,专门负责服务发现。
ServiceInstance服务实例对象存储实例的元数据信息。
元数据有两种:标准元数据和⾃定义元数据。
标准元数据: 主机名、 IP地址、端⼝号等信息,这些信息都会被发布在服务注册表中,⽤于服务之间的调⽤。
⾃定义元数据: 可以使⽤eureka.instance.metadata-map配置,符合key/value的存储格式。
i