spring cloud 介绍
spring cloud 是一系列框架的集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。spring cloud 并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过 spring boot 风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
spring cloud 对于中小型互联网公司来说是一种福音,因为这类公司往往没有实力或者没有足够的资金投入去开发自己的分布式系统基础设施,使用 spring cloud 一站式解决方案能在从容应对业务发展的同时大大减少开发成本。同时,随着近几年微服务架构和 docker 容器概念的火爆,也会让 spring cloud 在未来越来越“云”化的软件开发风格中立有一席之地,尤其是在目前五花八门的分布式解决方案中提供了标准化的、一站式的技术方案,意义可能会堪比当年 servlet 规范的诞生,有效推进服务端软件系统技术水平的进步。
spring cloud 技术组成
spring cloud是什么
spring cloud 是一个工具集
- 集成多个工具,来解决微服务中的各种问题
- 微服务全家桶
spring cloud 不是什么?
- spring cloud 不是一个解决单一问题的工具
- eureka
微服务治理,服务注册和发现 - ribbon
负载均衡、请求重试 - hystrix
断路器,服务降级、熔断 - feign
ribbon + hystrix 集成,并提供声明式客户端 - hystrix dashboard 和 turbine
hystrix 数据监控 - zuul
API 网关,提供微服务的统一入口,并提供统一的权限验证 - config
配置中心 - bus
消息总线, 配置刷新 - sleuth+zipkin
链路跟踪
Spring Cloud 对比 Dubbo
Dubbo
- Dubbo只是一个远程调用(RPC)框架
- 默认基于长连接,支持多种序列化格式
Spring Cloud
- 框架集
- 提供了一整套微服务解决方案(全家桶)
- 基于http调用, Rest API
service - 服务
- 商品服务 item service,端口 8001
- 用户服务 user service,端口 8101
- 订单服务 order service,端口 8201
commons 通用项目
新建 maven 项目
item service 商品服务
- 新建项目
- 配置依赖 pom.xml
- 配置 application.yml
- 配置主程序
- 编写代码
新建 spring boot 起步项目
Spring MVC 接收参数的几个注解
user service 用户服务
- 新建项目
- 配置依赖 pom.xml
- 配置 application.yml
- 配置主程序
- 编写代码
spring boot 起步项目
order service 订单服务
- 新建项目
- 配置依赖 pom.xml
- 配置 application.yml
- 配置主程序
- 编写代码
spring boot 起步项目
Eureka
- 注册
服务提供者启动时,向eureka一次次反复注册,直到注册成功为止 - 拉取注册表
服务发现者每30秒拉取一次注册表(刷新注册表) - 心跳
服务提供者每30秒发送一次心跳数据
eureka连续3次收不到一个服务的心跳,会删除这个服务 - 自我保护模式
特殊情况
如果由于网络不稳定或中断,15分钟内,85%以上服务器出现心跳异常,就会自动进入保护模式。
在保护模式下,所有服务都不删除。
网络恢复后,可以自动退出保护模式,恢复正常
开发期间很容易达到保护模式的条件,会影响测试,在开发期间可以关闭保护模式
注册和发现
注册中心产品:
zookeeper、eureka、nacos、consul、etcd.....
springcloud中推荐使用eureka
eureka 和 zookeeper 区别:
第一步了解关系数据库和非关系数据库遵循的原则:
RDBMS==>(MySql,Oracle,SqlServer等关系型数据库)遵循的原则是:ACID原则(A:原子性。C:一致性。I:独立性。D:持久性。)。
NoSql==> (redis,Mogodb等非关系型数据库)遵循的原则是:CAP原则(C:强一致性。A:可用性。P:分区容错性)。
第二步了解cap原则
CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。
CAP理论也就是说在分布式存储系统中,最多只能实现以上两点。而由于当前网络延迟故障会导致丢包等问题,所以我们分区容错性是必须实现的。也就是NoSqL数据库P肯定要有,我们只能在一致性和可用性中进行选择,没有Nosql数据库能同时保证三点。(==>AP 或者 CP)
第三步总结两者区别
Zookeeper的设计理念就是分布式协调服务,保证数据(配置数据,状态数据)在多个服务系统之间保证一致性,这也不难看出Zookeeper是属于CP特性(Zookeeper的核心算法是Zab,保证分布式系统下,数据如何在多个服务之间保证数据同步)。Eureka是吸取Zookeeper问题的经验,先保证可用性。
eureka:
- 强调AP(可用性)
- 集群结构:对等结构
zookeeper:
- 强调CP(一致性)
- 集群结构:主从结构
eureka 注册与发现
1.创建eureka项目
2.配置依赖 pom.xml
3.配置 application.yml
---主机名
---用保护模式
---针对单台服务器,配置不向自己注册,也不从自己拉取注册表
4.主程序启用 eureka 服务器
---启动类注解 @EnableEurenaServer,通过注解触发自动配置
6.启动,访问测试
创建 eureka server 项目:sp05-eureka
application.yml
spring:
application:
name: eureka-server
server:
port: 2001 #默认8761
eureka:
instance:
hostname: eureka1 #主机名,集群中区分不同服务器
server:
enable-self-preservation: false #开发期间禁用保护模式
client:
register-with-eureka: false #单台服务器不向自己注册
fetch-registry: false #单台服务器不从自己拉取
- eureka 集群服务器之间,通过
hostname
来区分 eureka.server.enable-self-preservation
eureka 的自我保护状态:心跳失败的比例,在15分钟内是否超过85%,如果出现了超过的情况,Eureka Server会将当前的实例注册信息保护起来,同时提示一个警告,一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据。也就是不会注销任何微服务eureka.client.register-with-eureka=false
不向自身注册eureka.client.fetch-registry=false
不从自身拉取注册信息eureka.instance.lease-expiration-duration-in-seconds
最后一次心跳后,间隔多久认定微服务不可用,默认90
主程序
- 添加
@EnableEurekaServer
package cn.tedu.sp05;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class Sp05EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(Sp05EurekaApplication.class, args);
}
}
修改 hosts 文件,添加 eureka 域名映射
C:WindowsSystem32driversetchosts
添加内容:
127.0.0.1 eureka1
127.0.0.1 eureka2
启动,并访问测试
service provider 服务提供者
- 修改 item-service、user-service、order-service,把微服务注册到 eureka 服务器
- pom.xml 添加eureka依赖
- application.yml 添加eureka注册配置
- 主程序启用eureka客户端
- 启动服务,在eureka中查看注册信息
pom.xml 添加 eureka 客户端依赖
右键点击项目,或点击pom.xml,用 STS 工具编辑起步依赖
上面的操作会在pom.xml中添加以下依赖
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
application.yml 添加 eureka注册配置
eureka:
client:
service-url:
defaultZone: http://eureka1:2001/eureka
eureka.instance.lease-renewal-interval-in-seconds
心跳间隔时间,默认 30 秒- defaultZone,默认位置,可以修改为具体地理位置,比如:beiJing, shangHai, shenZhen 等,表示 eureka 服务器的部署位置, 需要云服务器提供
eureka.client.registry-fetch-interval-seconds
拉取注册信息间隔时间,默认 30 秒
主程序启用服务注册发现客户端
修改 item-service、user-service 和 order-service,
主程序添加 @EnableDiscoveryClient
注解可以省略
启动,并访问 eureka 查看注册信息
eureka 和 “服务提供者”的高可用
item-service 高可用
启动参数 --server.port
可以覆盖yml中的端口配置
配置启动参数
- item-service-8001
--server.port=8001
- item-service-8002
--server.port=8002
启动测试
- 访问 eureka 查看 item-service 注册信息
eureka 高可用
添加两个服务器的 profile 配置文件
application-eureka1.yml
eureka:
instance:
hostname: eureka1
client:
register-with-eureka: true #profile的配置会覆盖公用配置
fetch-registry: true #profile的配置会覆盖公用配置
service-url:
defaultZone: http://eureka2:2002/eureka #eureka1启动时向eureka2注册`
application-eureka2.yml
eureka:
instance:
hostname: eureka2
client:
register-with-eureka: true #profile的配置会覆盖公用配置
fetch-registry: true #profile的配置会覆盖公用配置
service-url:
defaultZone: http://eureka1:2001/eureka #eureka2启动时向eureka1注册
配置启动参数 --spring.profiles.active
和 --server.port
- eureka1 启动参数:
--spring.profiles.active=eureka1 --server.port=2001
- eureka2 启动参数:
--spring.profiles.active=eureka2 --server.port=2002
如果在命令行运行,可以在命令行中添加参数:
java -jar xxx.jar --spring.profiles.active=eureka1 --server.port=2001
访问 eureka 服务器,查看注册信息
eureka客户端注册时,向两个服务器注册
修改以下微服务
- sp02-itemservice
- sp03-userservice
- sp04-orderservice
eureka:
client:
service-url:
defaultZone: http://eureka1:2001/eureka, http://eureka2:2002/eureka
当一个 eureka 服务宕机时,仍可以连接另一个 eureka 服务