精华内容
下载资源
问答
  • Nacos服务发现

    2020-03-05 15:07:03
    Nacos 服务发现 一、什么是Nacos 官方文档:https://nacos.io/zh-cn/docs/quick-start.html Nacos是一个服务发现组件同时也是一个配置服务器 解决了两个问题: 服务A怎样找到服务B 管理微服务的配置 二、...

    Nacos 服务发现

    一、什么是Nacos

    • 官方文档:https://nacos.io/zh-cn/docs/quick-start.html
    • Nacos是一个服务发现组件同时也是一个配置服务器
    • 解决了两个问题:
      • 服务A怎样找到服务B
      • 管理微服务的配置

    二、架构演进

    • 加入nacos 系统架构就会演变成下种状态
      在这里插入图片描述

    三、搭建Nacos Server

    下载Nacos

    • 下载地址:https://github.com/alibaba/nacos/releases
    • 打开项目springcloud alibaba依赖spring-cloud-alibaba-dependencies文件搜索Nacos,查看Nacos Client版本,在下载地址中查找对应的版本下载。

    搭建Nacos Server

    • 参考文档:https://nacos.io/zh-cn/docs/quick-start.html

    将应用注册到Nacos

    • 加依赖
     <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
    
    • 没有注解
    • 写配置
    spring:
      cloud:
        nacos:
          discovery:
            # 指定 nacos server的地址
            server-addr: localhost:8848
            # 命名空间
            namespace: 0f1fe6bf-c63b-41d0-8dab-3243e825ba61
            # 集群名称
            cluster-name: NJ
            
      application:
        #服务名称,尽量用中划线 -
        name: user-center
    

    DiscoveryClient

    先声明对象

    @Autowired
        private DiscoveryClient discoveryClient;
    

    在方法中使用

    //查询id对应服务的所有实例的信息
            List<ServiceInstance> instances = this.discoveryClient.getInstances("user-center");
            //查询当前服务发现组件注册了哪些微服务
            List<String> services = this.discoveryClient.getServices();
    

    四、服务发现的领域模型

    • Namespace:实现隔离,默认为public
    • Group:不同服务可以分到一个组,默认DEFAULT_GROUP
    • Service:微服务
    • Cluster:集群,对指定微服务的一个虚拟划分
    • Instance:微服务实例

    五、元数据

    Nacos数据(如配置和服务)描述信息,如服务版本、权重、容灾策略、负载均衡策略、鉴权配置、各种自定义标签 (label),从作用范围来看,分为**服务级别的元信息、集群的元信息及实例的元信息**

    展开全文
  • Nacos 服务发现

    2021-03-20 22:53:54
    Nacos 是阿里的一个开源产品,它是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案。Nacos 使服务更容易注册,并通过 DNS或 HTTP接口发现其他服务,Nacos还提供服务的实时健康检查,以防止向不健康...

    一、Nacos 简介
    Nacos 是阿里的一个开源产品,它是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案。Nacos 使服务更容易注册,并通过 DNS或 HTTP接口发现其他服务,Nacos还提供服务的实时健康检查,以防止向不健康的主机或服务实例发送请求;官网

    **为什么需要注册中心:**微服务可能是部署在云环境的,服务实例的网络位置或许是动态分配的。另外,每一个服务一般会有多个实例来做负载均衡,由于宕机或升级,服务实例网络地址会经常发生变动改变。再者,每一个服务也可能应对临时访问压力增加新的服务节点。

    基于上述问题,服务之间如何感知?服务如何管理?这就是服务发现解决的问题。如下图:
    img
    上图中服务实例本身并不记录服务生产方的网络地址,所有服务实例都包含一个服务发现客户端
    【1】在每个服务启动时会向服务发现中心上报自己的网络位置。这样,在服务发现中心内部会形成一个服务注册表,服务注册表是服务发现的核心部分,是包含所有服务实例的网络地址的数据库。
    【2】服务发现客户端会定期从服务发现中心同步服务注册表 ,并缓存在客户端。
    【3】当需要对某服务进行请求时,服务实例通过该注册表,定位目标服务网络地址。若目标服务存在多个网络地址,则使用负载均衡算法从多个服务实例中选择出一个,然后发出请求。

    总结一下,在微服务环境中,由于服务运行实例的网络地址和数量是不断动态变化的 ,因此无法使用固定的配置文件来记录服务提供方的网络地址,必须使用动态的服务发现机制用于实现微服务间的相互感知。各服务实例会上报自己的网络地址,这样服务中心就形成了一个完整的服务注册表,各服务实例会通过服务发现中心来获取访问目标服务的网络地址,从而实现服务发现的机制。

    二、搭建 Nacos服务端


    下载地址:链接

    下载后解压,进入 bin目录,双击 startup.cmd。启动服务 nacos的默认端口是8848:

    三、服务生产者与消费者配置

    【1】引入 nacos依赖

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

    【2】application.yml 配置 nacos 服务地址和应用名称

    1 spring:
    2   cloud:
    3     nacos:
    4       discovery:
    5         server-addr: 127.0.0.1:8848
    6   application:
    7     name: quickstart-provider
    

    【3】启动类上添加 @EnableDiscoveryClient

    @EnableDiscoveryClient
    

    多实例的情况是相同的服务,不同的端口号,注册到 Nacos的服务名是相同的,就会识别为多个实例;

    四、服务发现数据模型

    Nacos 在经过阿里内部多年生产经验后提炼出的数据模型,则是一种服务-集群-实例的三层模型,这样基本可以满足服务在所有场景下的数据存储和管理。
    img
    **命令空间(Namespace):**用户进行租户粒度的配置隔离,命令空间不仅适用于 nacos的配置管理,同样适用于服务发现。Namespace的常用场景之一是不同环境配置的隔离,例如开发测试环境和生产环境的资源隔离。
    **服务:**提供给客户端的软件功能,通过预定义接口网络访问;
    **服务名:**服务提供的标识,通过该标识可以唯一确定其指代的服务;
    **实例:**提供一个或多个服务的具有可访问网络地址(IP:port)的进程,启动一个服务,就产生一个服务实例;
    **元信息:**nacos数据(如配置和服务)描述信息,如服务版本、权重、容灾策略、负载均衡策略、鉴权配置、各种自定义标签,从作用范围来看,分为服务级别的元数据、集群的元数据及实例的元数据;

    元信息能够让 nacos更具备扩展性,用户可以自定义数据用于描述实例、服务、集群等;

    **集群:**服务实例的集合,服务实例组成一个默认集群,集群可以被进一步按需求划分,划分的单位可以是虚拟集群,相同集群下的实例才能相互感知。

    应用通过 NamespaceServiceCluster(DEFAULT)的配置,描述了该服务向那个环境(如开发环境)的哪个集群注册实例:

    1 spring:
    2   cloud:
    3     nacos:
    4       discovery:
    5         server-addr: 127.0.0.1:8848   #注册中心地址
    6         namespace: adsfjklk-3224-83k4-9ds2-r3kkl2khb43k8  #环境
    7         cluster-name: DEFAULT #集群名称  默认为 DEFAULT
    8   application:
    9     name: quickstart-provider
    

    五、服务管理

    **服务流量权重支持及流量保护:**Nacos 为用户提供了流量权重控制的能力,同时开发了服务流量的阈值保护,以帮助用户更好的保护服务不被意外打垮。如下图所示,可以点击实例的 “编辑” 按钮,修改实例的权重。如果想增加实例的流量,可以将权重调大,如果不想实例接收流量,则可以将权重设为0;
    img

    **服务元数据管理:**Nacos 提供了多个维度的服务元数据暴露,帮助用户存储自定义的信息。这些信息都是以 K-V的数据结构存储,在控制台上,会以 k1=v1 这样的格式展示。在服务详细页面,也能看到添加的元数据信息。
    **服务优雅上下线:**Nacos 还提供服务实例的上下线操作,在服务详细页面,可以点击实例的 “上线” 或者 “下线” 按钮,被下线的实例,将不会包含在健康的实例列表里。
    img
    里。
    img

    展开全文
  • 3. nacos服务发现

    2021-01-27 16:27:40
    1. nacos服务发现原理 2. spring cloud服务协作流程 3.搭建nacos服务端 4. 搭建nacos服务发现客户端 5. nacos服务发现的数据模型 一. nacos服务发现的原理 有两个微服务A和B, A调用B, 那么A是如何调用B的呢?...

    本文讲解以下几个方面的内容:

    1. nacos服务发现原理

    2. spring cloud服务协作流程

    3.搭建nacos服务端

    4. 搭建nacos服务发现客户端

    5. nacos服务发现的数据模型


    一. nacos服务发现的原理

    image

    有两个微服务A和B, A调用B, 那么A是如何调用B的呢?我们可以通过http请求,进行调用. 也可以使用rpc进行调用.

    不管使用什么方式, A需要知道B的地址和端口号. 那么A是如何知道B的地址和端口好的呢? 如上图:

    1. B服务启动的时候, 会注册到服务发现中心, 告诉他,我的ip和端口号是什么?这里应该也是接口调用,通知服务发现中心的.

    2. A服务启动的时候, 也会注册的服务发现中心, 告诉他, 我的ip和端口号是什么? 同时, 服务发现中心会告诉我, 当前已注册的服务的ip和端口号. 这里通过一个接口请求和参数返回就可以实现.

    3. 拿到了B服务的ip和port, 接下来就可以调用服务B了.

    二. spring cloud服务协作流程

    我们要基于spring cloud生态环境进行开发. 所以,先来了解spring cloud的服务写作流程

    image

    前面注册和发现就都不说了, 上面说过了, 这里多了两个东西, 一个是Ribbon, 另一个是feign.

    Ribbon是负载均衡器, Feign是远程调用, 自动进行http请求.

    2.1 服务负载均衡 – Ribbon

    客户端Service A 要调用ServiceB的实例1和实例2. 那么到底调用ServiceB的哪个实例呢? 使用Ribbon负载均衡, 要看使用什么样的算法了, 可以使用轮询算法, 或者其他算法, 如加权算法

    负载均衡有两种: 服务端负载均衡, 客户端负载均衡

    • 服务端负载均衡

    在负载均衡中维护一个可用的服务实例清单, 当客户端请求来临时, 负载均衡服务器按照某种配置好的规则(负载均衡算法), 从可用服务实例清单中, 选取其一去处理客户端请求, 这就是服务端负载均衡, 例如Nginx. 通过nginx进行负载均衡, 客户端发送请求值Nginx, nginx通过负载均衡算法, 在多个服务器之间选择一个进行访问.

    image

    • 客户端负载均衡

    接下来, 我们要讲的ribbon, 就属于客户端负载均衡, 在ribbon客户端会有一个服务实例地址列表, 在发送请求前, 通过负载均衡算法, 选择一个服务实例, 然后进行访问, 这是客户端负载均衡. 即在客户端进行负载均衡算法分配.

    image

    服务的调用方, 我们就可以理解为是一个客户端.

    负载均衡算法:

    image

    可通过下面的方式, 在spring boot配置中修改默认的负载均衡的策略

    account-service.ribbon.NFLoadBalanceRuleClassName=com.netflix.loadBalancer.RandomRule

    其中: account-service: 是调用的服务的名称. 后面的组成部分是固定的.

    2.2 服务间接口的调用—Feign

    feign是服务端http接口的调用.

    feign可以帮助我们更快捷, 优雅的调用httpApi. 原来我们在调用http请求的时候, 需要使用的是RestTemplate, 传输域名和端口号, 进行http调用. 使用feign后, 不用再使用RestTemplate模拟请求了, feign能够通过服务名, 找到对应的接口. 不需要我们在拼接地址+端口了, 提供了简单方便的操作.

    使用方法:

    1. 在Service B定义一个接口

    image

    2. 声明feign客户端

    image

    新建一个类, 声明为FeignClient类型的接口. 指定调用的服务名. 然后将指定接口. 这样在调用的时候, 就可以通过服务名, + 接口, 自动找到对应的项目接口了.

    三. 搭建nacos服务端

    这里上一节已经搭建过了(地址: https://www.cnblogs.com/ITPower/articles/12630193.html), 在服务的最后, 我们搭建了nacos的集群

    四. 搭建nacos服务发现客户端

    因为对于服务发现来说, 有很多配置都是公用的, 因此, 我们搭建一个父工程, 将通用的配置都添加到里面取.

    4.1 搭建父工程.

    创建一个maven工厂, 引入jar包即可. pom文件如下

    <pre style="color: rgb(0, 0, 0); font-family: &quot;Courier New&quot;; font-size: 12px; margin: 5px 8px; padding: 5px;"><?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.lxl.www</groupId>
        <artifactId>parent-discovery</artifactId>
        <version>1.0-SNAPSHOT</version>
        <!-- 这是一个父类工程, 所以, 需要设置打包类型为pom -->
        <packaging>pom</packaging>
    
        <properties>
            <project.build.sourceEncodding>UTF-8</project.build.sourceEncodding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencyManagement>
            <dependencies>
                <!-- 这里我们使用的是alibaba的spring cloud -->
                <dependency>
                    <groupId>com.alibaba.cloud</groupId>
                    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                    <version>2.1.0.RELEASE</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Greenwich.RELEASE</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-dependencies</artifactId>
                    <version>2.1.3.RELEASE</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
    
        </dependencyManagement>
    
    </project></pre>
    

    4.2 创建一个服务提供者, 也就是生产者.

    在父工程下创建一个子工程. 我们要做一下三件事

    1. 修改pom文件, 引入服务发现, feign, 和spring boot web

    <pre style="color: rgb(0, 0, 0); font-family: &quot;Courier New&quot;; font-size: 12px; margin: 5px 8px; padding: 5px;"><dependencies>
            <!-- 引入服务发现的包 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
    
            <!-- 定义接口访问, 引入spring boot web -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!-- 服务之间http调用, 引入feign -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
        </dependencies></pre>
    

    2. 添加application.yml配置文件

    指定服务端口号, nacos服务的地址

    <pre style="color: rgb(0, 0, 0); font-family: &quot;Courier New&quot;; font-size: 12px; margin: 5px 8px; padding: 5px;">server:
      port: 56010 spring:
      application:** name: productor
     cloud:
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848** **#nacos的服务器地址**
    logging:
      level:
        root: info
        org.springframework: info</pre>
    

    3. 定义一个启动类, 用来启动spring boot新项目

    需要增加两个引入. 一个启用服务发现, 另一个是启用feign

    <pre style="color: rgb(0, 0, 0); font-family: &quot;Courier New&quot;; font-size: 12px; margin: 5px 8px; padding: 5px;">package com.lxl.www.nacos;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    
    import javax.swing.*;
    
    **@SpringBootApplication** **// 引入服务发现
    @EnableDiscoveryClient
    // 使用feign接口调用
    @EnableFeignClients** public class ProductorApplication { public static void main(String[] args) {
            SpringApplication.run(ProductorApplication.class, args);
        }
    }</pre>
    

    4. 定义一个controller, 写一个接口

    <pre style="color: rgb(0, 0, 0); font-family: &quot;Courier New&quot;; font-size: 12px; margin: 5px 8px; padding: 5px;">package com.lxl.www.nacos.controller;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/productor") public class ProductorController {
    
        @GetMapping("/service") public String service() {
            System.out.println("provider invoke"); return "provider invoke";
        }
    
    }</pre>
    

    5. 启动程序, 在nacos中查看服务注册列表

    image

    最终项目结构如下:

    4.3 创建一个服务消费者.

    其中前3步骤和创建服务生产者是一样的

    在父工程下创建一个子工程. 我们要做一下三件事

    1. 修改pom文件, 引入服务发现, feign, 和spring boot web

    <pre style="color: rgb(0, 0, 0); font-family: &quot;Courier New&quot;; font-size: 12px; margin: 5px 8px; padding: 5px;"><dependencies>
            <!-- 引入服务发现的包 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
    
            <!-- 定义接口访问, 引入spring boot web -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!-- 服务之间http调用, 引入feign -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
        </dependencies></pre>
    

    2. 添加application.yml配置文件

    指定服务端口号, nacos服务的地址

    <pre style="color: rgb(0, 0, 0); font-family: &quot;Courier New&quot;; font-size: 12px; margin: 5px 8px; padding: 5px;">server:
      port: 56010 spring:
     application: 
        **name: consumer**
    
      cloud:
       ** nacos:
          discovery:
            server****-addr: 127.0.0.1:8848** **#nacos的服务器地址**
    logging:
      level:
        root: info
        org.springframework: info</pre>
    

    3. 定义一个启动类, 用来启动spring boot新项目

    需要增加两个引入. 1个启用服务发现, 另一个是启用feign

    <pre style="color: rgb(0, 0, 0); font-family: &quot;Courier New&quot;; font-size: 12px; margin: 5px 8px; padding: 5px;">package com.lxl.www.nacos;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.openfeign.EnableFeignClients; **@SpringBootApplication** **// 引入服务发现
    @EnableDiscoveryClient
    // 使用feign接口调用
    @EnableFeignClients** public class CustomerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(CustomerApplication.class, args); } }</pre>
    

    4. productor生产者远程代理定义

    <pre style="color: rgb(0, 0, 0); font-family: &quot;Courier New&quot;; font-size: 12px; margin: 5px 8px; padding: 5px;">package com.lxl.www.nacos.feign.client;
    
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;
    
    @FeignClient(name = "productor") public interface ProductorFeign {
    
        @GetMapping("/productor/service")
        String service();
    
    }</pre>
    

    5. 通过feign调用productor的的接口

    <pre style="color: rgb(0, 0, 0); font-family: &quot;Courier New&quot;; font-size: 12px; margin: 5px 8px; padding: 5px;">package com.lxl.www.nacos.controller;
    
    import com.lxl.www.nacos.feign.client.ProductorFeign;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/") public class ConsumerController {
        @Autowired private ProductorFeign productorFeign;
    
        @GetMapping("consumer") public String cunsumer() {
            String service = productorFeign.service();
            System.out.println(service); return service;
        }
    
    }</pre>
    

    6. 启动服务, 查看nacos客户端, 并调用接口测试

    image

    nacos生产上已经注册发现了两题服务

    同时调用接口, 可以获取到productor返回的内容.

    4.4 spring cloud的默认负载均衡方式–轮询

    我们可以通过启动多个服务的方式, 来测试服务的负载均衡策略.

    1. 修改productor的启动端口号为动态端口号. 目的是方便启动的时候动态配置端口号, 启动集群

    image

    ** 2. 修改配置, 添加动态端口号**

    image

    image

    vm options配置中设置动态端口号为-Dport=56010, 56011. 点击复制按钮, 可以增加一个应用, 然后配置参数后, 启动两个应用.

    3. 在nacos控制台查看启动效果

    image

    我们看到, nacos的productor 有两台服务实例. 点击详情可查看具体的服务实例信息:

    image

    4. 调用consumer的接口, 访问productor, 默认采用轮询的负载均衡算法

    *  http://localhost:56020/consumer*

    五. nacos服务发现的数据模型

    nacos的注册发现是一种三层模型: 即 服务–集群–实例.如下图:

    image

    nacos最外层是服务. 最里层是多台实例. 多个实例之间组成一个服务集群.

    5.1 命名空间

    命名空间不仅适用于配置管理, 同样适用于服务发现. namespace的常用场景之一是不同环境的配置隔离.如: 开发, 生成, 测试环境资源的隔离.

    productor启动了两个实例, 点击详情进去可以看到他是一个集群. 集群里有两台实例.

    5.2 服务.

    *  在命名空间下, 有各个服务.比如我们上面定义的是在public命名空间下, 定义了两个服务. 一个是productor, 一个是consumer.*

    服务有服务名和**实例.  **远程调用的时候, 需要指定服务名.

    5.3 实例

    实例是基于网络协议通讯, 所以必须要有一个ip:端口号

    5.4 元信息

    在及群里点击某一个实例–>编辑, 可以看到如下页面, 可以设置元信息

    image

    那么元信息是什么呢? 每台服务器都可能会设置自己的个性化的信息. 这就是每台服务器的元数据信息

    5.5 实操—指定集群的命名空间为dev

    image

    只需要在配置中增加命名空间就可以了.

    我们也可以修改集群的名字, 集群的默认名字是DEFAULT. 我们这里将其修改为default. 在控制台dev命名空间下, 可以看到启动了服务customer.

    展开全文
  • nacos服务发现流程

    千次阅读 2020-04-30 12:19:16
    nacos服务发现流程 前面已经知道nacos服务是怎么注册的了,那么nacos对注册的服务又是怎么发现的呢。 1、 既然我们已经知道nacos服务是怎么注册的了,那么点击服务注册的流程里面,查找到最后想服务端发送请求的地方...

    nacos服务发现流程

    前面已经知道nacos服务是怎么注册的了,那么nacos对注册的服务又是怎么发现的呢。
    1、 既然我们已经知道nacos服务是怎么注册的了,那么点击服务注册的流程里面,查找到最后想服务端发送请求的地方。
    在这里插入图片描述
    2、 在最后向服务端发送请求的地方打上断点,调试启动客户端。可以发现客户端最终是通过http请求想服务端发送了一个POST请求。
    链接地址:http://192.168.0.60:8848/nacos/v1/ns/instance
    在这里插入图片描述
    3、 既然我们知道nacos是向服务端发送什么了,那么在服务端源码中找到接收客户端服务注册的地方,最终找到了InstanceController中的register方法
    在这里插入图片描述
    4、 根据代码可以看出。注册方法中只做调用ServiceManager中的registerInstance方法,并在调用前会将客户端传过来的参数信息封装成一个Instance实例
    在这里插入图片描述
    5、 点击进入registerInstance方法,处理了两个流程,创建了一个服务,添加了一个实例
    在这里插入图片描述
    6、 先看看创建服务的流程,点击createEmptyService,发现其实际上是在服务当前服务名称不存在时候才会去创建一个服务,继续调用putserviceAndInit方法。
    在这里插入图片描述
    7、 点击查看putServiceAndInit方法,在该方法中做了几件事情putService,服务的init和集群之间一致性的处理
    在这里插入图片描述
    8、 init是处理与客户端的健康检查,consistencyService.listen是用于一致性处理的,服务发现的流程中不细描述,点击查看putService,
    在这里插入图片描述
    9、 发现最终讲服务放入了一个serviceMap中,该map维护了一个键为namespace,值为一个存放服务名称为键,服务为值的map
    在这里插入图片描述
    10、 这样一个服务就创建完成,下面在来查看实例的创建流程,回到ServiceManage当中的registerInstance,查看添加实例的流程 addInstance
    在这里插入图片描述
    11、 点开addInstance方法,主要存在两个处理,一个是去获取所有的实例列表,一个是处理所有实例的流程
    在这里插入图片描述

    12、 获取实例列表暂时不描述,点击处理实例的方法consistencyService.put(),
    consistencyService这里有三个实现,这里会根据key的值的参数判断最终是走的哪个实现,最终会走到DistroConsistencyServiceImpl
    在这里插入图片描述
    13、 打开distroConsistencyServiceImpl的put方法,一个是处理实例的方法,一个是处理实例最终一致性的同步任务
    在这里插入图片描述

    14、 点卡onput方法,发现实例最终放入到Datum当中并将Datum放入到DataStore当中
    在这里插入图片描述

    15、 整个服务流程就已经处理完了,这里只整理了服务的发现流程。以上都是自己在学习nacos源码时整理的笔记,不一定正确。

    展开全文
  • SpringBoot使用Nacos服务发现

    千次阅读 2019-01-27 21:50:09
    本文介绍SpringBoot应用使用Nacos服务发现。 上一篇文章介绍了SpringBoot使用Nacos做配置中心,本文介绍SpringBoot使用Nacos做服务发现。 1.Eureka闭源 相信到现在,Eureka 2.0 闭源已经不是什么新鲜事了。在2017-...
  • 本文使用SpringCloud结合Nacos服务发现,Feign远程调用做一个简单的Demo。 1 Nacos 关于Nacos之前写了两篇文章关于SpringBoot对它的使用,感兴趣可以查看一下。 《SpringBoot使用Nacos配置中心》 《SpringBoot使用...
  • 本文介绍SpringBoot应用使用Nacos服务发现。 上一篇文章介绍了SpringBoot使用Nacos做配置中心,本文介绍SpringBoot使用Nacos做服务发现。 1.Eureka闭源 相信到现在,Eureka 2.0 闭源已经不是什么新鲜事了。在2017-...
  • Nacos服务发现快速入门1.1Spring Cloud服务协作流程1.2 搭建Nacos服务发现1.2.1创建父工程导入pom.xml1.2.2 创建服务提供者1.2.3 创建消费者 我们将演示如何使用Spring Cloud Alibaba Nacos Discovery为Spring cloud...
  • Nacos 服务发现与调用 pom.xml 添加 discovery,完成服务发现。 <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</...
  • go nacos服务发现

    2021-03-31 22:22:38
    本来想研究一下nacos服务发现,原来sample这么详细啊,直接运行代码吧: package main import ( "fmt" "time" "github.com/nacos-group/nacos-sdk-go/clients" "github....
  • Nacos服务发现 Nacos简介 服务发现产品对比 目前市面上用的比较多的服务发现中心有:Nacos、Eureka、Consul和Zookeeper。 对比项目 Naos Eureka Consul Zookeeper 一致性协议 支持AP和CP模型 AP模型 CP模型 ...
  • Nacos服务发现 什么是服务发现 在微服务架构中,整个系统会按职责能力划分为多个服务,通过服务之间协作来实现业务目标。这样在我们的代码中免不了要进行服务间的远程调用,服务的消费方要调用服务的生产方,为了完成一...
  • nacos服务发现笔记

    2021-01-22 20:31:45
    启动服务 Linux/Unix/Mac 启动命令(standalone代表着单机模式运行,非集群模式): sh startup.sh -m standalone Windows 在bin目录 cmd startup.cmd -m standalone 或者双击startup.cmd运行文件。 nacos默认端口为...
  • Spring Cloud 学习 - Nacos服务发现之Feign方式调用 上一篇,我们介绍了 Spring Cloud 学习 - Nacos服务注册与发现 ,使用了RestTemplate进行简单调用,Ribbon作负载均衡。 RestTemplate调用看起来不够优雅,这一篇...
  • Nacos 提供动态服务发现、服务配置、服务元数据及流量管理。 Nacos 的关键特性包括: 服务发现和服务健康监测 Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用原生SDK、OpenAPI、或一个独立的Agent TODO...
  • Nacos服务发现与调用

    千次阅读 2020-07-27 15:43:39
    (1)Nacos是阿里巴巴推出来的一个新开源项目,是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您快速实现...
  • nacos服务发现源码

    2020-11-16 10:10:39
    一、服务发现流程图 二、客户端 三、服务端
  • openFeign配合nacos服务发现进行微服务调用返回503 service unavailable 出现问题的远程接口代码 @FeignClient("targetService") public interface FeignService { @GetMapping("/xxxx/xxxx/xxxx/list") public R ...
  • 服务发现数据模型Nacos在经过阿里内部多年生产经验后提炼出的数据模型,则是一种服务-集群-实例的三层模型,这样基本可以满足服务在所有场景下的数据存储和管理。 命名空间(Namespace) 用于进行租户粒度的配置隔离...
  • <ol><li>设置nacos服务地址为: yyy:port/namespace</li><li>启动rpc服务.</li><li>java应用实际提交的namespace为: /namespace</li><li>nacos无法正确识别对应的namespace</li></ol> <h3>Environment <ul><li>SOFA...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,166
精华内容 1,666
关键字:

nacos服务发现