Spring-Cloud 的学习

192 阅读6分钟

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 熔断降级

  • 服务降级 服务调用失败给出友好的反馈

    1. 程序运行异常
    2. 超时
    3. 服务熔断触发降级
    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(过滤器)
  • 请求限流

三大核心概念

  1. Route(路由) 路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如断言为true则匹配该路由
  2. Predicate(断言) 参考的是Java8的java.util.function.Predicate 开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由
  3. 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)

  • 三组件概念

    1. Transaction Coordinator(TC) 事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚
    2. Transaction Manager(TM) 控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议
    3. Resource Manager(RM) 控制分支事务,负责分支注册、状态汇报,并接受事务协调的指令,驱动分支(本地)事务的提交和回滚

发布说明: github.com/seata/seata…

使用:全局@GlobalTranstional

配置

  1. seata-server-0.9.0.zip解压到指定目录并修改conf目录下的file.conf配置文件
  2. 在seata库里新建表
  3. 修改seata-server-0.9.0\seata\conf目录下的registry.conf目录下的registry.conf配置文件

在这里插入图片描述