服务发现

服务发现使得服务能够在分布式环境中相互感知和定位,客户端不再需要硬编码服务地址,而是通过服务发现机制从注册中心或服务注册表中获取目标服务的信息。

服务发现可以根据服务的健康状态和性能指标,智能地将请求分发给最佳的可用服务实例,实现负载均衡,提高系统的可伸缩性和性能。

通过服务发现,当服务实例出现故障或下线时,自动从注册中心中剔除,避免请求受到影响。同时,新的实例上线后也能自动被服务发现并加入到负载均衡策略中。

对于服务发现,我们不仅提供了使用 Nacos 实现而且还提供了使用 Zookeeper 实现,默认使用 Nacos。

下面就来分别介绍下如果使用 Nacos 做服务发现在客户端需要做什么还有如果使用 Zookeeper 做服务发现需要做什么。

使用 Nacos 实现服务发现

  1. 引入 Nacos 依赖,版本可以使用最新的,这里仅作演示
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client</artifactId>
    <version>1.3.2</version>
</dependency>
  1. 注入 NamingService
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(ClientConfiguration.class)
@ConditionalOnBean(annotation = {EnableOpenRpcClient.class})
public class ClientAutoConfiguration {

    @Bean
    public NamingService namingService() throws NacosException {
        Properties properties = new Properties();
        properties.put(PropertyKeyConst.USERNAME, "nacos");
        properties.put(PropertyKeyConst.PASSWORD, "nacos");
        properties.put(PropertyKeyConst.SERVER_ADDR, "127.0.0.1:8848");
        return NacosFactory.createNamingService(properties);
    }

    // ~

}

使用 Zookeeper 实现服务发现

  1. 引入 Zookeeper 依赖,版本可以使用最新的,这里仅作演示
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.7.0</version>
</dependency>

<dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.11</version>
</dependency>
  1. 注入 ZkClient 以及 ServiceDiscovery,因为系统默认使用 Nacos 做服务发现
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(ClientConfiguration.class)
@ConditionalOnBean(annotation = {EnableOpenRpcClient.class})
public class ClientAutoConfiguration {

    @Bean(destroyMethod = "close")
    public ZkClient zkClient(){
        System.setProperty("zookeeper.sasl.client", "false");
        return new ZkClient("192.168.1.26:2181,192.168.1.27:2181,192.168.1.28:2181", 5000);
    }

    @Bean
    public ServiceDiscovery serviceDiscovery(ZkClient zkClient,
                                             InstanceStore instanceStore,
                                             NamespaceService namespaceService){
        return new ZookeeperServiceDiscovery(zkClient, instanceStore, namespaceService);
    }

    // ~
}

拓展服务发现方式

例如你可以使用 Redis 实现服务发现