该客户端提供一个服务,比如api或者mysql,另外一个客户端就可以去发现指定服务的服务提供者。通过DNS或者HTTP应用程序可以容易找到所依赖的服务。2,健康检查consul可以提供健康检查服务。这个信息可以监视集群的健康。可以用来避免将流量发送到不健康的主机。3,存储。应用程序可以使用consul的层级的储存。比如动态配置,,协调服务。直接可以用HTTPAPI来 *** 作。
不同的物理存储中心,例如consul、nacos、redis、mongo都是no-sql存储,即存储k-v形式的数据。甚至mysql中也可以存储json格式的数据。虽然有各种各样形式的client实现。但若是想嵌入到咱sentinel作为存储中心,必须满足咱定义的“接口”规范。通过“组合”的形式将存储中心实际client嵌入到接口子类中,对外提供服务。
接口如下:
没错,只需要简单的实现put、get、remove等方法,就可以无痛的替换存储中心。
配置文件中修改: sentinel.dashboard.store 属性完成动态切换。
当value是map类型时,就出现了一个问题:
接口关系如下所示: 实现如下接口满足map的扁平化 *** 作。
存储实体的基本 *** 作
map扁平化接口:
规则的分布式存储实现类——可以存储allRules规则以及appRules规则:
对应FastJson来说,在反序列中传入type是可以得到泛型对象的。
但实际上得到的却是JsonObject对象。无法转换为 RuleEntity 对象。
使用Jackson也遇见了此种情况:
自定义Jackson的ObjectMapper对象,在序列化的时候将属性的类型也序列化即可:
使用的锁机制,实现了consul分布式锁以及默认的内存锁。保证“扁平化” *** 作时的线程安全性。
借助ConcurrentHashMap将ReentrantLock存储起来。
——“这么骚的 *** 作是在seata源码中借鉴的。”
在1.3小节的“动态切换”中,可以根据配置文件来动态切换锁。当然以后去除consul使用redis等存储中心,可以实现定义的Lock接口,实现Redis的分布式锁。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)