Spring-Cloud Study
基于分布式的微服务架构当下已经成为相当火爆的技术架构体系。 SpringCloud=分布式微服务架构的一站式解决方案,是N多种微服务架构落地技术的集合体,俗称微服务全家桶
代码地址:gitee.com/zhuhuijie/s…
分布式微服务架构关键词
- 服务注册与发现 (Nacos、Consul、Eureka(停更)、Zookeeper)
- 服务调用 (Ribbon、LoadBalance、Open Feign、Feign(停更))
- 服务熔断 (sentinel、Resilience4j(国内使用少)、Hystrix(停更,国内用的比较多))
- 负载均衡
- 服务降级
- 服务消息队列(Stream)
- 配置中心管理 (Nacos、Config)
- 服务网关 (Gateway、Zuul(分裂Zuul2))
- 服务总线 (Nacos、Bus(停更))
- 服务监控
- 全链路追踪(Nacos、Sleuth)
- 自动化构建部署
- 服务定时任务调度操作
1 SpringCloud 架构选型
官网可以查看SpringBoot与SpringCloud对应版本 start.spring.io/actuator/in…
本项目框架版本选型
- springCloud Hoxton.SR1
- SpringCloud Alibaba 2.1.0.RELEASE
- springBoot 2.2.2.RELEASE
- JAVA 8
- MAVEN 3.5+
- MySQL 5.7+
升级惨案
- 被动修复bug
- 不再接受合并请求
- 不再发布新版本
2 注册中心
便于服务的统一调度和管理
2.1 Eureka
注册中心可以配置集群,避免单点故障
2.2 Zookeeper
Zookeeper是一个分布式协调工具,可以实现注册中心功能
zookeeper 可以代替 eureka 成为springCloud的注册中心
2.3 Consul
docker 安装启动 Consul
$ docker pull consul # 默认拉取latest
$ docker pull consul:1.6.1 # 拉取指定版本
docker run -d -p 8500:8500 --restart=always --name=consul consul:latest agent -server -bootstrap -ui -node=1 -client='0.0.0.0'
参数
- agent: 表示启动 Agent 进程。
- server:表示启动 Consul Server 模式
- client:表示启动 Consul Cilent 模式。
- bootstrap:表示这个节点是 Server-Leader ,每个数据中心只能运行一台服务器。技术角度上讲 Leader 是通过 Raft 算法选举的,但是集群第一次启动时需要一个引导 Leader,在引导群集后,建议不要使用此标志。
- ui:表示启动 Web UI 管理器,默认开放端口 8500,所以上面使用 Docker 命令把 8500 端口对外开放。
- node:节点的名称,集群中必须是唯一的,默认是该节点的主机名。
- client:consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1所以不对外提供服务,如果你要对外提供服务改成0.0.0.0
- join:表示加入到某一个集群中去。 如:-json=192.168.0.11。
2.4 Nacos
Name Config Service 代替注册中心,配置中心 集群部署: 借助nginx 进行负载
2.5 四者之间的区别
CAP Consistency代表强一致性 Availability代表可用性 Partition tolerance分区容错性(分布式必备) CAP 只能满足两种
- AP(Eureka)
- CP(Zookeeper、Consul)
- AP和CP都支持的(Nacos)
3 负载均衡
- LB负载均衡
简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用) 常见的负载均衡软件Nginx、LVS,硬件F5等
- Ribbon 本地负载均衡与Nginx的区别
Nginx 是服务端实现的负载均衡,nginx 可以转发请求 Ribbon 本地负载均衡,是在调用微服务接口,会从注册中心获取服务信息列表缓存在JVM.从而在本地实现RPC远程服务调用技术
3.1 Ribbon
Eureka 默认包含Ribbon的依赖,可以实现默认轮询的负载均衡机制 更改默认的负载均衡,需要在spring 包扫描范围之外配置,然后在启动类加注解引入
3.2 OpenFeign
编写 java 客户端变得容易。 前面在使用Ribbon+RestTemplate,使用RestTemplate对http请求的封装。 Feign是一个声明实的客服端,让编写Web服务客户端变得非常容易,只需要在接口上添加对应注解即可
4 熔断降级
-
服务降级 服务调用失败给出友好的反馈
- 程序运行异常
- 超时
- 服务熔断触发降级
- 线程池/信号量 打满
-
服务熔断 达到最大访问后,拒绝服务,拉闸限电
-
服务限流 秒杀高并发,避免一窝蜂打入,排队获取请求
4.1 hystrix
4.2 sentinel
5 网关
5.1 Gateway
SpringCloud Gateway使用的是Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架 Gateway特性
- 动态路由:能够匹配任何请求属性
- 可以对路由指定Predicate(断言)和Filter(过滤器)
- 集成Hystrix 断路器功能
- 集成Spring Cloud 服务发现功能
- 易于编写Predicate(断言)和Filter(过滤器)
- 请求限流
三大核心概念
- Route(路由) 路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如断言为true则匹配该路由
- Predicate(断言) 参考的是Java8的java.util.function.Predicate 开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由
- Filter(过滤) 指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改.
6 配置中心
6.1 Config + buss
config 实现配置中心加配置客户端 可以实现读取github等平台仓库内的配置文件 加入bus 是因为客户端无法实时获取修改后的配置,需要消息总线进行通知刷新(不使用bus只能一个客户端一个客户端的通知)
7 消息驱动
7.1 Stream
- 为什么使用 ? 屏蔽底层消息中间件的差异,降低切换成本,统一消息的编程模型
Binder 绑定器连接消息中间件,屏蔽差异 Input消费者,Output生产者 Channel:通道,是队列Queue的一种抽象,在消息通讯系统中就是实现存储和转发的媒介,通过channel对队列进行配置 Source和Sink:简单的可理解为参照对象是Springcloud Stream自身,从Stream发布消息就是输出,接受消息就是输入
8 分布式链路跟踪
8.1 Sleuth
- 安装zipkin: docker run -d -p 9411:9411 openzipkin/zipkin
Sleuth提供了一套完整的服务跟踪的解决方案,在分布式系统中提供追踪解决方案并且兼容支持了zipkin
9 分布式锁
- 数据库唯一键
- Redis 做分布式锁
- Zookeeper 做分布式锁
10 分布式事务
- MQ 做分布式事务
- Seata 分布式事务
10.1 Rabbit MQ实现分布式事务
10.2 Seata 实现分布式事务
Seata是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务
分布式事务处理过程-ID+三组件模型
-
Transaction ID(XID)(全局唯一的事务id)
-
三组件概念
- Transaction Coordinator(TC) 事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚
- Transaction Manager(TM) 控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议
- Resource Manager(RM) 控制分支事务,负责分支注册、状态汇报,并接受事务协调的指令,驱动分支(本地)事务的提交和回滚
发布说明: github.com/seata/seata…
使用:全局@GlobalTranstional
配置
- seata-server-0.9.0.zip解压到指定目录并修改conf目录下的file.conf配置文件
- 在seata库里新建表
- 修改seata-server-0.9.0\seata\conf目录下的registry.conf目录下的registry.conf配置文件