1、认识Nacos

Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。
在这里插入图片描述

2、安装

参照官网:https://nacos.io/zh-cn/docs/quick-start.html

0.版本选择

您可以在Nacos的release notes博客中找到每个版本支持的功能的介绍,当前推荐的稳定版本为2.0.3。

1.预备环境准备

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.下载源码或者安装包

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

从 Github 上下载源码方式

git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U  
ls -al distribution/target/

// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin

下载编译后压缩包方式

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

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

3.启动服务器

Linux/Unix/Mac

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

sh startup.sh -m standalone

如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:

bash startup.sh -m standalone

Windows

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

startup.cmd -m standalone

4.服务注册&发现和配置管理

服务注册

curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'

服务发现

curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'

发布配置

curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"

获取配置

curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"

5.关闭服务器

Linux/Unix/Mac

sh shutdown.sh

Windows

shutdown.cmd

或者双击shutdown.cmd运行文件。

效果:

登录账号密码默认都是nacos
在这里插入图片描述

3、服务注册发现

3.1 添加SpringCloudAlibaba依赖管理

最外层pom文件

<!--            nacos依赖关系-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.2.7.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

3.2 引入服务发现jar包

在user-service和order-service去除eureka,添加nacos

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

3.3 配置

去除eureka配置,添加nacos配置

spring:
  cloud:
    nacos:
      server-addr: 192.168.0.105:8848

3.4 启动项目

在这里插入图片描述

4、服务多级存储模型

在这里插入图片描述

nacos会将服务划分层级,第一级是组、二级是服务、第三级是集群、第四级是实例。

比如通过一个服务划分为不同的组,每个组下的服务可以按地区划分为不同的集群。这样,nacos会优先调用相同组下相同集群的服务。
在这里插入图片描述

4.2 配置集群

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

在这里插入图片描述

userservice下有2个集群,分别是sh和BJ

4.3 验证

orderservice也配置为sh集群。

设置负载均衡策略:

userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

然后验证,所有的请求都打到了相同的集群下。

5、Nacos负载均衡规则

同样的使用的是Ribbon的规则,不过Nacos实现了自己的类。继承自AbstractLoadBalancerRule

主要方法如下:

	@Override
	public Server choose(Object key) {
		try {
			String clusterName = this.nacosDiscoveryProperties.getClusterName();
			String group = this.nacosDiscoveryProperties.getGroup();
			DynamicServerListLoadBalancer loadBalancer = (DynamicServerListLoadBalancer) getLoadBalancer();
			String name = loadBalancer.getName();

			NamingService namingService = nacosServiceManager
					.getNamingService(nacosDiscoveryProperties.getNacosProperties());
			List<Instance> instances = namingService.selectInstances(name, group, true);
			if (CollectionUtils.isEmpty(instances)) {
				LOGGER.warn("no instance in service {}", name);
				return null;
			}

			List<Instance> instancesToChoose = instances;
			if (StringUtils.isNotBlank(clusterName)) {
				List<Instance> sameClusterInstances = instances.stream()
						.filter(instance -> Objects.equals(clusterName,
								instance.getClusterName()))
						.collect(Collectors.toList());
				if (!CollectionUtils.isEmpty(sameClusterInstances)) {
					instancesToChoose = sameClusterInstances;
				}
				else {
					LOGGER.warn(
							"A cross-cluster call occurs,name = {}, clusterName = {}, instance = {}",
							name, clusterName, instances);
				}
			}

			Instance instance = ExtendBalancer.getHostByRandomWeight2(instancesToChoose);

			return new NacosServer(instance);
		}
		catch (Exception e) {
			LOGGER.warn("NacosRule error", e);
			return null;
		}
	}

1、可以看出,nacos会先找到同组下的实例

2、如果没有同组的服务,那么就返回null

2、有同组的服务,然后在同组下实例中选择相同cluster的实例。

3、如果没有相同cluster的服务,那么就用同组下的随机返回一个

4、有同cluster的服务,就用相同cluster的机器中随机返回一个。

6、Nacos使用权重负载均衡

服务启动后,在详情中点击编辑,修改权重。

截屏2022-04-04 下午2.00.01

比如,8081端口的权重修改为10,其他两个修改为1, 那么启动后被访问的概率就是10:1:1
在这里插入图片描述

总结

Nacos控制台可以设置实例的权重值,权重越高被访问的频率越高,权重设置为0则完全不会被访问。

7、Nacos环境隔离

Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离。

比我我们生产环境,开发环境,测试环境,为了防止互相访问,需要做环境隔离。

在这里插入图片描述

7.1 新建namespace

新建dev表示开发环境。

截屏2022-04-04 下午2.44.57

7.2 修改项目的namespace

  cloud:
    nacos:
      server-addr: 192.168.0.105:8848
      discovery:
        cluster-name: sh
        namespace: 8924617a-1794-4b76-9e56-120e1a7c05dc #dev

7.3 启动服务

全部到了dev环境下。

截屏2022-04-04 下午2.50.35

7.3 总结:

每个namespace都有唯一id,服务设置namespace时要写id而不是名称,不同namespace下的服务互相不可见。

8、Nacos注册中心

截屏2022-04-04 下午2.53.42

消费者

nacos服务消费者不是每次请求都会去注册中心拉取服务列表,会定时30s拉取一次,然后缓存到本地。

服务提供者列表发生变更还会有主动推送。

提供者

服务提供者会划分为临时实例和非临时实例,默认是临时实例

临时实例会采用心跳检测30s,不可访问则会主动剔除。

非临时实例naocs注册中心会主动询问,不可访问也不会主动剔除。

通过ephemeral来设置

  cloud:
    nacos:
      server-addr: 192.168.0.105:8848
      discovery:
        cluster-name: sh #集群名称
        namespace: 8924617a-1794-4b76-9e56-120e1a7c05dc
        ephemeral: false #true 临时  false 非临时

9、Nacos和Eureka比较

共同点:

1、都支持服务注册和服务拉取

2、都支持服务提供者心跳方式做健康检测

不同点:

1、Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式

2、临时实例心跳不正常会被剔除,非临时实例则不会被剔除

3、Nacos支持服务列表变更的消息推送模式,服务列表更新更及时

4、Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐