SpringCloud 版本选择
通用版 H 版
SpringCloud 与 Springboot 版本依赖
H - > 2.2.0.M4 ~ 2.2.5
G - > 2.1.X
常用版本
cloud: H.SR1
boot: 2.2.2
cloudAlibaba: 2.1.0
java: 8
Maven: 3.5
Mysql: 5.7
SpringCloud 停更说明
- 服务注册中心:
Eureka: 停更
zookeeper
Nacos(SpringCloud alibaba) - 服务调用
Ribbon 维护状态
LoadBlance (孵化中) - 服务调用
Feign : 停更
OpenFeign (SpringCloud 社区出品) - 服务降级
Hystrix : 维护状态
resilience4j 官网推荐
Sentinel (alibaba) 服务熔断和降级
SpringCloud 是什么?
基于 SpringBoot 提供了一套微服务解决方案。
包括服务注册与发现,配置中心,全链路监控,
服务网关,负载均衡,熔断器组件。
SpringCloud 的优势
- 整体解决方案和成熟度高
- 社区热度高
- 学习曲线 - 注解
SpringBoot 与 SpringCloud 的关系
- SpringBoot 专注于快速方便的开发单个个体微服务
- SpringCloud 是关注全局的微服务协调治理框架,它将SpringBoot 开发的单个微服务整合并管理
并管理起来,为各个微服务之间提供:配置管理、服务发现、断路器、路由、微代理、事件总线、
全局锁、决策竞选、分布式会话等集成服务! - SpringBoot 可以离开SpringCloud 独立使用,SpringCloud 离不开SpringBoot。
Dubbo 和 SpringCloud 对比
最大区别:SpringCloud 抛弃了 Dubbo 的RPC 通信,采用的是基于 HTTP 的 RESTFUL 方式
社区活跃度:Dubbo 停更5年左右
解决的问题域不一样:Dubbo 的定位是一款RPC框架,SpringCloud 的目标是微服务架构下的一站式解决方案。
SpringCloud 社区
- 中国社区
http://www.springcloud.cn/ - 中文API文档
https://www.springcloud.cc/
Eureka
什么是 Eureka
Eureka 是Netflix 的子模块。是一个 CS架构。
Eureka 基于 Rest, 主管服务的注册与发现。
类似于Dubbo 的 Zookeeper。
Eureka Server 是服务的注册中心。
系统的其他微服务,通过 Eureka 客户端连接到 Eureka Server 并维持其心跳,这样就可以通过
Eureka Server 来监控各个系统的微服务是否正常,Spring Cloud 中的其他一些模块,
Eureka 两大组件
Eureka Server 和 Eureka Client ,
Server 提供注册服务,各个节点启动后会在 Server 注册服务
Client 是Java 客户端,内置负载均衡器。
各个应用启动后会向Server 发送心跳(默认周期为 30 秒),如果 Server 在多个心跳周期内没有
接收到某个节点的心跳,Server 会将该节点移除,默认周期为 90 秒。
服务端配置
server:
port: 7001
eureka:
instance:
hostname: localhost // Eureka 服务端的实例名称
client:
register-with-eureka: false // 表示是否向 Eureka 注册中心注册自己的服务
fetch-registry: false // 表示是否自己是注册中心
server-url: // 监控页面
defaultZone: http://${enreka.instance.hostname}:${server.port}
@EnableEurekaServer // Eureka 注册中心标识
客户端配置
eureka:
clent:
server-url:
defaultZone: http://localhost:7001/eureka/
instance:
instance-id: provider // 微服务在eureka 中的别名
prefer-ip-address: true // 微服务在 Eureka 中的 IP
@EnableEurekaClent
Eureka 的自我保护机制
默认情况下,如果 Eureka 在一定时间内没有收到某个微服务实例的心跳,Server 将会注销该实例(默认 90 秒),但是当出现网络分区故障时,微服务与Server 端无法正常通信,可能微服务时健康的,此时不应该注销该微服务实例,Eureka 通过自我保护机制来解决这个问题,即当Server 节点在短时间内丢失过多的客户端时,这个节点就会进入自我保护模式,Server 会保护注册表中的信息,不在删除注册表中数据,网络回复后,Server 节点会自动退出自我保护模式。
就是:某个时刻某一微服务不可用了,eureka 不会立马清理掉,依旧会对该微服务的信息进行保存。
eureka-server服务端
enreka.server.enable-self-preservation = false // 关闭自我保护机制
总结:宁可同时保留所有微服务(健康的和不健康的微服务都会保留),也不盲目注销任何健康的微服务。
使用自我保护机制可以让Eureka集群更加健壮和稳定。
Discovery
服务发现,对于注册进Eureka 中的服务,可以通过服务发现获取这些微服务信息。
提供者添加服务发现接口
@Autowired
private DiscoveryClient client;
Eureka 集群
什么叫集群
不同服务端部署相同代码,实现相同的功能,如果有一台服务器不可用,另一台服务器可以起到正常工作的目的。具有高可用性。
Eureka 集群配置
TODO
1: 各个Eureka 之间进行同步
2: 客户端注册多台Eureka 服务端
CAP 原理
C:强一致性
A: 可用性
P: 分区容错性
CAP 原理: 一个分布式系统,不可能同时满足一致性、可用性、容错性。最多满足两点。
Eureka 和 Zookeeper 区别
NetFlix 在设计Eureka 时遵守的是 AP 原则 - 自我保护机制
Zookeeper 遵守 CP 原则 - Zookeeper 的选举过程集群不可用
Eureka 有多个节点,节点之间是平等的,当其他节点挂掉不会影响正常节点的使用,只不过查询的信息不是最新的,也就是说Eureka 不能保证一致性,但可以保证高可用。而且Eureka 的自我保护机制也就是心跳机制,Zookeeper 的一台机器挂掉了,会重新选举Learder,这个过程不会对外提供服务,选举后会保证各个主从节点数据同步做到了一致性。
Ribbon
Ribbon 是什么
相当于 Nginx !
SpringCloud Ribbon 是基于 Netflix 实现的一套客户端负载均衡的工具。
Ribbon 是NetFlix 发布的开源项目,主要功能是蹄冻客户端的软件负载均衡算法,将NetFlix
的中间层服务连接在一起,Ribbon 的客户端组件提供一系列的配置:连接超时,重试等,简单的就是说:
再配置文件中列出负载均衡后面的所有机器,Ribbon 会自动的基于某种算法(简单轮询、随机连接等),
去连接这些机器,也可以实现自定义负载均衡算法!
Ribbon 能干什么?
- LB (Load Balance) 负载均衡,在微服务或者集群中常用的一种应用;
- 负载均衡简单的说就是将用户的请求平摊分配到多台服务器上,从而达到系统的高可用(HA);
- 常见的负载均衡软件有 Nginx、Lvs 硬件 F5 等;
- dubbo、SpringCloud 中均提供了负载均衡功能;
负载均衡简单分类:
- 集中式LB
偏硬件。
在服务的消费方和提供方之间使用独立的LB设施,如Nginx,由该设施负责把访问请求通过某种策略
转发至服务的提供发! - 进程式LB
偏软件 ,将LB 的逻辑集成到消费方。
将LB逻辑继承到消费方,消费方从注册中心获取有哪些地址可用,然后自己在从这些地址中选出
一个合适的服务器;Ribbon 属于进程式LB,它只是一个类库,集成于消费方进程,消费放通过它来
获取到服务方的地址!
Ribbon 配置
1:消费方引入依赖
2:消费方修改配置文件
3:为 RestTemp 添加 @LoadBalanced
Rubbon IRule 切换算法
- 轮询
- 随机
- 重试
…
随机轮询算法
重试算法
Feign
接口+注解,一个声明式的web 服务客户端,使得 Web 服务客户端编写简单化。
面向接口编程达到访问微服务的目的。
Feign 继承了 Ribbon ,利用 Ribbon 维护微服务提供者的列表信息,并且通过轮询实现客户端的负载均衡,与Ribbon 不同的是:通过feign 只需要定义服务绑定接口且以声明式的方式,简单的实现了服务的调用。
使用 Feign
1: 客户端添加依赖
2: 修改 Api 工程
3: API 增加接口
Hystrix
熔断器
处理分布式系统的延迟和容错的组件,Hystrix 可以保证在一个依赖出问题时,不会导致整个服务失败,
避免级联故障。
Hystrix 会监控服务之间的调用情况, 缺省时5秒内20次调用失败会触发熔断机制。
比如:在调用接口时,出现长时间等待和阻塞,会返回异常处理。类似于异常通知。
一旦调用服务抛出异常,会自动调用@HystrixCommond 标注好的fallbackMethod 调用类中指定的方法
发生在提供者的熔断器
1: 引入依赖
2: 开启熔断机制注解
@EnableCircuitBreaker
服务降级
当某个服务熔断后,返回错误信息。
提供者无法提供服务时,消费者会调用降级操作,返回服务不可用等信息,或者返回静态页面。
整体资源快不够了,忍痛将某些服务先关掉,待恢复正常时,再开启回来。
服务的降级处理是在客户端完整的,与服务端没有关系。
使用 AOP 思想修改 Feign 形式
@Component
public class FeignClientFallbackFactory implements FallbackFactory<SchedualServiceHi> {
// 打印日志
private static final Logger print = LoggerFactory.getLogger(FeignClientFallbackFactory.class);
//降级处理方式
@Override
public SchedualServiceHi create(Throwable throwable) {
return new SchedualServiceHi() {
@Override
public String mm(@RequestParam("uname") String uname, @RequestParam("upwd") String upwd) {
print.info("fallback; reason was:", throwable);
return "服务报错了";
}
};
}
}
api 方添加配置
feign:
hystrix:
enable: true
Hystrix Dashboard
调用监控的可视化界面
@EnableHystrixDashboard
Zuul
路由网关,包含路由和过滤两个功能。
路由功能将外部请求转发到具体的微服务实例上,是访问的的统一入口,
过滤器功能对请求过程进行干预,实现请求的校验、服务聚合,
Zuul 和 Eureka 整合, 将zuul 注册为 Eureka 组件, 同时从Eureka 获取其他为服务的信息,
之后访问微服务都是通过Zuul 跳转获得。
@EnableZuulProxy
SpringCloud Config
分布式配置中心,SpringCloud 提供了ConfigServer 解决集中管理配置信息的功能
Config 分为服务端和客户端
服务端是一个独立的微服务应用, 用来连接配置服务器为客户端提供配置信息,加密、解密信息的接口
客户端通过指定的配置中心来管理相关的配置内容,在启动的时候从配置中心加载配置信息,默认采用git
来存储。
原理
Eureka 是如何实现高可用的?
Springcloud 的断路器?
服务降级
熔断
隔离