精华内容
下载资源
问答
  • Nacos: Dynamic Naming and Configuration Service What does it do Nacos (official site: nacos.io) is an easy-to-use platform designed for dynamic service discovery and configuration and service ...
  • 面试题:微服务间远程交互的过程? 先去注册中心查询服务的服务器地址 调用方给对方发送http请求 1.1. 什么是 Nacos Nacos 是阿里巴巴推出来的一个新开源项目,这是一个更易于构建云原生应用的动态服务...

    1. Nacos概述

    官方地址:https://nacos.io

    github地址:https://github.com/alibaba/nacos

     

    面试题:微服务间远程交互的过程?

    1. 先去注册中心查询服务的服务器地址

    2. 调用方给对方发送http请求

     

    1.1. 什么是 Nacos

    Nacos 是阿里巴巴推出来的一个新开源项目,这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

    Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

    Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

     

    1.2. 为什么是Nacos

    常见的注册中心:

    1. Eureka(原生,2.0遇到性能瓶颈,停止维护)

    2. Zookeeper(支持,专业的独立产品。例如:dubbo)

    3. Consul(原生,GO语言开发)

    4. Nacos

    相对于 Spring Cloud Eureka 来说,Nacos 更强大。

    Nacos = Spring Cloud Eureka + Spring Cloud Config

    Nacos 可以与 Spring, Spring Boot, Spring Cloud 集成,并能代替 Spring Cloud Eureka, Spring Cloud Config。

    • 通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更。

    • 通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery 实现服务的注册与发现。

     

    1.3. 可以干什么

    Nacos是以服务为主要服务对象的中间件,Nacos支持所有主流的服务发现、配置和管理。

    Nacos主要提供以下四大功能:

    1. 服务发现和服务健康监测

    2. 动态配置服务

    3. 动态DNS服务

    4. 服务及其元数据管理

     

    2. Nacos快速开始

     

    Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:

    1. 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
    2. 64 bit JDK 1.8+
    3. Maven 3.2.x+

     

    2.1. 下载及安装

    你可以通过源码和发行包两种方式来获取 Nacos。

    您可以从 最新稳定版本 下载 nacos-server-$version.zip 包。

      unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
      cd nacos/bin

    2.2. 启动nacos服务

    Linux/Unix/Mac

    启动命令(standalone代表着单机模式运行,非集群模式):

    sh startup.sh -m standalone

    服务提供者demo

    pom配置

    <?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	<parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>2.2.10.RELEASE</version>
    		<relativePath/> <!-- lookup parent from repository -->
    	</parent>
    	<groupId>com.tom</groupId>
    	<artifactId>nacon-producer</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	<name>nacon-producer</name>
    	<description>Demo project for Spring Boot</description>
    
    	<properties>
    		<java.version>1.8</java.version>
    	</properties>
    
    	<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.boot</groupId>
    			<artifactId>spring-boot-starter-test</artifactId>
    			<scope>test</scope>
    			<exclusions>
    				<exclusion>
    					<groupId>org.junit.vintage</groupId>
    					<artifactId>junit-vintage-engine</artifactId>
    				</exclusion>
    			</exclusions>
    		</dependency>
    	</dependencies>
    
    	<!-- SpringCloud的依赖 -->
    	<dependencyManagement>
    		<dependencies>
    			<dependency>
    				<groupId>org.springframework.cloud</groupId>
    				<artifactId>spring-cloud-dependencies</artifactId>
    				<version>Hoxton.SR2</version>
    				<type>pom</type>
    				<scope>import</scope>
    			</dependency>
    			<dependency>
    				<groupId>com.alibaba.cloud</groupId>
    				<artifactId>spring-cloud-alibaba-dependencies</artifactId>
    				<version>2.2.1.RELEASE</version>
    				<type>pom</type>
    				<scope>import</scope>
    			</dependency>
    		</dependencies>
    	</dependencyManagement>
    
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.springframework.boot</groupId>
    				<artifactId>spring-boot-maven-plugin</artifactId>
    			</plugin>
    		</plugins>
    	</build>
    
    </project>
    

    注意 springcloud和springboot版本要兼容,不兼容启动会报错

    springcloud版本兼容查询  https://start.spring.io/actuator/info  

    配置如下:

    server.port=8070
    spring.application.name=nacos-provider
    # nacos服务地址
    spring.cloud.nacos.discovery.server-addr=203.195.200.97:8848
    # 自定义参数
    myName=nacos

    通过Spring cloud原生注解 @SpringBootApplication开启服务注册发现功能


    消费者注册

    pom依赖

    <?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	<parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>2.2.10.RELEASE</version>
    		<relativePath/> <!-- lookup parent from repository -->
    	</parent>
    	<groupId>com.tom</groupId>
    	<artifactId>nacos-consume</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	<name>nacos-consume</name>
    	<description>Demo project for Spring Boot</description>
    
    	<properties>
    		<java.version>1.8</java.version>
    	</properties>
    
    	<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>
    
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-test</artifactId>
    			<scope>test</scope>
    			<exclusions>
    				<exclusion>
    					<groupId>org.junit.vintage</groupId>
    					<artifactId>junit-vintage-engine</artifactId>
    				</exclusion>
    			</exclusions>
    		</dependency>
    	</dependencies>
    
    	<!-- SpringCloud的依赖 -->
    	<dependencyManagement>
    		<dependencies>
    			<dependency>
    				<groupId>org.springframework.cloud</groupId>
    				<artifactId>spring-cloud-dependencies</artifactId>
    				<version>Hoxton.SR2</version>
    				<type>pom</type>
    				<scope>import</scope>
    			</dependency>
    			<dependency>
    				<groupId>com.alibaba.cloud</groupId>
    				<artifactId>spring-cloud-alibaba-dependencies</artifactId>
    				<version>2.2.1.RELEASE</version>
    				<type>pom</type>
    				<scope>import</scope>
    			</dependency>
    		</dependencies>
    	</dependencyManagement>
    
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.springframework.boot</groupId>
    				<artifactId>spring-boot-maven-plugin</artifactId>
    			</plugin>
    		</plugins>
    	</build>
    
    </project>
    

    使用Fegin进行接口调用,在消费端使用 @EnableFeignClients注解:

     

    消费端源码

    package com.tom.nacosconsume.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @classname ConsumerController
     * @description
     * @date 2020/12/12 16:49
     * @created by weiwensi
     */
    @RestController
    public class ConsumerController {
    
        @Autowired
        private ProviderFeign providerFeign;
    
        @GetMapping("hi")
        public String hi() {
            return this.providerFeign.hello();
        }
    }
    

    fegin接口

    package com.tom.nacosconsume.controller;
    
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    /**
     * @classname ProviderFeign
     * @description
     * @date 2020/12/12 16:49
     * @created by weiwensi
     */
    @FeignClient("nacos-provider")
    public interface ProviderFeign {
    
        @RequestMapping("hello")
        public String hello();
    }

    properties配置

    
    server.port=18080
    spring.application.name=nacos-consumer
    # nacos服务地址
    spring.cloud.nacos.discovery.server-addr=203.195.200.97:8848

    接口调用结果如下:

    nacos服务中心数据更新了

    好了,成功完成了服务的注册,服务订阅

    展开全文
  • Nacos

    千次阅读 2019-06-24 13:44:03
  • nacos原理

    千次阅读 2020-01-24 09:40:53
    1.什么是Nacos Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 是Spring Cloud A 中的服务注册发现组件,类似于...

    1.什么是Nacos

    Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 是Spring Cloud A 中的服务注册发现组件,类似于Consul、Eureka,同时它又提供了分布式配置中心的功能,这点和Consul的config类似,支持热加载。

    2.Nacos原理

    在这里插入图片描述
    Nacos注册中心分为server与client,server采用Java编写,为client提供注册发现服务与配置服务。而client可以用多语言实现,client与微服务嵌套在一起,nacos提供sdk和openApi,如果没有sdk也可以根据openApi手动写服务注册与发现和配置拉取的逻辑

    在这里插入图片描述
    服务领域模型

    Nacos服务领域模型主要分为命名空间、集群、服务。在下图的分级存储模型可以看到,在服务级别,保存了健康检查开关、元数据、路由机制、保护阈值等设置,而集群保存了健康检查模式、元数据、同步机制等数据,实例保存了该实例的ip、端口、权重、健康检查状态、下线状态、元数据、响应时间。

    在这里插入图片描述

    3.注册中心原理

    在这里插入图片描述
    服务注册方法:以Java nacos client v1.0.1 为例子,服务注册的策略的是每5秒向nacos server发送一次心跳,心跳带上了服务名,服务ip,服务端口等信息。同时 nacos server也会向client 主动发起健康检查,支持tcp/http检查。如果15秒内无心跳且健康检查失败则认为实例不健康,如果30秒内健康检查失败则剔除实例。

    4.配置中心原理

    在这里插入图片描述

    5.Nacos 的关键特性包括:

    • 服务发现和服务健康监测
      Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用
      原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO
      或HTTP&API查找和发现服务。

      Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层
      (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos
      提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos
      还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。

    • 动态配置服务
      动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。

      动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。

      配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。

    Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

    • 动态 DNS 服务 动态 DNS
      服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以
      DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。

      Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表.

    • 服务及其元数据管理 Nacos
      能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的
      SLA 以及最首要的 metrics 统计数据。

    更多的特性列表 …

    6.Spring Cloud Nacos优缺点

    优点: 1)开箱即用,适用于dubbo,spring cloud

            2)AP模型,数据最终一致性
    
            3)注册中心,配置中心二合一,提供控制台管理
    
            4)纯国产,久经双十一考验
    

    缺点: 1)刚刚开源不久,社区热度不够,依然存在bug

            2)0.5.0 注册服务无鉴权认证机制,存在风险
    
    展开全文
  • Alibaba之Nacos详解

    万次阅读 多人点赞 2019-03-29 16:11:36
    原文链接:https://windmt.com/2018/11/09/intro-to-spring-cloud-alibaba-nacos/ 上个月最后一天的凌晨,Spring Cloud Alibaba 正式入驻了 Spring Cloud 官方孵化器,并在 maven 中央库发布了第一个版本。 目前 ...

    本文为转载文章,原文作者:Wind Mt
    原文链接:https://windmt.com/2018/11/09/intro-to-spring-cloud-alibaba-nacos/

    上个月最后一天的凌晨,Spring Cloud Alibaba 正式入驻了 Spring Cloud 官方孵化器,并在 maven 中央库发布了第一个版本。

    目前 Spring Cloud Alibaba 还只能算是预览版吧,里边的坑肯定不少,不过我还是决定试试,看看 Alibaba 到底靠谱不靠谱。

    image

    一、Spring Cloud Alibaba

    目前 Spring Cloud Alibaba 项目还处于 Spring Cloud 官方孵化器中,打开它 Github 的就能看到 “亲切” 的中文文档。

    它目前只有三个组件:

    • Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

    • Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

    • AliCloud OSS: 阿里云对象存储服务(Object Storage Service,简称
      OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。

    看官方路线图上讲后边还会增加:

    • Dubbo:Apache Dubbo™ (incubating) 是一款高性能 Java RPC 框架。

    • RocketMQ:Apache RocketMQ™ 基于 Java 的高性能、高吞吐量的分布式消息和流计算平台。

    • Schedulerx:阿里中间件团队开发的一款分布式任务调度产品,支持周期性的任务与固定时间点触发任务。

    • AliCloud SLS:针对日志类数据的一站式服务,在阿里巴巴集团经历大量大数据场景锤炼而成。您无需开发就能快捷完成日志数据采集、消费、投递以及查询分析等功能,提升运维、运营效率,建立 DT 时代海量日志处理能力。

    从数量上来看,Alibaba 的组件数量和目前 Netflix 的相比少了一多半,但是仔细看看各组件的功能描述,也就明白了。在没真正上手之前,我个人先大胆猜测一下:

    • Nacos = Eureka/Consule + Config + Admin
    • Sentinel = Hystrix + Dashboard + Turbine
    • Dubbo = Ribbon + Feign
    • RocketMQ = RabbitMQ
    • Schedulerx = Quartz
    • AliCloud OSS、AliCloud SLS 这三个应该是独有的
      链路跟踪(Sleuth、Zipkin)不知道会不会在 Sentinel 里
      以上只是猜测,待我从坑里爬出来之后再回来更新。也欢迎大家一起交流探讨~
      这里我就先试试 Nacos。

    二、Nacos

    image

    这是 Nacos 的架构图,可以看到它确实是融合了服务注册发现中心、配置中心、服务管理等功能,和我之前猜想的它是 Eureka/Consule + Config + Admin 的合体差不多。

    另外通过官方文档发现,Nacos 除了可以和 Spring Cloud 集成,还可以和 Spring、SpringBoot 进行集成。

    不过我们只关注于 Spring Cloud,别的就略过了,直接上手吧~

    工程的目录结构如下:

    alibaba
    ├── nacos-config
    │   ├── pom.xml
    │   └── src
    ├── nacos-consumer
    │   ├── pom.xml
    │   └── src
    ├── nacos-provider
    │   ├── pom.xml
    │   └── src
    └── pom.xml
    

    首先引入 Spring Cloud Alibaba 的 BOM

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath/>
    </parent>
    <properties>
        <spring-cloud.version>Finchley.SR2</spring-cloud.version>
        <spring-cloud-alibaba.version>0.2.0.RELEASE</spring-cloud-alibaba.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    

    这里版本号有坑,文档上说和 Spring Boot 2.0.x 版本兼容,但是实测 2.0.6.RELEASE 报错

    java.lang.NoClassDefFoundError: org/springframework/core/env/EnvironmentCapable
    

    三、Nacos Server

    在使用 Nacos 之前,需要先下载 Nacos 并启动 Nacos Server。

    Nacos Server 有两种运行模式:

    • standalone
    • cluster

    不论哪种方式吧,都需要先去 https://github.com/alibaba/nacos/releases 下载最新的 release 包,然后解压,以 nacos-server-0.4.0.zip 为例

    unzip nacos-server-0.4.0.zip
    cd nacos
    

    1、standalone 模式

    此模式一般用于 demo 和测试,不用改任何配置,直接敲以下命令执行

    sh bin/startup.sh -m standalone
    

    Windows 的话就是

    cmd bin/startup.cmd -m standalone
    

    然后从 http://localhost:8848/nacos/index.html 进入控制台就能看到如下界面了

    image

    2、cluster 模式

    集群模式需要依赖 MySQL,然后改两个配置文件:

    conf/cluster.conf
    conf/application.properties
    

    具体怎么改,在这里就先不展开了。我们先用 standalone 模式撸起来,享受 coding 的快感,然后再慢慢转到 cluster 上边。

    四、配置管理

    在 nacos/pom.xml 里添加依赖:

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
    </dependencies>
    

    启动类不用修改:

    @SpringBootApplication
    public class NacosApplication {
        public static void main(String[] args) {
            SpringApplication.run(NacosApplication.class, args);
        }
    }
    

    修改 bootstrap.yml

    spring:
      application:
        name: nacos
      cloud:
        nacos:
          config:
            server-addr: 127.0.0.1:8848
    

    注意:必须是写在 bootstrap.yml 中,配置在 application.yml 中不行,启动报错

    java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.application.name' in value "${spring.application.name}"
    

    至于 bootstrap.yml 和 application.yml 的区别,之前讲过这里就不赘述了。

    添加一个 Endpoint 便于观察

    @RestController
    @RequestMapping("/config")
    @RefreshScope
    public class ConfigController {
    
        @Value("${useLocalCache:false}")
        private boolean useLocalCache;
    
        @RequestMapping("/get")
        public boolean get() {
            return useLocalCache;
        }
    }
    

    注意一定要加@RefreshScope注解

    小心!此处有坑!

    这时候先别急着启动 NacosConfigApplication 的,需要需要通过调用 Nacos Open API 往 Nacos Server 里发布一个配置。dataId 为 nacos.properties,内容为useLocalCache=true

    curl -X "POST" "http://127.0.0.1:8848/nacos/v1/cs/configs" \
         -H 'Content-Type: application/x-www-form-urlencoded; charset=utf-8' \
         --data-urlencode "dataId=nacos.properties" \
         --data-urlencode "group=DEFAULT_GROUP" \
         --data-urlencode "content=useLocalCache=true
    

    dataId 的完整格式如下:

    prefix−prefix−{spring.profile.active}.${file-extension}
    
    • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
    • spring.profile.active 即为当前环境对应的 profile,详情可以参考 Spring >Boot 文档。 注意:当 spring.profile.active 为空时,对应的连接符 - >也将不存在,dataId 的拼接格式变成 prefix.prefix.{file-extension}
    • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

    然后启动 NacosConfigApplication,从启动日志里能看到

    Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='nacos.properties'}]}
    

    如果 propertySources 里边是空的,那抱歉,你掉到坑里边了。 如果你能看到之前发布的 dataId,那恭喜,请求 http://localhost:8080/config/get 就可以看到返回内容 true 了。

    再次调用 Nacos Open API 修改内容为useLocalCache=false

    再次访问 http://localhost:8080/config/get ,此时返回内容为false,说明程序中的useLocalCache值已经被动态更新了。

    当然,以上手动调用 Nacos Open API 的方式也可以通过 Nacos Console 的可视化界面来操作

    image

    另外我们可以查询配置的历史记录并能快速回滚

    image

    还能查询到某个配置当前的被监听状态(这里的分页有些 bug)

    image

    五、数据源

    经过了上边的一些简单操作,我们已经可以正常使用 Nacos 配置中心了。
    但是不知道你有没有想过:配置数据是存在哪里呢?

    我们没有对 Nacos Server 做任何配置,那么数据只有两个位置可以存储:

    • 内存
    • 本地数据库

    如果我们现在重启刚刚在运行的 Nacos Server,会发现刚才加的 nacos.properties 配置还在,说明不是内存存储的。

    这时候我们打开NACOS_PATH/data,会发现里边有个derby-data目录,Derby 是 Java 编写的数据库,属于 Apache 的一个开源项目。我们的配置数据现在就存储在这个库中。

    Derby 我并不是很熟悉,那能不能将数据源改为我们熟悉的 MySQL 呢?当然可以了。

    注意:不支持 MySQL 8.0 版本

    这里我以本地运行的 MySQL 为例:

    创建一个名为nacos_config的 database

    将NACOS_PATH/conf/nacos-mysql.sql中的表结构导入刚才创建的库中,这几张表的用途就自己研究吧

    修改NACOS_PATH/conf/application.properties,加入 MySQL 配置

    db.num=1
    db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
    db.user=root
    db.password=root
    

    创建cluster.conf,填入要运行 Nacos Server 机器的 ip

    192.168.100.155
    192.168.100.156
    

    我就是运行个 demo,没有多余机器来组建集群怎么办呢?

    其实不用虚拟机,直接只填一个本地地址也是可以的(仅限于配置管理,服务发现不行)。

    这里有两个坑:

    Nacos Server 的数据源是用 Derby 还是 MySQL 完全是由其运行模式决定的:

    standalone 的话仅会使用 Derby,即使在 application.properties 里边配置 MySQL 也照样无视;
    cluster 模式会自动使用 MySQL,这时候如果没有 MySQL 的配置,是会报错的。
    官方提供的 cluster.conf 示例如下

    #it is ip
    #example
    10.10.109.214
    11.16.128.34
    11.16.128.36
    

    从习惯来看,这个#号后边的应该就是注释的,但是抱歉哦,必须删掉,否则下面的异常就扑面而来

    Caused by: java.lang.NumberFormatException: For input string: "it is ip:0"
      at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
      at java.lang.Long.parseLong(Long.java:589)
      at java.lang.Long.parseLong(Long.java:631)
      at com.alibaba.nacos.naming.core.DistroMapper.onServerStatusUpdate(DistroMapper.java:125)
      at com.alibaba.nacos.naming.core.DistroMapper.init(DistroMapper.java:100)
      at com.alibaba.nacos.naming.core.DistroMapper.<clinit>(DistroMapper.java:65)
      ... 79 common frames omitted
    

    以上配置结束后,运行 Nacos Server 就能看到效果了。

    除了 MySQL 的数据表发生了变化,我们会发现NACOS_PATH/data下的目录结构也发生了变化,多了config-data/DEFAULT_GROUP/nacos_config这么一个文件,里边的内容就是我们的配置

    useLocalCache=true
    

    这是容错呢?还是缓存呢?只有等看过源码才知道了。

    六、服务发现

    服务注册中心和服务发现的服务端都是由 Nacos Server 来提供的,我们只需要提供 Service 向其注册就好了。

    首先我们先将 Nacos Server 由伪分布式改为 standalone 模式,原因后边再说吧。

    这里模拟提供两个 service:provider 和 consumer

    alibaba
    ├── nacos-provider
    │   ├── pom.xml
    │   └── src
    └── nacos-consumer
    │   ├── pom.xml
    │   └── src
    └── pom.xml
    

    首先在 provider 和 consumer 的 pom 添加依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    

    在两者的 bootstrap.yml 中添加配置

    1、provider

    spring:
      application:
        name: nacos-provider
      cloud:
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848
    server:
      port: 18080
    consumer
    
    spring:
      application:
        name: nacos-consumer
      cloud:
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848
    server:
      port: 18081
    

    使用 Spring Cloud 的原生注解 @EnableDiscoveryClient 开启服务发现

    @SpringBootApplication
    @EnableDiscoveryClient
    public class NacosProviderApplication {
        public static void main(String[] args) {
            SpringApplication.run(NacosProviderApplication.class, args);
        }
    }
    

    提供 Endpoint 以供访问

    
    @RestController
    @RequestMapping("/echo")
    public class EchoController {
    
        @RequestMapping(value = "/{string}", method = RequestMethod.GET)
        public String echo(@PathVariable String string) {
            return "Hello Nacos Discovery " + string;
        }
    }
    

    2、Consumer

    在 NacosConsumerApplication 中集成 RestTemplate 和 Ribbon

    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
      return new RestTemplate();
    }
    

    提供 Controller

    @RestController
    @RequestMapping("/echo")
    public class TestController {
    
        private final RestTemplate restTemplate;
    
        @Autowired
        public TestController(RestTemplate restTemplate) {
            this.restTemplate = restTemplate;
        }
    
        @RequestMapping(value = "/{str}", method = RequestMethod.GET)
        public String echo(@PathVariable String str) {
            return restTemplate.getForObject("http://nacos-provider/echo/" + str, String.class);
        }
    
    }
    

    分别启动 NacosProviderApplication 和 NacosConsumerApplication ,调用 http://localhost:18080/echo/windmthttp://localhost:18081/echo/windmt ,返回内容均为 Hello Nacos Discovery windmt,说明服务发现成功了。

    这时候查看 Nacos Console 也能看到已注册的服务列表及其详情

    image

    image

    现在来讲一下为什么前边要将 Nacos Server 由伪分布式再改为 standalone 模式。

    单个节点的 Nacos Server 伪分布式在配置管理运行的好好的,但是到了服务发现,它就失效了。

    通过 log 可以发现一些端倪,单节点的在选主的时候,无法正确选出 leader

    ==> logs/naming-raft.log <==
    2018-11-13 16:38:56,424 INFO leader timeout, start voting,leader: null, term: 1
    

    从而导致 Client 无法正常注册

    java.lang.IllegalStateException: failed to req API:/nacos/v1/ns/instance after all servers([127.0.0.1:8848]) tried
        at com.alibaba.nacos.client.naming.net.NamingProxy.reqAPI(NamingProxy.java:339) ~[nacos-client-0.3.0.jar:na]
        at com.alibaba.nacos.client.naming.net.NamingProxy.reqAPI(NamingProxy.java:272) ~[nacos-client-0.3.0.jar:na]
        at com.alibaba.nacos.client.naming.net.NamingProxy.registerService(NamingProxy.java:171) ~[nacos-client-0.3.0.jar:na]
        at com.alibaba.nacos.client.naming.NacosNamingService.registerInstance(NacosNamingService.java:161) ~[nacos-client-0.3.0.jar:na]
        ... ...
    

    七、小结

    当今年年初 Dubbo 进入 Apache 孵化器的时候,就有预感阿里要与 Spring Cloud 结缘。只是没想到这么快。

    如今 Spring Cloud Alibaba 已经进入了 Spring Cloud 官方孵化器,相信等不了多久也就能正式发布了。虽然大家在生产环境必然还不会这么快速地接入,但是总归是多了一种选择。

    而 Nacos 作为微服务核心的服务注册与发现中心,让大家在 Eureka 和 Consule 之外有了新的选择,开箱即用,上手简洁,暂时也没发现有太大的坑。但将配置中心融合也融合进来是好是坏,这个我先按下不表。

    总而言之,Spring Cloud Alibaba 的入驻对于 Spring Cloud 生态总归是好的~

    本文示例代码:https://github.com/zhaoyibo/spring-cloud-study/tree/master/alibaba

    参考
    https://github.com/spring-cloud-incubator/spring-cloud-alibaba

    https://github.com/alibaba/Nacos

    https://nacos.io/en-us/docs/quick-start-spring-cloud.html

    原文链接
    https://windmt.com/2018/11/09/intro-to-spring-cloud-alibaba-nacos/

    热门内容:

    1、9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的求职之路!

    2、MySQL中update修改数据与原数据相同会再次执行吗?

    3、还在使用SimpleDateFormat?你的项目崩没?

    4、Tomcat相关面试题,看这篇就够了!保证能让面试官颤抖!

    5、IDEA一定要懂的30个快捷键!

    6、Dubbo面试18问!这些你都会吗?

    7、狗屎一样的代码!快,重构我!

    8、2019年超详细的Spring Boot知识清单

    在这里插入图片描述

    【视频福利】2T免费学习视频,搜索或扫描上述二维码关注微信公众号:Java后端技术(ID: JavaITWork)回复:1024,即可免费获取!内含SSM、Spring全家桶、微服务、MySQL、MyCat、集群、分布式、中间件、Linux、网络、多线程,Jenkins、Nexus、Docker、ELK等等免费学习视频,持续更新!

    展开全文
  • 最近老是收到小伙伴的私信问我能不能帮忙整理出一份JVM相关的面试题出来,说自己在大厂去面试的时候这一块问的是特别多的,每次自己学的时候每次都学不到重点去。这不他来了,一份详细的JVM面试真题给大家整理在下方...
  • 在Spring Cloud中使用Nacos,只需要先下载 Nacos 并启动 Nacos server,Nacos只需要简单的配置就可以完成服务的注册发现。 Nacos除了服务的注册发现之外,还支持动态配置服务。动态配置服务可以让您以中心化、外部化...
  • 在上篇文章中,我们学习了Nacos中是如何灵活运用《简单工厂模式》的。而设计模式在面试过程中也经常会出现。当面试官问到:说说工厂模式是如何实现的?他问的工厂模式指的是什么? 这篇文章属于扩展篇的扩展,我们...
  • ConfigExecutor.executeLongPolling new ClientLongPolling(asyncContext, clientMd5Map, ip, probeRequestSize, timeout, appName, tag));
  • Nacos 基础知识

    千次阅读 2020-03-31 11:01:53
    Nacos简介? 欢迎来到 Nacos 的世界! Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos 帮助您更敏捷和容易地...
  • nacos源码分析

    2021-03-06 21:38:44
    一,nacos核心功能点 服务注册: Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元 数据,比如ip地址、端口等信息。Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个...
  • Alibaba之Nacos

    万次阅读 2019-02-27 14:52:10
    在使用 Nacos 之前,需要先下载 Nacos 并启动 Nacos Server。 Nacos Server 有两种运行模式: standalone cluster 不论哪种方式吧,都需要先去 https://github.com/alibaba/nacos/releases 下载最新的...
  • Nacos原理简介

    2021-05-30 15:47:59
    简单介绍一下Nacos 1.什么是Nacos Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 是Spring Cloud A 中的服务注册...
  • windows下启动nacos

    2021-02-21 14:02:43
    前言 windows启动nacos 文章目录前言显示结果解决 显示结果 解决 cmd startup.cmd -m standalone sh startup.sh -m standalone 来道BAT面试
  • 2021都说工作不好找,也是对开发人员的要求变高。前段时间自己有整理了一些Java后端开发面试常问的高频考点问题做成一份PDF文档(1000道高频题),同时也整理一些图文解析及笔记,今天在...
  • 有一说一,我面试的时候愿意给一个能徒手写 Nacos 的人至少 25k。提示一下某头部公司正在招人。 本文可能会分为上下两部分,因为 Nacos 的干货太多,况且小弟时间有限,如有觉得不够过瘾的地方还望海涵。当然了,我...
  • 阿里Nacos

    千次阅读 2019-08-02 09:43:37
    https://blog.csdn.net/youanyyou/article/details/85774066
  • 这篇文章就带大家来看看Nacos中对Java反射机制的一处实践案例。这篇文章既属于知识点的分析,也属于Nacos设计层面的分析。 Nacos中反射机制实践 先来介绍一下Nacos反射机制使用的背景。 nacos-client项目中,可以...
  • 浅谈Nacos中的CAP

    千次阅读 2020-04-06 01:45:18
    浅谈Nacos中的CAP ...常见的面试题6.结语 1.前言 说起CAP原则,大家都不陌生。只要是个分布式系统,都应该满足。之前写过Zk的CAP,今天来谈谈nacos中是如何实现CAP的。 Zookeeper集群选举机制以及数据同步机...
  • NacosServiceRegistry的实现 服务提供者地址查询 Nacos服务地址动态感知原理 Nacos架构 Provider APP:服务提供者 Consumer APP:服务消费者 Name Server:通过VIP(Virtual IP)或DNS的方式实现Nacos高可用集群的...
  • greenplum+nacos+springboo

    2020-09-24 21:28:08
    公众号「软件老王」,欢迎关注与群里交流! springboot+nacos+greenplum

空空如也

空空如也

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

nacos面试