Service Discovery 服务发现,我以前不是很明白zookeeper怎么做集群,只知道注册啥的,突然有一天悟了,不得不佩服一套文件系统可以变化出很多伟大的应用。说说思路。
场景:提供一个分布式Restful 服务让客户端去调用,支持动态加减机器。
分析:
server端并不复杂,启动webserver后,暴露http://url:8088/rs/xx 出去即可,那么会有如下几个:
server1: http://192.168.50.11:8088/rs/xx
server2: http://192.168.50.12:8088/rs/xx
client端 :假设没有zk的时候,你可能会这么做。服务启动的时候把这些暴露的url地址放到一个static变量里面。然后轮询去调用。 这样就可以实现一个简单的软负载了。(PS:还有个方法:在前面加个nginx 做负载)
但是遇见这种情况了,某台机器挂了,你怎么办? 或者在线上的时候加一台服务器,那么你需要修改client代码,加上url地址。重新部署。
很显然,这种做法太不好了,要停服务。那么看看有了注册中心后如何干。
改良:
1. server端不变,启动的时候把所有服务全部注册到zookeeper上面,比如User的,在/user下面创建临时节点。
2. 添加一个session事件,当挂了后,重新注册,看看curator的源码:
if ( newState == ConnectionState.RECONNECTED ) { try { log.debug("Re-registering due to reconnection"); reRegisterServices(); } catch ( Exception e ) { log.error("Could not re-register instances after reconnection", e); } }
再看看 client 的思路,麻烦一点
1. 启动的时候就监听 /user chindren 事件,这个事件要用StartMode.BUILD_INITIAL_CACHE
意思是,第一次就取值。 然后放到cache里面。 我们看看curator的源码ServiceCacheImpl:
@Override public void start() throws Exception { Preconditions.checkState(state.compareAndSet(State.LATENT, State.STARTED), "Cannot be started more than once"); cache.start(true); for ( ChildData childData : cache.getCurrentData() ) { addInstance(childData, true); } discovery.cacheOpened(this); }
2. 如果中途添加/删除机器,那么在cache 里面 add/remove即可,看看curator的源码:
public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception { boolean notifyListeners = false; switch ( event.getType() ) { case CHILD_ADDED: case CHILD_UPDATED: { addInstance(event.getData(), false); notifyListeners = true; break; } case CHILD_REMOVED: { instances.remove(instanceIdFromData(event.getData())); notifyListeners = true; break; } } if ( notifyListeners ) { listenerContainer.forEach ( new Function<ServiceCacheListener, Void>() { @Override public Void apply(ServiceCacheListener listener) { listener.cacheChanged(); return null; } } ); } }
如果这个思路明白了,其实完全可以不用Curator的,还可以做的更好,比如加入黑名单,路由策略等。
有事了,下次再写
相关推荐
馆长服务发现使用Spring Boot,Zookeeper和Apache策展人的Rest Service发现服务器。
策展人发现演示 用于服务注册和服务发现的 Apache curator 发现示例
curator-x-discovery-spray-scala 来自 Apache Curator 的 curator-x-discovery 项目,带有 Spray 和 Scala 使用assemble构建程序集。 在控制台中运行zkServer start然后项目如下: java -jar target/scala-2.11...
PlayFramework 2 的 Curator 服务发现插件 要在与 9000 不同的端口上运行它,请播放 -Dhttp.port=9123 当前插件版本: 1.0-快照播放 2.3 什么是服务发现 在 SOA/分布式系统中,服务需要相互查找。 即网络服务可能...
一个独立的服务器,可用于向 Curator (ZooKeeper) 注册非 Java 服务(生产者)。
赠送jar包:curator-client-4.3.0.jar; 赠送原API文档:curator-client-4.3.0-javadoc.jar; 赠送源代码:curator-client-4.3.0-sources.jar; 赠送Maven依赖信息文件:curator-client-4.3.0.pom; 包含翻译后的API...
赠送jar包:curator-framework-2.6.0.jar; 赠送原API文档:curator-framework-2.6.0-javadoc.jar; 赠送源代码:curator-framework-2.6.0-sources.jar; 赠送Maven依赖信息文件:curator-framework-2.6.0.pom; ...
赠送jar包:curator-client-2.7.1.jar; 赠送原API文档:curator-client-2.7.1-javadoc.jar; 赠送源代码:curator-client-2.7.1-sources.jar; 赠送Maven依赖信息文件:curator-client-2.7.1.pom; 包含翻译后的API...
zookeeper客户端curator操作示例
Curator的JAR包,应用于Zookeeper集群协调组件开发
赠送jar包:curator-framework-4.0.1.jar; 赠送原API文档:curator-framework-4.0.1-javadoc.jar; 赠送源代码:curator-framework-4.0.1-sources.jar; 赠送Maven依赖信息文件:curator-framework-4.0.1.pom; ...
curator zookeeper 3.4.6 2.9.1
客户端是Curator Framework,是Apache的项目,它主要的功能是为ZK的客户端使用提供了高可用的封装。在Curator Framework基础上封装的curator-recipes,实现了很多经典场景。比如:集群管理(Leader选举)、共享锁、...
赠送jar包:curator-recipes-2.6.0.jar; 赠送原API文档:curator-recipes-2.6.0-javadoc.jar; 赠送源代码:curator-recipes-2.6.0-sources.jar; 赠送Maven依赖信息文件:curator-recipes-2.6.0.pom; 包含翻译后...
zookeeper 客户端 curator 源文件
赠送jar包:curator-client-4.0.1.jar; 赠送原API文档:curator-client-4.0.1-javadoc.jar; 赠送源代码:curator-client-4.0.1-sources.jar; 赠送Maven依赖信息文件:curator-client-4.0.1.pom; 包含翻译后的API...
赠送jar包:curator-client-2.7.1.jar; 赠送原API文档:curator-client-2.7.1-javadoc.jar; 赠送源代码:curator-client-2.7.1-sources.jar; 赠送Maven依赖信息文件:curator-client-2.7.1.pom; 包含翻译后的API...
赠送jar包:curator-client-2.6.0.jar; 赠送原API文档:curator-client-2.6.0-javadoc.jar; 赠送源代码:curator-client-2.6.0-sources.jar; 赠送Maven依赖信息文件:curator-client-2.6.0.pom; 包含翻译后的API...
curator zookeeper 3.4.6 2.9.1
赠送jar包:curator-framework-4.3.0.jar; 赠送原API文档:curator-framework-4.3.0-javadoc.jar; 赠送源代码:curator-framework-4.3.0-sources.jar; 赠送Maven依赖信息文件:curator-framework-4.3.0.pom; ...