【学习笔记】Nacos入门

nacos

官网地址:https://nacos.i

1,nacos简介

1.1,nacos简介

image-20230806155636069

​ Nacos是阿里的一个开源产品,它是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案。

1.2,nacos特性

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

  1. 服务发现与服务健康检查

Nacos使服务更容易注册,并通过DNS或HTTP接口发现其他服务,Nacos还提供服务的实时健康检查,以防止向不健康的主机或服务实例发送请求。

  1. 动态配置管理

动态配置服务允许您在所有环境中以集中和动态的方式管理所有服务的配置。Nacos消除了在更新配置时重新部署应用程序,这使配置的更改更加高效和灵活。

  1. 动态DNS服务

Nacos提供基于DNS 协议的服务发现能力,旨在支持异构语言的服务发现,支持将注册在Nacos上的服务以域名的方式暴露端点,让三方应用方便的查阅及发现。

  1. 服务和元数据管理

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

这里的1、3、4说明了服务发现的功能特性。

这里的动态配置管理的特性说明了Naocs的配置管理能力。

1.3,安装nacos(windows版本)

1.3.1.下载安装包

​ 在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码:

GitHub主页:https://github.com/alibaba/nacos

GitHub的Release下载页:https://github.com/alibaba/nacos/releases

如图:

image-20210402161102887

​ 本次安装的windows版本使用nacos-server-1.4.1.zip包。

1.3.2.解压

将上述的包解压到任意非中文目录下,如图:

image-20210402161843337

目录说明:

  • bin:启动脚本
  • conf:配置文件

1.3.3.端口配置

​ Nacos的默认端口是8848,如果你电脑上的其它进程占用了8848端口,请先尝试关闭该进程。

如果无法关闭占用8848端口的进程,也可以进入nacos的conf目录,修改配置文件中的端口:

image-20210402162008280

修改其中的内容:

image-20210402162251093

1.3.4.启动

启动非常简单,进入bin目录,结构如下:

image-20210402162350977

然后执行命令即可:

  • windows命令:

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

    startup.cmd -m standalone
    

执行后的效果如图:

image-20210402162526774

1.3.5.访问

在浏览器输入地址:http://127.0.0.1:8848/nacos即可:

image-20210402162630427

默认的账号和密码都是nacos,进入后:

image-20210402162709515

2,nacos-配置管理

2.1,什么是配置中心

1,什么是配置

​ 应用程序在启动和运行的时候往往需要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期,比如:数据库连接参数、启动参数等。

配置主要有以下几个特点:

  • 配置是独立于程序的只读变量

    • 配置对于程序是只读的,程序通过读取配置来改变自己的行为,但是程序不应该去改变配置
  • 配置伴随应用的整个生命周期

    • 配置贯穿于应用的整个生命周期,应用在启动时通过读取配置来初始化,在运行时根据配置调整行为。比如:启动时需要读取服务的端口号、系统在运行过程中需要读取定时策略执行定时任务等。
  • 配置可以有多种加载方式

    • 常见的有程序内部hard code,配置文件,环境变量,启动参数,基于数据库等
  • 配置需要治理

    • 同一份程序在不同的环境(开发,测试,生产)、不同的集群(如不同的数据中心)经常需要有不同的配置,所以需要有完善的环境、集群配置管理

2,什么是配置中心

​ 配置中心就是一种统一管理各种应用配置的基础服务组件

配置中心的服务流程如下:

  1. 用户在配置中心更新配置
  2. 服务A和服务B及时得到配置更新通知,从配置中心获取配置。

在这里插入图片描述

3,主流配置中心对比

​ 目前市面上用的比较多的配置中心有:Spring Cloud Confifig、Apollo、Nacos和Disconf等。

​ 由于Disconf不再维护,下面主要对比一下Spring Cloud Confifig、Apollo和Nacos。

在这里插入图片描述

2.2,nacos配置入门(spring项目)

1,发布配置

首先在nacos发布配置。
浏览器访问 http://127.0.0.1:8848/nacos ,打开nacos控制台,并点击菜单配置管理->配置列表:
在Nacos添加如下的配置:

Data ID: nacos‐simple‐demo.yaml
Group : DEFAULT_GROUP
配置格式: YAML
配置内容: common:
	config1: something

第一步:点击新增配置

image-20230806161954579

第二步:配置信息

​ nacos‐simple‐demo.yaml

image-20230806162004482

第三步:发布配置

​ 在第二步点击“发布”,如下图,点击确定发布成功。

image-20230806162042471

第四步:查询配置

image-20230806162058803

2,nacos客户端获取配置

​ 我们需要新增一个名为nacos-simple-demo的项目,坐标如下:

<groupId>com.itheima.nacos</groupId>
<artifactId>nacos‐simple‐demo</artifactId>
<version>1.0‐SNAPSHOT</version>

​ 添加group ID 为 com.alibaba.nacos 和 artifact ID 为 nacos-client 的 starter。用于实现项目中使用 Nacos 来实现应用的外部化配置。

<dependency>
	<groupId>com.alibaba.nacos</groupId>
	<artifactId>nacos‐client</artifactId>
	<version>1.1.3</version>
</dependency
(1)pom.xml配置

nacos-simple-demo项目完整的pom.xml配置如下:

<?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">
    <groupId>com.itheima.nacos</groupId>
    <version>1.0‐SNAPSHOT</version>
    <artifactId>nacos‐simple‐demo</artifactId>
    <modelVersion>4.0.0</modelVersion>
    <dependencies>
        <dependency>
        <groupId>com.alibaba.nacos</groupId>
        <artifactId>nacos‐client</artifactId>
        <version>1.1.3</version>
        </dependency>
    </dependencies>
</project>
(2)获取外部配置

新增java执行类,并在执行过程中获取配置信息:

public class SimpleDemoMain {
public static void main(String[] args) throws NacosException {
    //nacos 地址
    String serverAddr = "127.0.0.1:8848";
    //Data Id
    String dataId = "nacos‐simple‐demo.yaml";
    //Group
    String group = "DEFAULT_GROUP";
    Properties properties = new Properties();
    properties.put("serverAddr",serverAddr);
    ConfigService configService = NacosFactory.createConfigService(properties);
    //获取配置,String dataId, String group, long timeoutMs
    String content = configService.getConfig(dataId, group, 5000);
    System.out.println(content);
    }
}

启动SimpleDemoMain,控制台得到以下内容:

common:
	config1: something

说明获取配置成功

2.3,nacos配置管理基础应用

1,nacos配置管理模型

​ 对于Nacos配置管理,通过Namespace、group、Data ID能够定位到一个配置集。

image-20230806162743207

配置集(Data ID)

​ 在系统中,一个配置文件通常就是一个配置集,一个配置集可以包含了系统的各种配置信息,例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。每个配置集都可以定义一个有意义的名称,就是配置集的ID即DataID。

配置项

配置集中包含的一个个配置内容就是配置项。它代表一个具体的可配置的参数与其值域,通常以 key=value 的形式存在。例如我们常配置系统的日志输出级别(

logLevel=INFO|WARN|ERROR) 就是一个配置项。

配置分组(Group)

​ 配置分组是对配置集进行分组,通过一个有意义的字符串(如 Buy 或 Trade )来表示,不同的配置分组下可以有相同的配置集(Data ID)。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:可用于区分不同的项目或应用,例如:学生管理系统的配置集可以定义一个group为STUDENT_GROUP。

命名空间(Namespace)

​ 命名空间(namespace)可用于进行不同环境的配置隔离。例如可以隔离开发环境、测试环境和生产环境,因为它们的配置可能各不相同,或者是隔离不同的用户,不同的开发人员使用同一个nacos管理各自的配置,可通过namespace隔离。不同的命名空间下,可以存在相同名称的配置分组(Group) 或 配置集。

最佳实践

​ 推荐用法,如下图:

image-20230806163010479

Namespace:代表不同环境,如开发、测试、生产环境。

Group:代表某项目,如XX医疗项目、XX电商项目

DataId:每个项目下往往有若干个工程,每个配置集(DataId)是一个工程的主配置文件

配置某配置集的代码:

获取配置集需要指定:

1、nacos服务地址,必须指定

2、namespace,如不指定默认public

3、group,如不指定默认 DEFAULT_GROUP

4、dataId,必须指定

代码如下:

// 初始化配置服务,
String serverAddr = "127.0.0.1:8848";
String namespace = "ee247dde‐d838‐425c‐b371‐029dab26232f"; //开发环境
String group = "DEFAULT_GROUP"; //默认组
String dataId = "nacos‐simple‐demo.yaml";
Properties properties = new Properties();
properties.put("serverAddr", serverAddr);
properties.put("namespace", namespace);
ConfigService configService = NacosFactory.createConfigService(properties);
//获取配置,并输出控制台
String content = configService.getConfig(dataId, group, 5000);
System.out.println(content);

以上代码说明将从地址为127.0.0.1:8848的nacos配置中心获取配置,通过以下信息定位配置集:

namespace:ee247dde-d838-425c-b371-029dab26232f

注意:namespace需要指定id。

group:DEFAULT_GROUP

Data Id:nacos-simple-demo.yaml

2,命名空间管理

namespace隔离设计

​ namespace 的设计是 nacos 基于此做多环境以及多租户(多个用户共同使用nacos)数据(配置和服务)隔离的。

  • 从一个租户(用户)的角度来看,如果有多套不同的环境,那么这个时候可以根据指定的环境来创建不同的namespce,以此来实现多环境的隔离。
  • 从多个租户(用户)的角度来看,每个租户(用户)可能会有自己的 namespace,每个租户(用户)的配置数据以及注册的服务数据都会归属到自己的 namespace 下,以此来实现多租户间的数据隔离。
命名空间管理

​ 前面已经介绍过,命名空间(Namespace)是用于隔离多个环境的(如开发、测试、生产),而每个应用在不同环境的同一个配置(如数据库数据源)的值是不一样的。因此,我们应针对企业项目实际研发流程、环境进行规划。

​ 如某软件公司拥有开发、测试、生产三套环境,那么我们应该针对这三个环境分别建立三个namespace。

image-20230806163511831

​ 建立好所有namespace后,在配置管理服务管理模块下所有页面,都会包含用于切换namespace(环境)的tab按钮,如下图:

image-20230806163530817

注意:如果您在编写程序获取配置集过程中没有感知到这个参数的输入,那么 nacos 统一会使用一个默认的 namespace作为输入,nacos confifig 会使用一个空字符串作为默认的参数来初始化,对应界面上就是public命名空间。

Note:在编写程序获取配置集时,指定的namespace参数一定要填写命名空间****ID,而不是名称

3,配置集导入、导出和克隆

勾选若干配置集,点击 导出选中的配置 ,可获得一个压缩包:

image-20230806163945572

压缩包内,包含了选中配置集所转换的配置文件:

image-20230806164002836

点击右上角的 导入配置 ,可选择导出的压缩包文件,将压缩包内的文件恢复为nacos配置集。

image-20230806164020909

点击左下角 克隆 按钮,将会弹出克隆对话框,此功能可用于将配置迁移到其他Namespace。

image-20230806164112723

4,历史版本

​ Nacos通过提供配置版本管理及其一键回滚能力,帮助用户改错配置的时候能够快速恢复,降低微服务系统在配置管理上的可用性风险。

​ 点击回滚,可以恢复到历史操作

image-20230806164147512

2.4,Nacos配置管理(微服务项目,springboot项目,实际运用)

​ Nacos除了可以做注册中心,同样可以做配置管理来使用。

1.统一配置管理

将配置交给nacos管理的步骤:

  1. 在nacos中添加配置文件
  2. 在微服务中引入nacos的config依赖
  3. 在微服务中添加bootstrap.yml,配置nacos地址、当前环境、服务名称、文件后缀名。这些决定了程序启动时区nacos读取哪个文件

​ 当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。

image-20210714164426792

Nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。

1.1.在nacos中添加配置文件

​ 如何在nacos中管理配置呢?

image-20210714164742924

然后在弹出的表单中,填写配置信息:

image-20210714164856664

注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。

1.2.从微服务拉取配置

​ 微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。

​ 但如果尚未读取application.yml,又如何得知nacos地址呢?

​ 因此spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取,流程如下:

img

1)引入nacos-config依赖

首先,在user-service服务中,引入nacos-config的客户端依赖:

<!--nacos配置管理依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2)添加bootstrap.yaml

然后,在user-service中添加一个bootstrap.yaml文件,内容如下:

​ 添加bootstrap.yaml后,需要将原本的application.yml重复的配置删除(如spring.application.name和spring.cloud.nacos.server-addr)

spring:
  application:
    name: userservice # 服务名称
  profiles:
    active: dev #开发环境,这里是dev 
  cloud:
    nacos:
      server-addr: localhost:8848 # Nacos地址
      config:
        file-extension: yaml # 文件后缀名

​ 这里会根据spring.cloud.nacos.server-addr获取nacos地址,再根据

${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}作为文件id,来读取配置。

本例中,就是去读取userservice-dev.yaml

在这里插入图片描述

3)读取nacos配置

​ 在user-service中的UserController中添加业务逻辑,读取pattern.dateformat配置:

image-20210714170337448

完整代码:

package cn.itcast.user.web;

import cn.itcast.user.pojo.User;
import cn.itcast.user.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @Value("${pattern.dateformat}")
    private String dateformat;
    
    @GetMapping("now")
    public String now(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
    }
    // ...略
}

在页面访问,可以看到效果:

在这里插入图片描述

2.配置热更新

​ 我们最终的目的,是修改nacos中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新

​ 要实现配置热更新,可以使用两种方式:

2.1.方式一

在@Value注入的变量所在类上添加注解@RefreshScope

@RefreshScope

image-20210714171036335

2.2.方式二(推荐使用)

使用@ConfigurationProperties注解代替@Value注解。

在user-service服务中,添加一个类,读取patterrn.dateformat属性:

package cn.itcast.user.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String dateformat;
}

在UserController中使用这个类代替@Value:

image-20210714171316124

完整代码:

package cn.itcast.user.web;

import cn.itcast.user.config.PatternProperties;
import cn.itcast.user.pojo.User;
import cn.itcast.user.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private PatternProperties patternProperties;

    @GetMapping("now")
    public String now(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));
    }

    // 略
}
2.3 总结

nacos配置更改后,微服务可以实现热更新,方式:

  1. 通过@Value注解注入,结合@RefreshScope来刷新
  2. 通过@ConfigurationProperties注入,自动刷新

注意:

  • 不是所有的配置都适合放到配置中心,维护起来比较麻烦
  • 建议将一些关键参数,需要运行时调整的参数放到nacos配置中心,一般都是自定义配置。

3.配置共享

其实微服务启动时,会去nacos读取多个配置文件,例如:

  • [spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml

  • [spring.application.name].yaml,例如:userservice.yaml

[spring.application.name].yaml不包含环境,因此可以被多个环境共享。

下面我们通过案例来测试配置共享

1)添加一个环境共享配置

我们在nacos中添加一个userservice.yaml文件:

image-20210714173233650

2)在user-service中读取共享配置

在user-service服务中,修改PatternProperties类,读取新添加的属性:

image-20210714173324231

在user-service服务中,修改UserController,添加一个方法:

image-20210714173721309

3)运行两个UserApplication,使用不同的profile

修改UserApplication2这个启动项,改变其profile值:

image-20210714173538538

image-20210714173519963

这样,UserApplication(8081)使用的profile是dev,UserApplication2(8082)使用的profile是test。

启动UserApplication和UserApplication2

访问http://localhost:8081/user/prop,结果:

在这里插入图片描述

访问http://localhost:8082/user/prop,结果:

在这里插入图片描述

可以看出来,不管是dev,还是test环境,都读取到了envSharedValue这个属性的值。

4)配置共享的优先级

当nacos、服务本地同时出现相同属性时,优先级有高低之分:

在这里插入图片描述

总结

微服务会从nacos读取的配置文件:

  1. [服务名]-[spring.profile.active].yaml,环境配置
  2. [服务名].yaml,默认配置,多环境共享

读取配置的优先级:

  • [服务名]-[环境].yaml > [服务名].yaml > 本地配置

3,nacos-服务发现

3.1,什么是服务发现

​ 在微服务架构中,整个系统会按职责能力划分为多个服务,通过服务之间协作来实现业务目标。这样在我们的代码中免不了要进行服务间的远程调用,服务的消费方要调用服务的生产方,为了完成一次请求,消费方需要知道服务生产方的网络位置(IP地址和端口号)。

我们的代码可以通过读取配置文件的方式读取服务生产方网络位置,如下:

在这里插入图片描述

看上去很完美,但是,仔细考虑以下,此方案对于微服务应用而言行不通。

首先,微服务可能是部署在云环境的,服务实例的网络位置或许是动态分配的。另外,每一个服务一般会有多个实例来做负载均衡,由于宕机或升级,服务实例网络地址会经常动态改变。再者,每一个服务也可能应对临时访问压力增加新的服务节点。正如下图所示:

image-20230806171903257

基于以上的问题,服务之间如何相互感知?服务如何管理?这就是服务发现的问题了。如下图:

image-20230806170653569

上图中服务实例本身并不记录服务生产方的网络地址,所有服务实例内部都会包含服务发现客户端

(1)在每个服务启动时会向服务发现中心上报自己的网络位置。这样,在服务发现中心内部会形成一个服务注册表服务注册表是服务发现的核心部分,是包含所有服务实例的网络地址的数据库。

(2)服务发现客户端会定期从服务发现中心同步服务注册表 ,并缓存在客户端。

(3)当需要对某服务进行请求时,服务实例通过该注册表,定位目标服务网络地址。若目标服务存在多个网络地址,则使用负载均衡算法从多个服务实例中选择出一个,然后发出请求。

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

3.2,主流服务发现与配置中心对比

​ 目前市面上用的比较多的服务发现中心有:Nacos、Eureka、Consul和Zookeeper。

image-20230806170342772

​ 从上面对比可以了解到,Nacos作为服务发现中心,具备更多的功能支持项,且从长远来看Nacos在以后的版本会支持SpringCLoud+Kubernetes的组合,填补 2 者的鸿沟,在两套体系下可以采用同一套服务发现和配置管理的解决方案,这将大大的简化使用和维护的成本。另外,Nacos 计划实现 Service Mesh,也是未来微服务发展的趋势。

3.3,服务注册到nacos

​ Nacos是SpringCloudAlibaba的组件,而SpringCloudAlibaba也遵循SpringCloud中定义的服务注册、服务发现规范。使用Nacos和使用Eureka对于微服务来说,并没有太大区别。

主要差异在于:

  • 依赖不同
  • 服务地址不同
1)引入依赖

在cloud-demo父工程的pom文件中的<dependencyManagement>中引入SpringCloudAlibaba的依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.2.6.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

然后在user-service和order-service中的pom文件中引入nacos-discovery依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2)配置nacos地址

在user-service和order-service的application.yml中添加nacos地址:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
3)重启

重启微服务后,登录nacos管理页面,可以看到微服务信息:

image-20210713231439607

3.4,服务分级存储模型

一个服务可以有多个实例,例如我们的user-service,可以有:

  • 127.0.0.1:8081
  • 127.0.0.1:8082
  • 127.0.0.1:8083

假如这些实例分布于全国各地的不同机房,例如:

  • 127.0.0.1:8081,在上海机房
  • 127.0.0.1:8082,在上海机房
  • 127.0.0.1:8083,在杭州机房

Nacos就将同一机房内的实例 划分为一个集群

也就是说,user-service是服务,一个服务可以包含多个集群,如杭州、上海,每个集群下可以有多个实例,形成分级模型,如图:

image-20210713232522531

微服务互相访问时,应该尽可能访问同集群实例,因为本地访问速度更快。当本集群内不可用时,才访问其它集群。例如:

image-20210713232658928

杭州机房内的order-service应该优先访问同机房的user-service。

3.4.1.给user-service配置集群

修改user-service的application.yml文件,添加集群配置:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ # 集群名称

重启两个user-service实例后,我们可以在nacos控制台看到下面结果:

image-20210713232916215

我们再次复制一个user-service启动配置,添加属性:

-Dserver.port=8083 -Dspring.cloud.nacos.discovery.cluster-name=SH

配置如图所示:

image-20210713233528982

启动UserApplication3后再次查看nacos控制台:

在这里插入图片描述

3.4.2.同集群优先的负载均衡

​ 默认的ZoneAvoidanceRule并不能实现根据同集群优先来实现负载均衡。

​ 因此Nacos中提供了一个NacosRule的实现,可以优先从同集群中挑选实例。

1)给order-service配置集群信息

修改order-service的application.yml文件,添加集群配置:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ # 集群名称

2)修改负载均衡规则

修改order-service的application.yml文件,修改负载均衡规则:

userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则 

nacosRule负载均衡策略

  1. 优先选择同集群服务实例列表
  2. 本地集群找不到提供者,才去其他集群寻找,并且会报警告
  3. 确定了可用实例列表后,再采用随机负载均衡挑选实例

3.5,权重配置

实际部署中会出现这样的场景:

​ 服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求。

但默认情况下NacosRule是同集群内随机挑选,不会考虑机器的性能问题。,

因此,Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高

在nacos控制台,找到user-service的实例列表,点击编辑,即可修改权重:

image-20210713235133225

在弹出的编辑窗口,修改权重:

image-20210713235235219

注意:如果权重修改为0,则该实例永远不会被访问

3.6,环境隔离

Nacos提供了namespace来实现环境隔离功能。

  • nacos中可以有多个namespace
  • namespace下可以有group、service等
  • 不同namespace之间相互隔离,例如不同namespace的服务互相不可见

image-20210714000101516

3.6.1.创建namespace

默认情况下,所有service、data、group都在同一个namespace,名为public:

image-20210714000414781

我们可以点击页面新增按钮,添加一个namespace:

image-20210714000440143

然后,填写表单:

image-20210714000505928

就能在页面看到一个新的namespace:

image-20210714000522913

3.6.2.给微服务配置namespace

给微服务配置namespace只能通过修改配置来实现。

例如,修改order-service的application.yml文件:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ
        namespace: f8cde788-efc0-4fcf-bbb4-02a1d304b860 # 命名空间,填ID

重启order-service后,访问控制台,可以看到下面的结果:

image-20210714000830703

image-20210714000837140

此时访问order-service,因为namespace不同,会导致找不到userservice,控制台会报错:

image-20210714000941256

3.7.Nacos与Eureka的区别

Nacos的服务实例分为两种l类型:

  • 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。

  • 非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例。

配置一个服务实例为永久实例:

spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false # 设置为非临时实例

Nacos和Eureka整体结构类似,服务注册、服务拉取、心跳等待,但是也存在一些差异:

image-20210714001728017

  • Nacos与eureka的共同点

    • 都支持服务注册和服务拉取
    • 都支持服务提供者心跳方式做健康检测
  • Nacos与Eureka的区别

    • Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
    • 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
    • Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
    • Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式

附:Spring Cloud Nacos discovery Starter配置项信息说明

配置项key默认值说明
服务端地址spring.cloud.nacos.discovery.server-addrNacosServer 启动监听的ip地址和端口
服务名spring.cloud.nacos.discovery.service${spring.application.name}给当前的服务命名
服务分组spring.cloud.nacos.discovery.groupDEFAULT_GROUP设置服务所处的分组
权重spring.cloud.nacos.discovery.weight1取值范围 1 到 100,数值越大,权重越大
网卡名spring.cloud.nacos.discovery.network-interface当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址
注册的ip地址spring.cloud.nacos.discovery.ip优先级最高
注册的端口spring.cloud.nacos.discovery.port-1默认情况下不用配置,会自动探测
命名空间spring.cloud.nacos.discovery.namespace常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
AccessKeyspring.cloud.nacos.discovery.access-key当要上阿里云时,阿里云上面的一个云账号名
SecretKeyspring.cloud.nacos.discovery.secret-key当要上阿里云时,阿里云上面的一个云账号密码
Metadataspring.cloud.nacos.discovery.metadata使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关的元数据信息
日志文件名spring.cloud.nacos.discovery.log-name
集群spring.cloud.nacos.discovery.cluster-nameDEFAULT配置成nacos集群名称
接入点spring.cloud.nacos.discovery.enpointUTF-8地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
是否集成Ribbonribbon.nacos.enabledtrue一般都设置为true即可
是否开启Nacos Watchspring.cloud.nacos.discovery.watch.enabledtrue可以设置成false来关闭watch
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要取得Nacos配置中心中的List类型配置,需要使用Nacos提供的Java SDK,具体步骤如下: 1. 引入Nacos Java SDK的依赖,可以在Maven中添加如下依赖: ```xml <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>${nacos.version}</version> </dependency> ``` 2. 在代码中使用Nacos SDK获取配置,示例代码如下: ```java import com.alibaba.nacos.api.NacosFactory; import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.config.listener.Listener; import com.alibaba.nacos.api.exception.NacosException; import java.util.List; import java.util.Properties; import java.util.concurrent.Executor; public class NacosConfigExample { public static void main(String[] args) throws NacosException { String serverAddr = "localhost:8848"; // Nacos服务地址 String dataId = "example"; // 配置ID String group = "DEFAULT_GROUP"; // 配置分组 Properties properties = new Properties(); properties.put("serverAddr", serverAddr); ConfigService configService = NacosFactory.createConfigService(properties); String content = configService.getConfig(dataId, group, 5000); // 获取配置内容,超时时间为5000ms // 将List类型的配置转换为List对象 List<String> list = Arrays.asList(content.split(",")); // 监听配置变化 configService.addListener(dataId, group, new Listener() { @Override public void receiveConfigInfo(String configInfo) { // 配置变化后的处理逻辑 List<String> list = Arrays.asList(configInfo.split(",")); // ... } @Override public Executor getExecutor() { return null; } }); } } ``` 在获取配置之后,可以将List类型的配置内容转换为List对象进行处理。同时,可以使用addListener方法监听配置的变化,当配置发生变化时,会触发Listener中的回调函数,从而进行相应的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值