为了展现出 Nacos 服务模型的全貌,还需要介绍下实例相关的 API。例如我们希望注册的实例中,有一些能够被分配更多的流量;或者能够传入一些实例的信息存储到 Nacos 服务端,例如 IP 所属的应用或者所在的机房,这样在客户端可以根据服务下挂载的实例元信息,来自定义负载均衡模式。Nacos 也提供了另外的注册实例接口,使得用户在注册实例时可以指定实例的属性:
1 2 3 4 5 6 7 8 9
/** * register a instance to service with specified instance properties. * * @param serviceName name of service * @param groupName group of service * @param instance instance to register * @throws NacosException nacos exception */ voidregisterInstance(String serviceName, String groupName, Instance instance)throws NacosException;
这个方法在注册实例时,可以传入一个 Instance 实例,它的属性如下:
1 2 3 4 5 6
publicclassInstance { /** * unique id of this instance. */ ```java private String instanceId;
在实际使用过程中,可以像快速开始章节中介绍的那样,仅仅使用 ServiceName 标记一个服务。 #### 1.7 服务隔离:Namespace & Group & Cluster 出于篇幅考虑,这三个概念放到一起介绍。 襄王有意,神女无心。Nacos 提出了这几种隔离策略,目前看来只有 Namespace 在实际应用中使用较多,而 Group 和 Cluster 并没有被当回事。 Cluster 集群隔离在阿里巴巴内部使用的非常普遍。一个典型的场景是这个服务下的实例,需要配置多种健康检查方式,有一些实例使用 TCP 的健康检查方式,另外一些使用 HTTP 的健康检查方式。另一个场景是,服务下挂载的机器分属不同的环境,希望能够在某些情况下将某个环境的流量全部切走,这样可以通过集群隔离,来做到一次性切流。在 Nacos 2.0 中,也在有意的弱化集群的概念,毕竟开源还是要面向用户的,有些东西适合阿里,但不一定适合开源,等再往后演进,集群这个概念又有可能重新回到大家的视线中了,history will repeat itself。 Namespace 命名空间隔离,我认为是 Nacos 一个比较好的设计。在实际场景中使用也比较普遍,一般用于多个环境的隔离,例如 daily,dev,test,uat,prod 等环境的隔离。特别是当环境非常多时,使用命名空间做逻辑隔离是一个比较节约成本的策略。但强烈建议大家仅仅在非线上环境使用 Namespace 进行隔离,例如多套测试环境可以共享一套 Nacos,而线上环境单独搭建另一套 Nacos 集群,以免线下测试流量干扰到线上环境。 #### 1.8 服务发现:推拉模型 上面介绍完了 Nacos 服务发现的 5 大领域模型,最后一节,介绍下如何获取服务模型。 Nacos 的服务发现,有主动拉取和推送两种模式,这与一般的服务发现架构相同。以下是拉模型的相关接口: /** * Get all instances of a service * * @return A list of instance * @throws NacosException */ List<Instance> getAllInstances(String serviceName) throws NacosException;
/** * Get qualified instances of service * * @param healthy a flag to indicate returning healthy or unhealthy instances * @return A qualified list of instance */ List<Instance> selectInstances(String serviceName, boolean healthy) throws NacosException;
/** * Select one healthy instance of service using predefined load balance strategy * * @return qualified instance */ Instance selectOneHealthyInstance(String serviceName) throws NacosException;