• Nacos学习笔记


    Nacos官网

    https://github.com/alibaba/nacos/releases

    https://www.bilibili.com/video/BV1q3411Z79z

    1. Nacos介绍

    Nacos是Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

    在这个介绍中,可以看出Nacos至少有三个核心功能:

    1.动态服务发现
    2.配置管理
    3.服务管理

    2. 下载并启动

    从github下载压缩包并解压

    cmd进入到bin路径下

    # 默认会以集群模式启动,现在先指定以单机模式运行而非集群模式(-m standalone)
    # 弹幕:2.2.0.1后版本启动失败的在配置文件中设置一下默认token
    
    # linux/unix/mac
    sh startup.sh -m standalone
    # 若使用ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:
    bash startup.sh -m standalone
    # windows
    startup.cmd -m standalone
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    启动日志

    在这里插入图片描述

    日志信息可以看到默认情况下占用了8848端口,

    配置文件nacos-server-2.1.1\nacos\conf\application.properties中也可以看到

    server.servlet.contextPath=/nacos
    server.port=8848
    
    • 1
    • 2

    访问localhost:8848/nacos,默认用户名密码nacos/nacos

    3. 配置管理

    3.1 新建配置

    新建配置时可以指定:

    Data ID:相当于一个配置文件,比如相当于application.properties,或者application-
    dev.properties。注意:在某个项目中使用application.properties文件中,那个application表示的就是当前应用,那我们在nacos进行配置时,就要尽可能的取一些有含义的DataID,比如user.properties(表示用户应用的配置),order.properties(表示订单应用的配置),common.properties(表示多个应用共享的配置)

    Group:在nacos中,一个Data ID,即一个或多个配置文件可以归类到同一个Group中,Group的作用就是用来区分Data ID相同的情况,不同的应用或中间件使用了相同的Data ID时就可以通过Group来进行区分,默认为DEFAULT_GROUP

    配置内容:写具体的配置项,可以用properties的格式,也可以用yaml的格式

    3.2 拉取配置

    Java SDK(仅作了解)

    参考官网 Java SDK v1
    参考官网 Java SDK v2

    添加依赖

    <dependency>
        <groupId>com.alibaba.nacosgroupId>
        <artifactId>nacos-clientartifactId>
        <version>2.1.1version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    获取配置

    try {
        // nacos的地址
        String serverAddr = "localhost:8848";
        // 想要获取的配置文件的名字
        String dataId = "user.properties";
        // 分组
        String group = "DEFAULT_GROUP";
    
        Properties properties = new Properties();
        properties.put("serverAddr", serverAddr);
        ConfigService configService = NacosFactory.createConfigService(properties);
        String content = configService.getConfig(dataIld, group, 5000);
        System.out.println(content);
    } catch (NacosException e) {
        e.printStackTrace();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在Java SDK中,除开有获取配置的API,同时也提供了新增、删除、监听配置的API。

    我们可以通过如下代码来监听配置的变化

    try {
        String serverAddr = "localhost:8848";
        String dataId = "user.properties";
        String group = "DEFAULT_GROUP";
    
        Properties properties = new Properties();
        properties.put("serverAddr", serverAddr);
        ConfigService configService = NacosFactory.createConfigService(properties);
        String content = configService.getConfig(dataId, group, 5000);
        System.out.println(content);
    
        configService.addListener(dataId, group, new Listener() {
            public void receiveConfigInfo(String configInfo) {
                System.out.println("recieve1:" + configInfo);
            }
    
            public Executor getExecutor() {
                return null;
            }
        });
    
        // 测试让主线程不退出,因为订阅配置是守护线程,主线程退出守护线程就会退出。正式代码中无需下面代码
        while (true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printstackTrace();
            }
        }
    } catch (NacosException e) {
        e.printStackTrace();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    Spring

    参考官网 Nacos Spring

    添加依赖。最新版本可以在 maven 仓库,如mvnrepository.com中获取。

    <dependency>
        <groupId>com.alibaba.nacosgroupId>
        <artifactId>nacos-spring-contextartifactId>
        <version>1.1.1version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    配置类

    @Configuration
    @EnableNacosConfig(globalProperties = @NacosProperties(serverAddr = "127.0.0.1:8848"))
    @NacosPropertySource(dataId = "test", autoRefreshed = true)
    public class NacosConfig {
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    service类中设置属性值

    // 用@Value也能取到值,
    // 是因为@NacosPropertySource注解会负责把指定的datald的配置项拉取到应用,
    // 并封装为PropertySource对象添加到Environment对象中,所以@Value也能读取到相应的配置项。
    @NacosValue(value = "${useLocalCache:false}", autoRefreshed = true)
    private boolean useLocalCache;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    SpringBoot

    参考官网 Nacos Spring Boot

    添加依赖

    <dependency>
        <groupId>com.alibaba.bootgroupId>
        <artifactId>nacos-config-spring-boot-starterartifactId>
        <version>0.2.12version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    application.properties 中配置 Nacos server 的地址

    nacos.config.server-addr=127.0.0.1:8848
    
    • 1

    加载配置源,并开启自动更新

    // 方式一:在配置类上添加,使用@NacosPropertySource加载dataId为example的配置源,并开启自动更新
    @NacosPropertySource(dataId = "example", autoRefreshed = true)
    
    // 方式二:在application.properties配置文件中添加
    nacos.config.data-id=test
    nacos.config.auto-refresh=true
    nacos.config.bootstrap.enable=true // 此项必须添加,否则启动报错
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    service类中设置属性值

    @NacosValue(value = "${useLocalCache:false}", autoRefreshed = true)
    private boolean useLocalCache;
    
    • 1
    • 2

    SpringCloud

    官网 Nacos Spring Cloud
    版本说明 · alibaba/spring-cloud-alibaba Wiki · GitHub

    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
        <version>2.2.8.RELEASEversion>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    bootstrap.properties 中配置 Nacos server 的地址和应用名

    spring.cloud.nacos.config.server-addr=127.0.0.1:8848
    spring.application.name=example
    
    • 1
    • 2

    通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新

    @RestController
    @RequestMapping("/config")
    @RefreshScope
    public class ConfigController {
    
        @Value("${useLocalCache:false}")
        private boolean useLocalCache;
    
        @RequestMapping("/get")
        public boolean get() {
            return useLocalCache;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3.3 按profile拉取配置

    在使用spring-cloud-starter-alibaba-nacos-config时,我们除开可以配置spring.cloud.nacos.config.server-addr外,还可以配置:

    1. spring.cloud.nacos.config.group:默认为"DEFAULT_GROUP"
    2. spring.cloud.nacos.config.file-extension:默认为"properties"
    3. spring.cloud.nacos.config.prefix:默认为${spring.application.name}

    所以,默认情况下,会拉取"DEFAULT_GROUP"组下dataid为user.properties的配置,不过通过看源码:

    private void loadApplicationConfiguration(
            CompositePropertySource compositePropertySource, String dataIdPrefix,
            NacosConfigProperties properties, Environment environment) {
        //获取文件扩展名
        String fileExtension = properties.getFileExtension();
        //获取group
        String nacosGroup = properties.getGroup();
    
        // load directly once by default
        // 加载nacos的配置
        loadNacosDataIfPresent(compositePropertySource, dataIdPrefix, nacosGroup,
                fileExtension, true);
    
        // load with suffix, which have a higher priority than the default
        // 加载带后缀的配置,优先级高于上一个
        loadNacosDataIfPresent(compositePropertySource,
                dataIdPrefix + DOT + fileExtension, nacosGroup, fileExtension, true);
    
        // Loaded with profile, which have a higher priority than the suffix
        // 加载带profile,文件格式后缀的配置,优先级高于上一个
        for (String profile : environment.getActiveProfiles()) {
            String dataId = dataIdPrefix + SEP1 + profile + DOT + fileExtension;
            loadNacosDataIfPresent(compositePropertySource, dataId, nacosGroup,
                    fileExtension, true);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    可以发现,在拉取配置时会分为三步,且优先级由低到高

    1.拉取dataid为user的配置

    2.拉取dataid为user.properties的配置

    3.拉取dataid为user-${spring.profiles.active}.properties的配置

    还值得注意的是,在拉取配置时,还会加上namespace这个维度取获取配置,可以通过spring.cloud.nacos.config.namespace进行配置。

    我们可以在Nacos管理台:

    1.新建不同的namespace

    2.在每个namespace下可以进行dataid名称相同的配置

    3.每个dataid又可以分配到不同的group下

    相当于一个三层结构

    在这里插入图片描述

    3.4 拉取多个配置

    一个应用可能不止需要一个配置,有时可能需要拉取多个配置,此时可以利用

    # 第一种配置 extension-configs 表示拉取额外的配置文件
    spring.cloud.nacos.config.extension-configs[0].data-id=datasource.properties
    # 或者使用第二种配置 shared-configs 也表示拉取额外的配置文件
    spring.cloud.nacos.config.shared-configs[0].data-id=common.properties
    
    • 1
    • 2
    • 3
    • 4

    extension-configs和shared-configs区别

    1. extension-configs表示本应用特有的
    2. shared-configs表示多个应用共享的

    注意优先级(由高到低):
    extension-configs[2] > extension-configs[1]> extension-configs[0]
    shared-configs[2] > shared-configs[1] > shared-configs[0]
    主配置 > extension-configs > shared-configs

    配置项除了data-id之外还可以指定refresh、file-extension、group

    spring.cloud.nacos.config.shared-configs[0].data-id=common.properties
    spring.cloud.nacos.config.shared-configs[0].refresh=true
    spring.cloud.nacos.config.shared-configs[0].file-extension=properties
    spring.cloud.nacos.config.shared-configs[0].group=DEFAULT_GROUP
    
    • 1
    • 2
    • 3
    • 4

    3.5 配置的自动刷新

    自动刷新配置的意思是,一旦应用中引入的配置发生了变化,应用端也能及时获取到最新值。

    默认情况下,

    extension-configsshared-configs不会自动刷新

    主配置会自动刷新,可以通过spring.cloud.nacos.config.refresh-enabled=false来关闭主配置的自动刷新。

    尽管默认情况下会自动刷新,但是对于通过@Value的使用方式,还需要在该Bean上加上@RefreshScope注解,这样才能动态地修改@Value属性,达到动态更新的最终效果。

    4. 服务管理

    服务管理的核心就是:服务注册、服务发现。

    4.1 Java SDK(仅作了解)

    参考官网 Java SDK v1
    参考官网 Java SDK v2

    服务注册

    可以直接使用Nacos提供的Java SDK进行服务注册

    添加依赖

    <dependency>
        <groupId>com.alibaba.bootgroupId>
        <artifactId>nacos-clientartifactId>
        <version>2.1.1version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    简单服务注册
    // 注册一个服务
    NamingService naming = NamingFactory.createNamingService("localhost:8848");
    // 服务的名字为app1,访问该服务的地址是11.11.11.11:8888
    naming.registerInstance("app1", "11.11.11.11", 8888);
    
    // 执行完上述代码后,不要让停掉,可以加上
    System.in.read();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    页面展示

    运行代码后,可在Nacos管理台看到
    在这里插入图片描述

    注意

    1.一个服务可以属于某一个组,可以在注册时指定group

    2.一个服务下可以有多个实例

    3.一个服务下多个实例可以分为多个虚拟集群

    比如以下代码就注册了一个服务有三个实例,分别属于两个虚拟集群

    NamingService naming = NamingFactory.createNamingService("localhost:8848");
    naming.registerInstance("app1", "11.11.11.10", 8888, "cluster0");
    
    NamingService naming1 = NamingFactory.createNamingService("localhost:8848");
    naming1.registerInstance("app1", "11.11.11.11", 8888, "cluster1");
    
    NamingService naming2 = NamingFactory.createNamingService("localhost:8848");
    naming2.registerInstance("app1", "11.11.11.12", 8888, "cluster2");
    
    System.in.read();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    对应的管理台展示

    在这里插入图片描述
    在这里插入图片描述

    定制化注册服务
    NamingService naming = NamingFactory.createNamingService("localhost:8848");
    
    Instance instance = new Instance();
    instance.setIp("55.55.55.55");
    instance.setPort(9999);
    // 不健康的实例
    instance.setHealthy(false);
    // 设置权重
    instance.setWeight(2.0);
    // 设置元数据
    Map<String, String> instanceMeta = new HashMap<String, String>();
    instanceMeta.put("site", "et2");
    instance.setMetadata(instanceMeta);
    
    naming.registerInstance("app1", instance);
    
    System.in.read();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    页面展示

    在这里插入图片描述

    服务发现

    服务注册之后,服务消费者就可以来使用了

    // 获取某个服务的所有实例信息
    NamingService naming = NamingFactory.createNamingService("localhost:8848");
    System.out.println(naming.getAllInstances("app1"));
    
    // 获取所有健康的实例
    naming.selectInstances("app1", true)
    
    // 直接获取某一个健康的实例(权重随机算法)
    naming.selectOneHealthyInstance("app1")
    
    // 监听服务实例的变化
    NamingService naming = NamingFactory.createNamingService("localhost:8848");
    naming.subscribe("app1", event -> {
        if (event instanceof NamingEvent) {
            System.out.println(((NamingEvent) event).getServiceName());
            System.out.println(((NamingEvent) event).getInstances());
        }
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    4.2 Spring/SpringBoot

    Nacos Spring Boot 快速开始

    引入依赖

    <dependency>
        <groupId>com.alibaba.bootgroupId>
        <artifactId>nacos-discovery-spring-boot-starterartifactId>
        <version>0.2.12version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    服务提供者

    application.yml

    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
        username: xxx
        password: xxx
        context-path: /xxx
        auto-register: true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    启动应用,就能完成服务注册(nacos管理页面【服务列表】能看到)。

    服务消费者

    使用 @NacosInjected 注入 Nacos 的 NamingService 实例

    @Controller
    @RequestMapping("/discovery")
    public class DiscoveryController {
    
        @NacosInjected
        private NamingService namingService;
    
        @GetMapping(value = "/get")
        @ResponseBody
        public List<Instance> get(@RequestParam String serviceName) throws NacosException {
            return namingService.getAllInstances(serviceName);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    调用上述接口http://localhost:8080/discovery/get?serviceName=example,得到返回结果如下

    {
      "ip": "xx.xx.xx.xx",
      "port": 8099,
      "weight": 1,
      "healthy": true,
      "enabled": true,
      "ephemeral": true,
      "clusterName": "DEFAULT",
      "serviceName": "DEFAULT_GROUP@@xxxx",
      "metadata": {
        "preserved.register.source": "SPRING_BOOT"
      },
      "ipDeleteTimeout": 30000,
      "instanceHeartBeatTimeOut": 15000,
      "instanceHeartBeatInterval": 5000
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    4.3 SpringCloud

    添加依赖

    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
        <version>2.2.8.RELEASEversion>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    服务提供者

    application.properties

    server.port=8070
    spring.application.name=service-provider
    spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
    
    • 1
    • 2
    • 3

    启动类上添加@EnableDiscoveryClient开启服务注册

    启动应用,就能完成服务注册(nacos管理页面【服务列表】能看到)

    服务消费者

    application.properties

    server.port=8080
    spring.application.name=service-consumer
    spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
    
    • 1
    • 2
    • 3

    启动类上添加@EnableDiscoveryClient开启服务发现

    定义RestTemplate,使用@LoadBalanced

    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    使用RestTemplate调用服务

    @RestController
    public class ConsumerController {
        @Autowired
        private RestTemplate restTemplate;
        
        @GetMapping(value = "/test")
        public String echo() {
            return restTemplate.getForObject("http://service-provider/test", String.class);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    4.4 高级功能

    4.4.1 临时实例与持久实例

    持久实例:就算服务实例下线了,也不会被删除,永远在线。

    临时实例:不会永远在线,健康检测不通过会被删除(详见下方【健康检查】),默认情况下,注册给nacos的实例都是临时实例。

    # 配置为持久实例,表示实例信息会持久化到磁盘中去
    spring.cloud.nacos.discovery.ephemeral=false
    
    • 1
    • 2

    持久实例使用场景:若消费端在某种情况下想拿到已经下线的实例的实例信息,则可以把实例注册为持久实例。

    4.4.2 健康检查

    参考博客:六、Nacos源码系列:Nacos健康检查

    Nacos作为注册中心不仅提供了服务注册和服务发现的功能,还提供了服务可用性检测的功能。

    主要有两种检测机制

    • 客户端主动上报:主动向Nacos服务端发送心跳,告诉Nacos服务端自己是否还活着。

    • 服务端主动下探:Nacos服务端主动向每个Nacos客户端发起探活。若探活成功,说明客户端还活着,若探活失败,则服务端将会剔除客户端。

    Nacos 1.x

    在Nacos 1.x的版本中

    持久实例:则走的是Raft协议存储。健康检测是服务端主动下探机制

    临时实例:走的是distro协议。健康检测是客户端主动上报机制。客户端每隔5秒主动上报自己的健康状态,即向注册中心发送心跳来维持自身的健康(healthy)状态。若发送心跳的间隔时间超过15秒,Nacos服务端会将该实例标记为亚健康状态,若超过30秒没有发送心跳,那么该服务实例会被从服务列表中剔除。

    Nacos 2.x

    在Nacos 2.x版本以后

    持久实例:与以前一样,还是通过服务端主动下探机制

    临时实例:变成通过长连接来判断实例是否健康。

    长连接:一个连接上可以连续发送多数据包,在连接保持期间,若没有数据包发送,需要双方发链路检测包

    在Nacos 2.x之后,使用Grpc协议代替了http协议,长连接会保持客户端和服务端发送的状态,在源码中ConnectionManager管理所有客户端的长连接。ConnectionManager每3秒检测所有超过20S内没有发生过通讯的客户端,向客户端发起ClientDetectionRequest探测请求,如果客户端在指定时间内成功响应,则检测通过,否则执行unregister方法移除Connection。

    若客户端持续和服务端进行通讯,服务端是不需要主动下探的,只有当客户端没有一直和服务端通信的时候,服务端才会主动下探操作。

    4.4.3 保护阈值

    正常来说消费端只会拿到健康实例,在健康实例占总实例比例比较小的情况下,会导致所有流量都会压到健康实例上,此时仅剩的几个健康实例也会被压垮。

    可以设置保护阈值(0-1的一个比例),若服务的所有实例中,健康实例的比例低于这个值就触发保护。

    一旦触发保护,在服务消费端会拉取到所有实例,无论是否健康。虽然部分消费端会因为访问到不健康的实例而请求失败,但也有一部分请求能访问到健康实例。这样达到了保护仅剩的健康实例的作用。

    在SpringCloud Tencent中,这个功能叫“全死全活”。

    4.4.4 权重

    一个服务的多个实例,可能对应的机器配置不同,所以可以给不同的实例设置不同的权重

    在这里插入图片描述

    给8070这个实例设置权重为2,它的权重就是8071的两倍,就应该要承受2倍的流量。

    但消费一个服务时,通常是通过ribbon进行负载均衡的,使用的是ribbon自己的负载均衡策略,因此默认情况下nacos配置的权重是起不到作用的。若想用到nacos中所配置的权重,需编写:

    @Bean
    public IRule ribbonRule() {
        return new NacosRule();
    }
    
    • 1
    • 2
    • 3
    • 4

    4.4.5 Cluster(就近访问)

    一个服务下会有多个实例,在nacos中,可以将这些实例指定到不同的集群中

    # 指定当前实例属于哪个集群
    spring.cloud.nacos.discovery.cluster-name=bj
    
    • 1
    • 2

    页面

    在这里插入图片描述

    hz集群只有一个8070的实例,bj集群有8071、8072两个实例。

    此时在服务消费端,也可以指定要使用的集群。

    若消费端没有配置cluster-name,则会使用所有集群。

    # 使得服务调用者也在bj集群,此时服务消费者就只会调用到bj集群中的两个实例
    spring.cloud.nacos.discovery.cluster-name=bj
    
    • 1
    • 2

    4.4.6 集群部署

    在前面,我们都是使用的单机模式部署的nacos服务端的,为保证nacos的高可用,即保证配置中心和注册中心的高可用,通常需要以集群的方式来部署nacos server。

    conf/cluster配置节点

    首先,修改conf/cluster文件,把nacos集群中所有的节点的ip和port配置进去:

    192.168.65.46:8848
    192.168.65.46:8858
    192.168.65.46:8868
    
    • 1
    • 2
    • 3

    此处是在同一个机器上搭建三个节点,所以ip相同。通常是多个机器上搭建,ip不同。

    每个几点的cluster文件都要配置,表示每个nacos节点都得知道自己所在集群的节点情况。

    如果不以默认的8848端口启动,需修改application.properties中的server.port

    配置数据源并启动
    使用内置数据源

    启动

    # 分别在三个节点的bin路径下运行,使用内置数据源
    startup.cmd -p embedded
    
    • 1
    • 2

    启动成功

    在这里插入图片描述

    通过以下三个路径访问nacos管理台,效果一样。

    http://localhost:8848/nacos
    http://localhost:8848/nacos
    http://localhost:8848/nacos

    在这里插入图片描述

    使用mysql

    mysql中新建数据库nacos_config

    执行脚本文件naco\conf\nacos-mysql,自动创建相关的表。

    只有配置中心的配置信息才会存到mysql中,不会存注册中心的服务信息。

    修改application.properties中关于datasource的部分,三个节点都要改,且连的是同一个数据库。

    ### If use MySQL as datasource:
    spring.datasource.platform=mysql
    ### Count of DB:
    db.num=1
    ### Connect URL of DB:
    db.url.0=jdbc:mysql://127.0.0.1:3306/nacos2?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
    db.user.0=xxx
    db.password.0=xxx
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    配置好后,可以直接使用startup.cmd启动。

    客户端配置
    spring.cloud.nacos.discovery.server-addr=192.168.65.46:8848, 192.168.65.46:8858, 192.168.65.46:8858
    
    • 1

    这样其中某个节点就算挂掉了,应用也能从其他节点获取信息。

    但是,在应用上指定多个ip地址,若ip地址发生变化,就得修改,所以可以在nacos集群之上在搭一个nginx。

    nginx

    先下载一个nginx,然后按照如下步骤修改conf/nginx配置文件

    添加upstream

    upstream nacos-cluster {
        server 192.168.65.46:8848;
        server 192.168.65.46:8858;
        server 192.168.65.46:8868;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    添加location

    location /nacos {
        proxy_pass http://nacos-cluster;
    }
    
    • 1
    • 2
    • 3

    启动nginx后,访问http://localhost/nacos就可以进去nacos管理台

    客户端服务只需按如下配置即可进行服务注册与发现。

    spring.cloud.nacos.discovery.server-addr=localhost:80/nacos
    
    • 1
  • 相关阅读:
    【星海随笔】git的使用
    mysql数据库重启、登录mysql数据库、通过命令执行mysql的sql脚本等命令
    【云原生】SpringCloud-Spring Boot Starter使用测试
    微服务 - 作业调度 · Hangfire集成式 · 仪表盘 · DolphinScheduler分布式 · 定义流程
    程序员基础能力系列(2)——vscode快捷键总结
    PostgreSQL10数据库源码安装
    操作系统引论(一)
    如何学习Arduino单片机
    软件测试进阶篇----Python
    5种常用的冲突解决方法
  • 原文地址:https://blog.csdn.net/Shinka_YXS/article/details/136747177