5分钟了解[Apache]Curator Service Discovery

Curator Service Discovery要解决什么问题?

在SOA/分布式的系统中, 大量的services被发布, 运行期诸多的service相互依赖, 而又不停的升级, 上线, 下线, 为了对它们的优雅的管理, Apache的Curator Service Discovery提供了如下机制:

  • service的注册
  • 定位给定service的一个可用实例
  • service的变更通知

几个概念

ServiceInstance

一个service实例.由name, id, address, port/ssl port, payload(可选)构成, 在Zookeeper中的数据组织结构如下:

base path
       |_______ service A name
                    |__________ instance 1 id --> (serialized ServiceInstance)
                    |__________ instance 2 id --> (serialized ServiceInstance)
                    |__________ ...
       |_______ service B name
                    |__________ instance 1 id --> (serialized ServiceInstance)
                    |__________ instance 2 id --> (serialized ServiceInstance)
                    |__________ ...
       |_______ ...

定义一个实例:

    ServiceInstance<InstanceDetails> service = ServiceInstance.<InstanceDetails>builder()
        .name(serviceName)
        .address(getInnerHostIp())
        .port(port)
        .id(id)
        .serviceType(ServiceType.DYNAMIC)
        .payload(new InstanceDetails(id)).build();

ServiceProvider

它封装和提供了依据策略来发现service. 所谓的策略(strategy), 就是从给定service的可用instance中怎么选出一个来的策略. 这些策略有:

  • random
  • round robin
  • sticky

ServiceDiscovery

它用来分配ServiceProvider; 基本上是我们打交道最多的类之一, 几乎所有对instance的操作都是通过它来实现. 参考如下代码.

ServiceDiscovery<String> discovery = ServiceDiscoveryBuilder.builder(String.class).basePath("/test").client(client).basePath(basePath).build();

关于builder()和payload

如上builder()的参数定义了payloadClass, 也就是上面数据结构图里的(serialized ServiceInstance)中的内容.
我们也可以自定义一个复杂的class用来承载更多的信息; 比如 MoreDetails.class, 不过需要告诉系统, 怎么才能把我们自定义的类"变成"Zookeeper里的payload字符串, 方法就是提供serializer:

JsonInstanceSerializer<MoreDetails> serializer = new JsonInstanceSerializer<MoreDetails>(MoreDetails.class);

ServiceDiscovery<String> discovery = ServiceDiscoveryBuilder.builder(String.class).basePath("/test").client(client).basePath(basePath).serializer(serializer).build();

如上是通过json的序列化来完成payload的, 如果有进一步的需求, 比如class到json的自定义映射, 用简单的jackson的标注就可以实现.

实操

//curator client
CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1));
closeables.add(client);
client.start();

ServiceInstance<String> instance = ServiceInstance.<String>builder().payload("thing").name("test").port(10064).build();
ServiceDiscovery<String> discovery = ServiceDiscoveryBuilder.builder(String.class).basePath("/test").client(client).thisInstance(instance).build();
closeables.add(discovery);
discovery.start();

Assert.assertEquals(discovery.queryForNames(), Collections.singletonList("test"));

CRUD:

serviceDiscovery.start();

serviceDiscovery.registerService(service);

serviceDiscovery.unregisterService(service);

serviceDiscovery.updateService(service);

serviceDiscovery.queryForInstances(serviceName);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,845评论 18 139
  • 对象的创建与销毁 Item 1: 使用static工厂方法,而不是构造函数创建对象:仅仅是创建对象的方法,并非Fa...
    孙小磊阅读 2,019评论 0 3
  • 1.curator介绍 curator是Netflix开源的一个zookeeper客户端,比zookeeper...
    我爱麻烦阅读 5,277评论 0 4
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,740评论 18 399
  • 睡着的睡不着的最终都会永久安息 华灯初上,城市的喧嚣才到达了顶峰,霓虹散落的商场,车水马龙的街道,灯火通明的办公楼...
    凉风一梦是归途阅读 412评论 0 0