前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringCloud Alibaba——Nacos服务发现

SpringCloud Alibaba——Nacos服务发现

作者头像
爪哇缪斯
发布于 2023-05-10 03:09:23
发布于 2023-05-10 03:09:23
70800
代码可运行
举报
文章被收录于专栏:爪哇缪斯爪哇缪斯
运行总次数:0
代码可运行

几个星期前曾经分享过Nacos在配置中心部分的内容,今天来分享它的另一部分内容,即:服务发现。废话不多说,来看一下今天这篇小文章的目录结构吧:

一、概述

1.1> 从单体服务到微服务

1.1.1> 单体服务(all in one)
  • 一个项目中包含了所有的服务。通常来说,如果一个war包/jar包里面包含一个应用的所有功能,则我们称这种架构为单体架构。即:所有服务都在service模块中。
  • 如下图所示:
  • 优点:
  • 1> 架构简单,清晰。服务之间调用方便,快捷。
  • 2> 服务部署简单。部署量少。运维量很低。
  • 缺点:
  • 1> 随着项目进展时间变长,整个项目的代码复杂度越来越高,很容易一个小改动,导致很大的系统问题。
  • 2> 由于代码量很大,编译和部署会越来越慢,甚至20~30分钟都很正常。
  • 3> 由于有的功能属于大量运算的CPU密集型模块,有的是大量读写磁盘的IO密集型模块。但是由于融合在了一个项目中,无法针对单个功能模块进行扩展。那么只能CPU和内存和磁盘都要提升,资源投入很大。
  • 4> 如果我们想要针对已有项目改变技术选型,那么就需要针对整个项目进行修改,工作量将会巨大。

1.1.2> 集群级垂直化

  • 随着用户量越来越大,服务器负载也随之增高,用户需求导致对产品的需求也会剧增。那么这一个war包中的代码量也会越来越大,面临着每一次代码修改(无论小修改还是大迭代),都要把整个商城的代码重新测试和部署,而且部署时间也会非常的漫长。针对这种情况,我们进行如下优化:
  • 1> 通过横向增加服务器,把单台机器变成多台机器的集群。
  • 2> 按照业务的垂直领域进行拆分,减少业务的耦合度,以及降低单个war包带来的伸缩性困难的问题。
  • 如下图所示:

1.1.3> SOA
  • 核心目标是把一些通用的、会被多个上层服务调用的共享业务提取成独立的基础服务,这些被提取出来的共享服务想对来说比较独立,并且可以重用。所以在SOA中,服务是最核心的抽象手段,业务被划分为一些粗粒度的业务服务和业务流程。
  • SOA主要解决的问题是:
  • 1> 信息孤岛。
  • 2> 共享业务的重用。
  • 如下图所示:

1.1.4> 微服务
  • 那么被SOA拆分出来的服务是否也需要以业务功能为维度来进行拆分和独立部署,以降低业务的耦合及提升容错性?微服务就是这样一种解决方案。
  • 我们可以把SOA看成微服务的超集,也就是多个微服务可以组成一个SOA服务
  • 伴随着服务颗粒化的细化,会导致原本10个服务可能拆分成了100个微服务,一旦服务规模扩大,就意味着服务的构建、发布、运维的复杂度也会成倍增加。
  • 如下图所示:
  • 优点:
  • 1> 每个服务足够小,足够内聚,专注于一个业务功能点提供服务。代码更容易理解。
  • 2> 有代码修改部署上线,只会影响对应的微服务,而不会是整个服务。
  • 3> 可针对服务是计算型还是IO型进行针对性的硬件升级
  • 4> 可以针对某些高吞吐服务进行硬件升级或者服务横向扩容,而不是对所有服务都升级,节约投入成本
  • 缺点:
  • 1> 极大的增加了运维工作量,以前几个war包,现在可能需要部署几百个。
  • 2> 微服务之间的互相调用,会增加通讯成本
  • 3> 分布式事务问题会引出数据一致性的问题。
  • 4> 服务增多,如果管控成百上千的服务。如何准确并快速定位问题

1.1.5> SOA与微服务的区别
  • SOA关注的是服务的重用性及解决信息孤岛问题
  • 微服务关注的是解耦,虽然解耦和可重用性从特定的角度来看是一样的,但本质上是有区别的;
    • 解耦:降低业务之间的耦合度。
    • 重用性:关注的是服务的复用。
  • 微服务会更多地关注在DevOps的持续交付上,因为服务粒度细化之后使得开发运维变得更加重要,因此微服务与容器化技术的结合更加紧密。

1.2> 服务发现介绍

  • 在传统的系统部署中,服务运行在一个固定的已知的IP和端口上,如果一个服务需要调用另一个服务,那么可以通过地址直接调用。但是,在虚拟化或者容器化的环境中,服务实例的启动和销毁是很频繁的,那么服务地址也是在动态变化的。这种情况下,就需要服务发现机制了。服务发现的方式有如下两种:
  • 客户端——服务发现 (client-side service discovery)
    • 客户端通过查询服务注册中心,获取可用服务的实际网络地址(IP&PORT)。然后通过负载均衡算法来选择一个可用的服务实例,并将请求发送至该服务。
    • 在服务启动的时候,向服务注册中心注册服务;在服务停止的时候,向服务注册中心注销服务。服务注册的一个典型实现方式就是通过heartbeat机制(心跳机制)定时刷新。
  • 服务端——服务发现 (server-side service discovery)
    • 客户端向load balancer上发送请求。load balancer查询服务注册中心,找到可用的服务,然后转发请求到该服务上。和客户端发现一样,服务都要到注册中心进行服务的注册和销毁。
  • 服务发现调用流程

1.3> 服务发现技术对比


1.4> Nacos简介

  • https://nacos.io/zh-cn/
  • Nacos是阿里的一个开源产品,它是针对微服务架构中的服务发现配置管理服务治理的综合型解决方案。
  • 官方介绍如下: 致力于帮助您发现、配置和管理微服务。 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 帮助您更敏捷和容易地构建、交付和管理微服务平台。 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

1.5> Nacos特性

Nacos主要提供以下四大功能

  • 服务发现与服务健康检查 Nacos使服务更容易注册,并通过DNSHTTP接口发现其他服务; Nacos还提供服务的实时健康检查,以防止向不健康的主机或服务实例发送请求。
  • 动态配置服务 动态配置服务运行在所有环境中以集中和动态的方式管理所有服务的配置。 Nacos消除了在更新配置时重新部署应用程序,这使配置的更改更加高效和灵活。
  • 动态DNS服务 Nacos提供基于DNS协议的服务发现能力,旨在支持异构语言的服务发现; 支持将注册在Nacos上的服务以域名的方式暴露端点,让三方应用方便查阅及发现。
  • 服务和元数据管理 Nacos能让您从微服务平台建设的视角管理数据中心的所有服务及元数据(即:服务相关的一些配置和状态信息) 包括:管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略。

二、快速入门

2.1> 服务协作流程

  • Spring Cloud常见集成方案

【注】

  • Ribbon:基于客户端的负载均衡。
  • Feign:可以帮我们更快捷、优雅地调用HTTP API。将HTTP报文请求方式伪装为简单的java接口调用方式。

2.2> 搭建Nacos服务端

请参见【配置中心Nacos】中Nacos的安装步骤


三、服务发现基础应用

3.1> Nacos架构图

  • 官方给出的架构图如下所示:

【注】

  • Provider APP :服务提供者
  • Consumer APP :服务消费者
  • Name Server:通过VIP(Vritual IP)或者DNS的方式实现Nacos高可用集群的服务路由。
  • Nacos Server :Nacos服务提供者,里面包含:
    • Open API:功能访问入口。
    • Config Service:配置服务模块。在服务或者应用运行过程中,提供动态配置或者元数据以及配置管理的服务提供者。
    • Naming Service:名字服务模块。提供分布式系统中所有对象(Object)、实体(Entity)的“名字”到关联的元数据之间的映射管理服务,服务发现和DNS就是名字服务的2大场景。
    • Consistency Protocol:一致性协议,用来实现Nacos集群节点的数据同步。使用Raft算法(使用类似算法的中间件还有Etcd、Redis哨兵选举等)。
    • Nacos Console:Nacos的控制台。

3.2> 前期准备

3.2.1> 添加父类pom依赖
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<properties>
    <java.version>1.8</java.version>
    <spring.boot>2.1.3.RELEASE</spring.boot>
    <spring.cloud>Greenwich.RELEASE</spring.cloud>
    <spring.cloud.alibaba>2.1.0.RELEASE</spring.cloud.alibaba>
</properties>

<dependencyManagement>
    <dependencies>
        <!-- 引入Spring Cloud Alibaba依赖 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring.cloud.alibaba}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
      
        <!-- 引入Spring Cloud依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring.cloud}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
      
        <!-- 引入Spring Boot依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring.boot}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
3.2.2> 项目结构

3.3> 基于Feign+Nacos的服务调用

  • Feign和OpenFeign两者的区别:
3.3.0> 整体项目
  • nacos-provider
  • 项目主pom
    • 添加Lombok、Spring Cloud OpenFeign、Spring Cloud Alibaba Nacos Discovery、Spring Boot Web依赖
  • nacos-provider-web
    • pom.xml添加Spring Boot Web、Nacos Discovery、OpenFeign的依赖
    • application.yml添加Nacos配置
    • NacosProviderApplication类上添加@EnableDiscoveryClient和@EnableFeignClients注解
    • ProviderController添加hello()方法
  • nacos-provider-api
  • nacos-provider-application
  • nacos-consumer
  • 项目主pom
    • 添加Lombok、Spring Cloud OpenFeign、Spring Cloud Alibaba Nacos Discovery、Spring Boot Web依赖
  • nacos-consumer-web
    • application.yml添加Nacos配置
    • ProviderServicepom.xml添加Spring Boot Web、Nacos Discovery、OpenFeign的依赖
    • 在feign.service包中添加Feign的接口
    • NacosConsumerApplication类上添加@EnableDiscoveryClient和@EnableFeignClients注解
    • ConsumerController添加hello()方法,引入ProviderService并调用hello()方法
  • nacos-consumer-api
  • nacos-consumer-application
3.3.1> 架构图
3.3.2> nacos-provider相关代码
  • 项目的主pom
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>

    <!-- Spring Boot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Cloud Alibaba Nacos Discovery -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <!-- Spring Cloud -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>

【注】添加LombokSpring Boot WebSpring Cloud OpenFeignSpring Cloud Alibaba Nacos Discovery的依赖。

  • nacos-provider-web

pom

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>

application.yml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server:
  port: 7000

spring:
  application:
    name: nacos-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

【注】添加nacos.discovery的配置

NacosProviderApplication

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
public class NacosProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosProviderApplication.class, args);
    }
}

【注】添加@EnableDiscoveryClient@EnableFeignClients注解

ProviderController

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Slf4j
@RestController
@RequestMapping("/provider")
public class ProviderController {
    /**
     * http://localhost:7000/provider/hello
     */
    @GetMapping("/hello")
    public String hello() {
        log.info("provider hello");
        return "provider hello";
    }
}
3.3.3> nacos-consumer相关代码
  • 项目的主pom
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>

    <!-- Spring Boot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Cloud Alibaba Nacos Discovery -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <!-- Spring Cloud -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>

【注】添加LombokSpring Boot WebSpring Cloud OpenFeignSpring Cloud Alibaba Nacos Discovery的依赖。

  • nacos-consumer-web

pom

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>

application.yml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server:
  port: 7002
spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

【注】添加nacos.discovery的配置

NacosConsumerApplication

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
public class NacosConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosConsumerApplication.class, args);
    }
}

ProviderService

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@FeignClient(name = "nacos-provider")
public interface ProviderService {
    @GetMapping("/provider/hello")
    String hello();
}

ConsumerController

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Slf4j
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
    @Resource
    private ProviderService providerService;

    /**
     * 基于Feign调用
     * http://localhost:7002/consumer/hello
     */
    @GetMapping("/hello")
    public String hello() {
        log.info("Feign invoke!");
        return providerService.hello();
    }
}

请求http://localhost:7002/consumer/hello

3.4>基于Dubbo+Nacos的服务调用

3.4.0> 整体项目
  • nacos-provider
  • 项目主pom
    • 添加dubbo依赖
  • nacos-provider-web
    • application.yml添加dubbo配置
    • pom.xml添加nacos-provider-application依赖(用于dubbo扫描该module)
  • nacos-provider-api
    • 接口OrderService
  • nacos-provider-application
    • pom.xml添加dubbo依赖和nacos-provider-api依赖
    • 实现类OrderServiceImpl
  • nacos-consumer
  • 项目主pom
    • 添加dubbo依赖
  • nacos-consumer-web
    • application.yml添加dubbo配置
    • pom(添加nacos-provider-api依赖)
    • ConsumerController添加getOrder()方法
  • nacos-consumer-api
  • nacos-consumer-application
3.4.1> 架构图
3.4.2> nacos-provider相关代码
  • 项目的主pom
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>

【注】添加dubbo依赖

  • nacos-provider-web

application.yml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dubbo:
  scan:
    base-packages: com.muse.nacos.provider # Dubbo服务扫描基准包
  protocol:
    name: dubbo # dubbo 协议
    port: 21880 # dubbo 协议端口 (与server.port一样,需要修改)
  registry:
    address: nacos://127.0.0.1:8848 # Nacos注册地址
  cloud:
    subscribed-services: nacos-provider

【注】添加dubbo配置。

pom依赖。添加这个module的依赖,才能扫描到该module下使用了dubbo的@Service注解的类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>com.muse.nacos.provider</groupId>
    <artifactId>nacos-provider-application</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>
  • nacos-provider-api添加

OrderService接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface OrderService {
    /**
     * 获得订单信息
     *
     * @return
     */
    String getOrder();
}
  • nacos-provider-application

pom依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencies>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-dubbo</artifactId>
    </dependency>
    <dependency>
        <groupId>com.muse.nacos.provider</groupId>
        <artifactId>nacos-provider-api</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>

添加实现类OrderServiceImpl

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Slf4j
@Service // org.apache.dubbo.config.annotation.Service
public class OrderServiceImpl implements OrderService {
    public String getOrder() {
        log.info("Order Info");
        return "Order Info";
    }
}
3.4.3> nacos-consumer相关代码
  • 项目的主pom
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>

【注】添加dubbo依赖

  • nacos-consumer-web

application.yml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dubbo:
  scan:
    base-packages: com.muse.nacos.consumer
  cloud:
    subscribed-services: nacos-provider

pom.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>com.muse.nacos.provider</groupId>
    <artifactId>nacos-provider-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

ConsumerController

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Slf4j
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
    
    @Reference // org.apache.dubbo.config.annotation.Reference
    private OrderService orderService;

    /**
     * 基于Dubbo调用
     * http://localhost:7002/consumer/getOrder
     */
    @GetMapping("/getOrder")
    public String getOrder() {
        log.info("getOrder invoke!");
        return orderService.getOrder();
    }
}

请求http://localhost:7002/consumer/getOrder


四、Nacos源码解读

4.1> Spring Cloud完成服务注册的时机

4.1.1> 通用服务注册标准
  • 在spring-cloud-commons包中有一个类org.springframework.cloud.client.serviceregistry.ServiceRegistry,它是Spring Cloud提供的服务注册的标准。集成到Spring Cloud中实现服务注册的组件,都会实现该接口。如下所示:
  • Nacos中针对这个接口有一个实现类是com.alibaba.cloud.nacos.registry.NacosServiceRegistry。如下所示:
4.1.2> Spring Cloud集成Nacos的实现过程
  • 在spring-cloud-common包的META-INF/spring.factories中包含自动装配的配置信息,其中AutoServiceRegistrationAutoConfiguration就是服务注册相关的配置类。如下所示:
  • 在AutoServiceRegistrationAutoConfiguration配置类中,可以看到注入了一个AutoServiceRegistration实例。如下图所示:
  • 可以看出,AbstractAutoServiceRegistration抽象类实现了AutoServiceRegistration接口,并且最重要的是NacosAutoServiceRegistration继承了AbstractAutoServiceRegistration。如下图所示:
  • 其中,从上面类图可见,AbstractAutoServiceRegistration实现了接口ApplicationListener。ApplicationListener类的作用就是提供一种事件监听机制,它的方法onApplicationEvent(E event)的作用就是监听某一个指定事件。而AbstractAutoServiceRegistration实现该方法,并且监听WebServerInitializedEvent事件(当Webserver初始化完成之后),调用this.bind(event)方法。如下所示:
4.1.3> Dubbo集成Nacos的实现过程
  • 因为要简化标题,所以准确的说,介绍的应该是Spring Cloud Alibaba Dubbo集成Nacos的实现过程。
  • spring-cloud-alibaba-dubbo
  • DubboServiceRegistrationNonWebApplicationAutoConfiguration

4.2> NacosServiceRegistry的实现

  • register(...)方法
  • registerInstance(...) 方法

【注】serverProxy.registerService(...)方法在4.3节介绍。

  • addBeatInfo(...)
  • BeatTask.run(...)

4.3> 服务注册原理

  • serverProxy.registerService(...)
  • Nacos提供了SDK及Open API的形式来实现服务注册。这两种形式的本质是一样的,SDK方式只是提供了一种访问的封装,在底层仍然是基于HTTP协议完成请求的。
  • InstanceController.register(...) 对应源码项目为:nacos-1.3.0
  • registerInstance(...)
  • createEmptyService(...)
  • putServiceAndInit(...)
  • service.init() 心跳检测机制
  • pushService(...)
  • 简单总结一下服务注册的完整过程:
  • Nacos客户端通过Open API的形式发送服务注册请求。
  • Nacos服务端收到请求后,做以下三件事:
    • 构建一个Service对象保存到ConcurrentHashMap集合中。
    • 使用定时任务对当前服务下的所有实例建立心跳检测机制
    • 基于数据一致性协议将服务数据进行同步。

4.4> 服务提供者地址查询原理

  • InstanceController.list(...)
  • doSrvIPXT(...)
  • 总结一下上面关于doSrvIPXT方法的主要逻辑
  • 根据namespaceId、serviceName获得Service实例
  • 从Service实例中基于srvIPs得到所有服务提供者的实例信息
  • 遍历组装JSON字符串并返回。

4.5> 服务地址动态感知原理

  • 原理图

【解释】

Nacos客户端有一个HostReactor类,它的功能是实现服务的动态更新,基本原理如下:

  • 客户端发起事件订阅后,在HostReactor中有一个UpdateTask线程,每10s发送一次Pull请求,获得服务端最新的地址列表。
  • 对于服务端,它和服务提供者的实例之间维持了心跳检测,一旦服务提供者出现异常,则会发送一个Push消息给Nacos客户端,也就是服务消费者。
  • 服务消费者收到请求之后,使用HostReactor中提供的processServiceJSON解析消息,并更新本地服务地址列表。
  • HostReactor的建立

在init里会有三个任务:

  • 1> FailoverReactor.SwitchRefresher,默认每5秒检测是否开启故障转移,若是开启,则把文件数据读入serviceMap。
  • 2> FailoverReactor.DiskFileWriter,默认一天把服务信息写入本地。
  • 3> 建立10秒后调用DiskFileWriter#run,检测本地缓存文件,若是没有则建立缓存文件。
  • UpdateTask
  • 服务获取和刷新的流程图
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 爪哇缪斯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
2017年信息消费将达900亿 云计算带动产值超1000亿
近日,东莞市政府印发了《促进信息消费实施方案(2015—2017 年)》(下称《方案》)。《方案》提出,到2017年,全市信息消费总额要达到900亿元,年均增长20%以上。据预测,届时将拉动3000亿元GDP增长。 信息消费,泛指以互联网、移动终端为基础的现代信息化消费行为。今后,东莞将加快推进信息基础设施建设,推进无线宽带网络建设、光纤入户和三网融合。此外,物联网、云计算应用消费,均将占有重要一席之地。 《方案》提出,到2017年,全市信息消费总额达到900亿元,年均增长20%以上,其中软件和信息服务消费
静一
2018/03/21
7240
中芯国际“跌”上热搜:回应或被美国列入“实体清单”的声明招致不满?
9 月 5 日,据路透社援引美国国防部一名官员消息称,特朗普政府正考虑是否将中国顶级芯片制造商中芯国际 (SMIC) 列入“贸易黑名单”。晚些时候,中芯国际对此做出回应:任何关于“中芯国际涉军”的报道均为不实新闻,其对此感到震惊和不解。
深度学习与Python
2020/09/14
5620
突发!拜登扩大投资禁令,华为、中芯等59家中企列入「黑名单」
---- 新智元报道   来源:外媒 编辑:yaxin, LQ 【新智元导读】当地时间周四,拜登政府签署了一份新的行政令,限制美国实体对列入投资「黑名单」的中企进行投资交易,其中包括华为、中芯、海康威视等59家企业。该禁令将于8月2日生效,投资者需要在未来一年内抛售已经持有的相关股票。 6月3日,拜登政府签署了一项新行政令,将包括华为、中芯等59家中企列入投资「黑名单」,禁止美国实体与名单所列公司进行投资交易。 美国财政部取代国防部,负责执行这份禁令清单。最新行政令将于8月2日生效,此前将有60天宽限
新智元
2023/05/22
1.1K0
突发!拜登扩大投资禁令,华为、中芯等59家中企列入「黑名单」
存在军事用途,美国政府对中芯国际实施出口限制?中芯国际:未收到官方消息
上周五,《华尔街日报》援引商务部致计算机芯片公司的一封信中提出的要求报道,信中指出,出口到中芯国际或其子公司有被中国政府用于军事活动的风险,因此在将某些技术出口给中芯国际之前,它们必须获得许可证。
大数据文摘
2020/10/10
4950
存在军事用途,美国政府对中芯国际实施出口限制?中芯国际:未收到官方消息
原计划下周上市!商汤回应被美国列入「投资黑名单」:拒绝毫无根据的指控!
作者| 琰琰 编辑 | 青暮 当地时间12月10日,美国商务部发布公告将中国人工智能公司商汤科技(SenseTime)列入“涉军企业”名单,拜登政府禁止美国人投资商汤集团。彭博社援引知情人士消息称,受此影响,港交所监管机构将重新做出调整,商汤不会按预期进行IPO。 商汤科技原定于12月17日(下周五)通过IPO在香港联合交易所主板上市。此次 IPO 以每股 3.85 港元至 3.99 港元的价格区间发行 15 亿股股票,约占其总股份的4.5%,所得款净额达56.55亿港元(折合人民币约46.19亿元)。据
AI科技评论
2023/04/12
4640
原计划下周上市!商汤回应被美国列入「投资黑名单」:拒绝毫无根据的指控!
华为中兴之后,中国电信和中国移动也被美列入「黑名单」!另有首家俄企上榜
---- 新智元报道   编辑:David 好困 【新智元导读】近日,美国以所谓的「威胁国家安全」为由,将一家俄企和两家中企列入电信「黑名单」。至此,该名单中的企业已扩大至8家。预告:3月30日(周三)下午,新智元将举办首期元宇宙论坛「元宇宙 新人类」!(详情点击或查看文末) 俄乌冲突之际,美国借机再度扩大制裁范围。 3月25日,美国联邦通信委员会(FCC)将俄罗斯AO卡巴斯基实验室、中国电信美洲公司和中国移动通信国际(美国)有限公司列入「国家安全威胁清单」。 其中,卡巴斯基是进入该清单的第一个俄企,
新智元
2022/03/28
4520
低轨道卫星服务(比如starlink),会取代5G吗?
射频前端产业观察: 市场传言iphone13将可能接入低轨道卫星,看起来是噱头更大于短期的市场机遇。
海大指南针
2022/05/16
6300
低轨道卫星服务(比如starlink),会取代5G吗?
59家中企被列入「黑名单」,拜登签署新行政令修订投资禁令
机器之心报道 编辑:小舟 拜登政府对特朗普推出的针对所谓中国军方关联企业的投资禁令进行了修订。 当地时间 6 月 3 日,美国总统拜登签署了一项新的行政令:禁止美国实体投资数十家所谓与国防或监视技术行业有关联的中国企业。该行政令将于美东时间 8 月 2 日凌晨 12 时 01 分起生效。拜登政府表示:「此举扩大了特朗普时期出台的一项有法律缺陷的行政令涵盖的范围。」 美国高级政府官员称:「美国财政部将负责执行并『滚动』更新这份新的禁令清单,目前清单上包括约 59 家企业,美国实体被禁止买卖这些企业的上市证券
机器之心
2023/03/29
2.5K0
59家中企被列入「黑名单」,拜登签署新行政令修订投资禁令
被炒上天的中国工业机器人如何软着陆?
在东莞的一个机器臂组装工厂里,工人在机器臂组装车间里测试成品。 “我就坐在他旁边,明显感受到血肉之躯发出了钢铁的力量。”广证创投副总经理王彦和参会的人们调侃道。 2015年5月23日,在广州证券举办的一个主题为工业4.0投资策略的沙龙里,广东伯朗特智能装备股份有限公司(以下简称伯朗特)董事长尹荣造,在用三分钟时间介绍自己公司时,这位大约1米65、戴着无框眼镜的湖南人,笑眯|眯地从正常语音语速跳转为男高音,朗诵《伯朗特梦》一诗,接着清唱一曲《伯朗特人》,中途破音让现场笑成一片。 在此前4天,国务院印
机器人网
2018/04/13
9110
被炒上天的中国工业机器人如何软着陆?
华为秘密作战计划曝光,重注研发AI芯片挑战英伟达,轮值董事长挂帅
雷刚 问耕 发自 凹非寺 量子位 报道 | 公众号 QbitAI Project Da Vinci,达芬奇计划。 这是华为最新的秘密“作战”方案,也即将是影响最广泛的战略目标。 在这个计划中,华为
量子位
2018/07/19
4850
中国再领跑:成功发射全球首颗6G试验卫星?
在全球5G网络建设逐步走上正轨后,全球多国开始提前押注6G技术。10月19日消息指出,美国科技巨头高通、微软等已经拉上知名5G巨头诺基亚、三星组建6G联盟,意图在下下一代通信技术中,主导技术标准。然而,这一意图或将落空,中国已经率先推出成果。我国早已在2017年底开端初步6G研讨。对此远在欧洲的芬兰也传出了关于6G的消息。据悉芬兰在5G成长上走在天下多国的前列,此前芬兰更是资助了芬兰科学院宣布启动了“6Genesis”,这是一项为期8年的项目,将投入资金约为2.5亿欧元,其任务是研讨最终将包括6G收集的无线通信技术。
肉眼品世界
2020/11/11
5540
中国再领跑:成功发射全球首颗6G试验卫星?
阿里被美证监会列入股市「预摘牌名单」,股价大跌11%
机器之心报道 编辑:泽南、蛋酱 阿里巴巴是美国「退市名单」200 余家公司中的最大一家。 中美两国正在试图达成协议,避免中国公司在美国大规模退市。但另一方面,美国证监会也在层层加码。本周五,阿里巴巴集团控股(BABA)朝着被美国证券交易所强制退市的方向又迈进了一步。 由于国内拒绝允许美国官员额外审查工作,美国证券交易委员会 SEC 本周五将这家在美国上市的最大的中国公司加入了「可能从美国证券交易所退市」的名单之中。根据 2020 年《外国公司问责法案》(HFCAA)的要求,这些上市公司将面临三年的倒计时,直
机器之心
2022/08/25
4750
阿里被美证监会列入股市「预摘牌名单」,股价大跌11%
突发!中芯国际、大疆等60家企业正式被特朗普政府列入实体清单
---- 新智元报道   来源:外媒 编辑:LQ 【新智元导读】美国商务部在12月18日发布了新的「贸易黑名单」,新增77家实体,其中包含中国60家企业,中芯国际、大疆创新、深圳光启集团等企业和多家高校被列入清单。 美国商务部工业与安全局(BIS)修订了《出口管理条例》(EAR),加入了77家「实体」,其中中国就有60家。 中芯国际、大疆创新、深圳光启集团等企业和多家高校被列入清单. 中芯国际「动荡的一周」 过去一周对于中芯国际来说真的不太平。 中芯国际高层换帅风波还未平息,现在又被川普政府列入黑名
新智元
2023/05/22
2K0
突发!中芯国际、大疆等60家企业正式被特朗普政府列入实体清单
任正非5月18日接受日本媒体采访的中文纪要
任正非:首先,感谢各位学者、教授专家、媒体记者们光临华为,与我们进行沟通,我很高兴与你们直面交流。你们对这个咖啡厅有印象吗?我太太去过日本目黑雅叙园后,就说要仿建一个这样的咖啡厅,将来用于接待日本朋友。我们一家人,包括我的女儿,都很喜欢日本。我小女儿学的第二外语就是日语,她没事就跑到日本逛街,到药妆店买东西。
后端云
2019/06/28
9880
用AI寻找“隐形”潜艇:技术的进步会终结和平吗?
大数据文摘作品 作者:Mickey 潜艇的核心价值在于其在战争中的隐藏能力。在核战争中,核威慑可能可以摧毁一切武器,但潜艇的隐藏能力让其有可能幸存,并对敌方进行核回击。这也被军事领域成为二次打击能力,或者核报复能力。 理论上来说,从核威慑角度看,二次打击能力愈强,两国发生核战的几率也愈小,反而能达成更为稳定的核均衡关系。因此确保潜艇在核战争中的第一次导弹袭击中幸存下来,并在第二次袭击中发射导弹回应,是大国之间威慑战略的关键。 也正因如此,任何破坏潜艇隐藏能力的技术,都可能成为破坏世界的和平的“蝴蝶的翅膀”。
大数据文摘
2022/07/18
3890
用AI寻找“隐形”潜艇:技术的进步会终结和平吗?
被美列入出口“黑名单”,华为海思凌晨发信:所有备胎芯片全转正,要科技自立
美国商务部将华为列入管制“实体清单”,从事实上限制华为对美出售和从美采购。这些行动将禁止华为向美国市场出售技术,还可能阻止华为从美国高通(Qualcomm)等芯片公司采购对华为生产至关重要的半导体。
大数据文摘
2019/05/17
7840
卫星黑客利器:OpenATS新版本更新
随着卫星互联网在全球的加速布局以及我国今年正式将卫星互联网纳入新基建范畴,卫星互联网迎来大规模布局和加速发展,特别是以低轨卫星星座StarLink为代表的大型卫星互联网星座。由于卫星的特殊用途和优势,卫星网络是国家战略通信资源,背后离不开军事和国家安全的背景。
FB客服
2020/07/23
1.2K0
卫星黑客利器:OpenATS新版本更新
造芯计划砸3300亿元直指中国!美众议院通过近3000页「芯片法案」
当地时间2月4日,美国众议院以222票赞成、210反对的投票结果通过了《2022美国竞争法案》。
新智元
2022/02/24
3750
造芯计划砸3300亿元直指中国!美众议院通过近3000页「芯片法案」
美国考虑将蚂蚁加入黑名单;华为拟出售部分荣耀智能手机业务;被判赔联想525万,常程方回应
10月15日,据路透社援引知情人士消息称,美国务院已呈交一份提案,要求特朗普政府将中国金融科技公司蚂蚁集团列入“贸易黑名单”。对此,蚂蚁集团回应称,此前集团已在一份声明中表示,公司不了解美国政府任何有关的讨论,并且其“业务主要在中国,对在中国市场的增长前景感到兴奋。”近日,也有消息称证监会调查导致蚂蚁集团IPO推迟。对此蚂蚁发言人表示,上市流程正在两地有序推进,没有预设的时间表,任何关于时间表的猜测都没有事实依据。
yuanyi928
2020/11/02
7700
美国将 22 家中企列入“黑名单”:涉及 AI、大数据、云、网络安全、工业互联网、智慧城市、存储等诸多领域 IT 公司
2021年7月9日,美国商务部将22家中国公司和Wingel Zhang个人列入经济黑名单。 涉及的企业: 1、Armyfly 北京东土军悦科技有限公司,致力于装备自主可控技术、信息网络技术和高精度时钟同步技术的创新研究,提供完全自主设计制造、可控可信的战术一体化通信系统、视音频传输系统、网络安全系统、军事物联网系统及整体解决方案。 2、Kyland Technology Co., Ltd. 北京东土科技股份有限公司(股票代码:300353),致力于工业互联网核心硬件及软件技术的研发、生产与销售,立
云头条
2022/03/18
1.4K0
推荐阅读
2017年信息消费将达900亿 云计算带动产值超1000亿
7240
中芯国际“跌”上热搜:回应或被美国列入“实体清单”的声明招致不满?
5620
突发!拜登扩大投资禁令,华为、中芯等59家中企列入「黑名单」
1.1K0
存在军事用途,美国政府对中芯国际实施出口限制?中芯国际:未收到官方消息
4950
原计划下周上市!商汤回应被美国列入「投资黑名单」:拒绝毫无根据的指控!
4640
华为中兴之后,中国电信和中国移动也被美列入「黑名单」!另有首家俄企上榜
4520
低轨道卫星服务(比如starlink),会取代5G吗?
6300
59家中企被列入「黑名单」,拜登签署新行政令修订投资禁令
2.5K0
被炒上天的中国工业机器人如何软着陆?
9110
华为秘密作战计划曝光,重注研发AI芯片挑战英伟达,轮值董事长挂帅
4850
中国再领跑:成功发射全球首颗6G试验卫星?
5540
阿里被美证监会列入股市「预摘牌名单」,股价大跌11%
4750
突发!中芯国际、大疆等60家企业正式被特朗普政府列入实体清单
2K0
任正非5月18日接受日本媒体采访的中文纪要
9880
用AI寻找“隐形”潜艇:技术的进步会终结和平吗?
3890
被美列入出口“黑名单”,华为海思凌晨发信:所有备胎芯片全转正,要科技自立
7840
卫星黑客利器:OpenATS新版本更新
1.2K0
造芯计划砸3300亿元直指中国!美众议院通过近3000页「芯片法案」
3750
美国考虑将蚂蚁加入黑名单;华为拟出售部分荣耀智能手机业务;被判赔联想525万,常程方回应
7700
美国将 22 家中企列入“黑名单”:涉及 AI、大数据、云、网络安全、工业互联网、智慧城市、存储等诸多领域 IT 公司
1.4K0
相关推荐
2017年信息消费将达900亿 云计算带动产值超1000亿
更多 >
LV.0
这个人很懒,什么都没有留下~
目录
  • 1.1> 从单体服务到微服务
    • 1.1.1> 单体服务(all in one)
    • 1.1.3> SOA
    • 1.1.4> 微服务
    • 1.1.5> SOA与微服务的区别
  • 1.2> 服务发现介绍
  • 1.3> 服务发现技术对比
  • 1.4> Nacos简介
  • 1.5> Nacos特性
  • 二、快速入门
    • 2.1> 服务协作流程
    • 2.2> 搭建Nacos服务端
  • 三、服务发现基础应用
    • 3.1> Nacos架构图
    • 3.2> 前期准备
      • 3.2.1> 添加父类pom依赖
      • 3.2.2> 项目结构
    • 3.3> 基于Feign+Nacos的服务调用
      • 3.3.0> 整体项目
      • 3.3.1> 架构图
      • 3.3.2> nacos-provider相关代码
      • 3.3.3> nacos-consumer相关代码
    • 3.4>基于Dubbo+Nacos的服务调用
      • 3.4.0> 整体项目
      • 3.4.1> 架构图
      • 3.4.2> nacos-provider相关代码
      • 3.4.3> nacos-consumer相关代码
  • 四、Nacos源码解读
    • 4.1> Spring Cloud完成服务注册的时机
      • 4.1.1> 通用服务注册标准
      • 4.1.2> Spring Cloud集成Nacos的实现过程
      • 4.1.3> Dubbo集成Nacos的实现过程
    • 4.2> NacosServiceRegistry的实现
    • 4.3> 服务注册原理
    • 4.4> 服务提供者地址查询原理
    • 4.5> 服务地址动态感知原理
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档