linux怎么查看本机内存大小
361
2022-10-10
zookeeper服务发现实战及原理--spring-cloud-zookeeper分析
1.原理
1.1 zookeeper是什么?
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
1.2 为什么zookeeper?
大部分分布式应用需要一个主控、协调器或控制器来管理物理分布的子进程(如资源、任务分配等) 目前,大部分应用需要开发私有的协调程序,缺乏一个通用的机制 协调程序的反复编写浪费,且难以形成通用、伸缩性好的协调器 ZooKeeper:提供通用的分布式锁服务,用以协调分布式应用(如为HBase提供服务)
1.3 Zookeeper在微服务框架中可以实现服务发现,该服务发现机制可作为云服务的注册中心。
通过Spring Cloud Zookeeper为应用程序提供一种Spring Boot集成,将Zookeeper通过自动配置和绑定 的方式集成到Spring环境中
提前准备
安装zookeeper和zooinspector见
window7环境下ZooKeeper的安装运行及监控查看
此次安装的zookeeper版本为最新版
zookeeper-3.5.4-beta 安装过程一样
下载ZooInspector,参照指南运行java -Dfile.encoding=UTF-8 -jar zookeeper-dev-ZooInspector.jar即可
1.实战
1.1 使用sts创建一个spring starter project名称为zk-discovery,如下图所示
此时自动生成的pom.xml的配置文件如下所示
1.4 配置属性文件application.yml spring: application: name: HelloWorld cloud: zookeeper: connect-string: localhost:2181 discovery: enabled: trueserver: port: 8081logging: level: org.apache.zookeeper.ClientCnxn: WARN 2.源码分析 以spring-boot app项目启动时注册服务ZookeeperAutoServiceRegistrationAutoConfiguration.java为入口 @Bean @ConditionalOnMissingBean(ZookeeperRegistration.class) public ServiceInstanceRegistration serviceInstanceRegistration( ApplicationContext context, ZookeeperDiscoveryProperties properties) { String appName = context.getEnvironment().getProperty("spring.application.name", "application"); String host = properties.getInstanceHost(); if (!StringUtils.hasText(host)) { throw new IllegalStateException("instanceHost must not be empty"); } ZookeeperInstance zookeeperInstance = new ZookeeperInstance(context.getId(), appName, properties.getMetadata()); RegistrationBuilder builder = ServiceInstanceRegistration.builder() //1 .address(host) //2 .name(appName) //3 .payload(zookeeperInstance) //4 .uriSpec(properties.getUriSpec()); //5 if (properties.getInstanceSslPort() != null) { builder.sslPort(properties.getInstanceSslPort()); } if (properties.getInstanceId() != null) { builder.id(properties.getInstanceId()); } // TODO add customizer? return builder.build(); } 2.2 创建ServiceInstance的builder /** * Return a new builder. The {@link #address} is set to the ip of the first * NIC in the system. The {@link #id} is set to a random UUID. * * @return builder * @throws Exception errors getting the local IP */ public static 观察zookeeper的生成情况 生成的helloWorld的服务信息如下: { "name": "HelloWorld", "id": "ef95204e-f5e8-4c69-96e4-3f7cec8dce33", "address": "DESKTOP-405G2C8", "port": 8081, "sslPort": null, "payload": { "@class": "org.springframework.cloud.zookeeper.discovery.ZookeeperInstance", "id": "application-1", "name": "HelloWorld", "metadata": { } }, "registrationTimeUTC": 1552453808924, "serviceType": "DYNAMIC", "uriSpec": { "parts": [ { "value": "scheme", "variable": true }, { "value": "://", "variable": false }, { "value": "address", "variable": true }, { "value": ":", "variable": false }, { "value": "port", "variable": true } ] }} 3.碰到的问题 Thrown "KeeperErrorCode = Unimplemented for /services" exception 原因:Curator 和zookeeper的版本不一致 解决方式:zookeeper升级到最新的版本后异常消失 4.Spring Cloud中的Eureka和Zookeeper的区别 对于 zookeeper 来书,它是 CP 的。也就是说,zookeeper 是保证数据的一致性的。 Eureka 在设计时优先保证可用性,这就是 AP 原则。Eureka 各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。 参考文献 【1】https://cloud.spring.io/spring-cloud-zookeeper/1.2.x/multi/multi_spring-cloud-zookeeper-discovery.html 【2】https://cloud.spring.io/spring-cloud-zookeeper/1.2.x/multi/multi_spring-cloud-zookeeper-config.html 【3】http://enriquerecarte.com/2017-07-21/spring-cloud-config-series-introduction 【4】https://dzone.com/articles/spring-cloud-config-series-part-2-git-backend 【5】https://dzone.com/articles/spring-cloud-config-part-3-zookeeper-backend 【6】https://github.com/santteegt/spring-cloud-zookeeper-service-discovery-demo
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~