本文集成Spring Boot示例代码:
链接:https://pan.baidu.com/s/1W5CzEw9vU8P_9uqwDwt5hw 提取码:otjl

集成Spring Cloud代码:
链接:https://pan.baidu.com/s/1n_eJwyyarKH69AKY4H2dxw 提取码:xeht
集成Spring Cloud与集成Spring Boot代码差别不太大,此处不做说明

1. Apache Dubbo说明

Apache Dubbo: 多个系统之间的高性能、透明化调用,服务注册 监控 路由 容错等,上下线动态感知和服务地址的动态维护,监控哪些服务调用量大及响应时间

Apache Dubbo:
支持多种协议的服务发布,默认是dubbo://,还可以支持rest://、webservice://、thrift://等
支持多种不同的注册中心,如ZooKeeper、Nacos、Redis等
支持多种序列化技术,如avro、fst、fastjson、hessian2、kryo等

Apache Dubbo集群容错:
Failover Cluster: 失败自动切换。
当服务器调用失败后会自动切换到集群中的其他机器进行重试,默认重试次数是2,通过retries=2属性来修改,但重试次数增加会带来更长的响应延时,这种容错模式通常用于读操作,因为事务型操作会代理数据重复问题。

Failfast Cluster:快速失败。
当服务调用失败后,立即报错,通常用于一些幂等的写操作,比如新增数据,因为当服务调用失败时,很可能这个请求已经在服务器端处理成功,只是因为网络延迟导致响应失败,为了避免在结果不确定的情况下导致数据重复插入的问题,可以使用这种容错机制。

Failsafe Cluster:失败安全。
就是出现异常时直接忽略异常。

Failback Cluster:失败后立即回复。
服务调用出现异常时,在后台记录这条失败的请求定时重发,这种模式适用于消息通知操作,保证这个请求一定发送成功。

Forking Cluster:并行调用集群中的多个服务,只要其中一个成功就返回。可以通过forks=2来设置最大并行数。

Broadcast Cluster:广播调用所有服务提供者,任意一个服务报错则宝石服务调用失败。这个通常用于通知所有服务提供者更新缓存或者本地资源信息。

容错配置方式:只需在指定服务的@Service注解增加一个参数即可,比如@Service(cluster="failfast")

负载均衡:
Random LoadBalance:随机算法。
可以针对性能较好的服务器设置较大的权重,权重值越大,随机的概率也会越大。

RoundRobin LoadBalance:轮询。
按照公约后的权重设置轮询比例。

LeastActive LoadBalance:最少活跃。
处理较慢的节点将会收到更少的请求。

ConsistentHash LoadBalance:一致性Hash.
相同参数的请求总是发送到同一个服务提供者。

负载均衡配置方式:在指定服务的@Service注解增加一个参数,比如@Service(cluster="failfast",loadbalance="roundrobin")

服务降级:
服务降级是一种系统保护策略,当服务器访问压力较大时,可以根据当前业务情况对不重要的服务进行降级,以保证核心服务的正常运行。

降级有多个层面的分类:
按照是否自动化可以分为自动降级和人工降级。
按照功能可以分为读服务降级和写服务降级。
人工降级一般具有一定的前置性,比如在电商大促之前,暂时关闭非核心服务,如评价、推荐等。
自动降级更多的是来自系统出现某些异常时自动触发兜底的流畅,比如:
故障降级,调用的远程服务挂了,网络故障或者RPC服务返回异常,这种情况可以通过兜底数据响应给客户端
限流降级,不管是什么类型的系统,它锁支撑的流量是有限的,为了保证系统不被压垮,在系统中会针对核心业务进行限流,
当请求流量达到阈值时后续的请求会被拦截,这种可以进入排队系统,比如12306,也可直接返回降级页面"活动太火爆,请稍后再来"

Dubbo提供一种Mock配置来实现服务降级,当服务提供方出现网络异常无法访问时,客户端不抛出异常,而是通过降级配置返回兜底数据
实现:在@Reference注解增加Mock参数

public class MockHelloService implements IHelloService{

@Override

public String sayHello(String s){

return "Sorry,活动太火爆,请稍后再来";

}

}@Reference(mock = "com.dubbo.demo.service.mock.MockHelloService",cluster = "failfast")

private IHelloService helloService;

在不启动Dubbo服务端或者服务端的返回值超时,访问/getHello接口得到的结构就是MockHelloService中返回的数据

2. ZooKeeper说明

ZooKeeper:是一个高性能的分布式协调中间件,解决分布式环境中各个服务进程的访问控制问题,ZooKeeper并不是注册中心,只是基于ZooKeeper本身的特性可以实现注册中心这个场景

ZooKeeper安装:

下载地址: https://zookeeper.apache.org/releases.html

springboot zookeeper集成_服务器

将下载好的安装包解压到指定目录,解压后其中conf目录是存放配置文件的,bin目录是提供的可执行脚本
ZooKeeper核心配置的样例文件在conf目录中的zoo_sample.cfg,如果要将ZooKeeper运行起来需要将其名称修改为zoo.cfg内容暂时不用修改
ZooKeeper:启动服务 linux系统在bin目录下执行sh zkServer.sh start, windows系统双击bin目录下zkServer.cmd即可

注:ZooKeeper是使用java编写的,所以在安装之前必须要安装java的运行环境, 本文忽略

windows系统双击zkServer.cmd后会弹出如下命令行

springboot zookeeper集成_服务器_02

ZooKeeper的数据结构:

ZooKeeper是一种层次化的属性结构,ZooKeeper数中的每个节点被称作Znode,Znode维护了一个stat状态信息,其中包含数据变化的时间和版本等

并且每个Znode可以设置一个value值,允许读和写

springboot zookeeper集成_数据_03

ZooKeeper的特性:
持久化节点:节点的数据会持久化到磁盘
临时节点:节点的生命周期和创建该节点的客户端的生命周期保持一致,一旦该客户端的会话结束,则该客户端创建的所有临时节点会被自动删除
有序节点:在创建的节点后面会增加一个递增的序列,该序列在同一级父节点之下是唯一的,持久化节点和临时节点也可以设置为有序节点
容器节点:当容器节点下的最后一个子节点被删除时,容器节点就会被自动删除
TTL节点:针对持久化节点和持久化有序节点,可以设置一个存活时间,如果在存活时间之内该节点没有修改并且没有子节点它就会被自动删除

注意:在同一层级目录下,节点的名称必须是唯一的

Watcher机制:
ZooKeeper提供了一种针对Znode的订阅/通知机制,当Znode节点状态发生变化或者ZooKeeper客户端连接状态发生变化时就会触发事件通知
在ZooKeeper提供的Java API中,提供了三种机制针对Znode进行注册监听
getData():用于获取指定节点的value信息,并且可以注册监听,当监听的节点被创建、修改、删除操作时,会触发相应的事件通知
getChildren():用于获取指定节点的所有子节点,并且允许注册监听,当监听到子节点被创建、修改、删除操作时,会触发相应的事件通知
exists():用于判断指定节点是否存在,监听的事件类型和getData()相同

注意:Watcher事件的触发都是一次性的,比如客户端通过getData('/node',true)注册监听,如果/node节点发生数据修改,那么该客户端会收到一个修改事件通知
但是/node再次发生变化时,客户端无法收到Watcher事件,为了解决这个问题,客户端必须在收到的事件回调中再次注册事件

分布式锁:
使用ZooKeeper实现分布式锁只需要用到节点的特性:临时节点,以及同级节点的唯一性
获得锁:
所有客户端可以去ZooKeeper服务器上/Exclusive_Locks节点下创建一个临时节点/lock。ZooKeeper基于同级节点的唯一性,会保证所有客户端中只有
一个客户端能创建成功,创建成功的客户端获得了排他锁,没获得锁的客户端就需要通过Watcher机制监听/Exclusive_Locks节点下子节点的变更事件,用于实时
监听/lock节点的变化情况以做出反应

释放锁:
在获得锁的过程中我们定义的是/lock的临时节点,下面两个情况会触发锁的释放
获得锁的客户端因为异常断开了和服务器的连接,基于临时节点的特性/lock节点会被自动删除
获取锁的客户端执行玩业务逻辑之后,主动删除创建的/lock节点

当/lock节点被删除之后,ZooKeeper服务器会通知所有监听了/Exclusive_Locks节点变化的客户端,这些客户端收到通知后再次发起创建/lock节点的操作来获取锁

3. Spring Boot集成Apache Dubbo和ZooKeeper实现及说明

当服务端启动后会在ZooKeeper服务器上的/dubbo/com.yu.demo.service.IHelloService/providers目录下创建当前服务的URL
当服务消费者启动时会去providers节点下获得所有该服务提供的URL列表,然后通过负载均衡算出一个地址进行远程访问
并会在ZooKeeper服务器上的/dubbo/com.yu.demo.service.IHelloService/consumers目录下写入自己调用的URL
服务器消费者会对providers节点下的子节点注册Watcher监听以感知到服务提供方节点的上下线变化,从而防止请求发送到已经下线
的服务器造成访问失败

springboot zookeeper集成_服务器_04

3.1服务端说明

springboot zookeeper集成_数据_05


代码很少直接上一张图就够了

springboot zookeeper集成_数据_06

3.2消费端说明

springboot zookeeper集成_服务器_07

在启动类中实现远程方法调用

springboot zookeeper集成_客户端_08