目录
一、nacos是什么
二、windows下安装配置nacos
1、准备
2、安装nacos
3、配置nacos
4、启动并且访问nacos
三、springcloud使用nacos作为配置中心
四、springcloud使用nacos进行服务注册与发现
五、springcloud使用nacos进行服务消费
六、nacos的一些高级配置
1.临时实例和持久实例
2.保护阈值
3.NacosRule
4.Cluster就近访问
5.订阅者列表
七、nacos使用中遇到的一些报错以及解决方法
1.没有配置dataId
2.不可以使用进行服务使用
来都来了点个赞收藏一下再走呗~~~🌹🌹🌹🌹🌹
一、nacos是什么
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
nacos主要功能:
- 服务发现:Nacos 支持服务的注册与发现,服务实例可以动态地加入或退出集群,服务消费者可以通过Nacos服务发现机制快速地获取到服务提供者的访问地址。
- 配置管理:Nacos 提供统一的配置管理平台,支持配置的统一管理、统一推送、统一生效等功能。
- 服务健康监测:Nacos 提供服务健康监测功能,可以实时监测服务实例的健康状况,及时发现并处理服务故障。
- 动态服务路由:Nacos 支持动态服务路由,可以根据服务实例的负载情况动态地调整服务路由策略,提高系统的可用性和扩展性。
- 高可用性:Nacos 支持集群模式部署,通过集群节点之间的数据同步和故障转移机制,保证服务的高可用性。
二、windows下安装配置nacos
1、准备
1.JDK环境
2.Mysql环境
3.Maven环境
2、安装nacos
nacos官网地址:https://github.com/alibaba/nacos/releases
当然nacos是在git上的可能会下载有点慢这个地方我也给出nacos的百度网盘下载链接: https://pan.baidu.com/s/1PYKdPX5P2E3WbOFYADl_gQ?pwd=t6uz 提取码: t6uz
解压nacos-2.2.3.rar文件到你自己的环境目录下,如下所示:
3、配置nacos
1、配置数据库
①、创建数据库:create database nacos_config character set utf8mb4 collate utf8mb4_general_ci;
②、导入数据:参见nacos根目录\conf\mysql-schema.sql文件,在nacos_config数据库下执行此sql文件
2、配置nacos
编辑“nacos根目录\conf\application.properties”—>打开文件—>将下面配置放到application.properties文件末尾—>保存并关闭该文件
#***********************************MySql*************************************
spring.datasource.platform=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
4、启动并且访问nacos
启动Dos窗口,执行如下命令:
cd nacos根目录\bin
startup.cmd -m standalone
说明: Nacos 默认以集群模式启动。
访问nacos
启动浏览器—>访问http://localhost:8848/nacos/,如下所示:
三、springcloud使用nacos作为配置中心
首先在nacos中先新增一条配置:
新建配置,新建完点击发布:
一些概念的定义:
dataId
定义:
dataId
是配置项的唯一标识符。作用:在 Nacos 中,每个配置项都有一个唯一的
dataId
,它用于区分不同的配置项。dataId
通常由应用名、配置项名和配置的扩展名组成,例如:myapp.properties
。使用场景:
在服务发现中,
dataId
可以用于唯一标识一个服务实例。在配置管理中,
dataId
用于检索和更新配置项。group
定义:
group
是配置项的分组标识符。作用:
group
用于将相关的配置项组织在一起,方便管理和检索。不同的group
可以包含不同的配置项,从而实现逻辑上的分组。使用场景:
在服务发现中,
group
可以用于区分不同服务的实例,例如,可以将一个应用的不同服务实例放在不同的group
中。在配置管理中,
group
可以用于将相关的配置项组织在一起,便于管理和检索。命名空间
定义:命名空间是 Nacos 中的一个逻辑隔离环境,用于区分不同的环境或应用。
作用:命名空间允许用户在同一个 Nacos 集群中管理多个不同的环境或应用的配置和服务发现信息,而不会相互干扰。
springcloud使用nacos配置,pom.xml文件引入依赖,引入spring-cloud-starter-bootstrap的原因是springboot项目启动不会默认加载bootstrap文件。
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>2.2.8.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId><version>3.0.3</version>
</dependency>
bootstrap.properties文件
#nacos服务器地址
spring.cloud.nacos.server-addr=127.0.0.1:8848
#对应去找那个nacos的dataId
spring.application.name=test
controller层,获取配置并且显示
package com.example.demo.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;
import java.util.List;@RefreshScope
@RestController
public class testController {@Value("${spring.username}")private String username;@GetMapping("test")public String test(){return username;}}
注解说明 :
@RefreshScope 此注解配置的目的是让nacos的配置可以自动刷新
@Value("${spring.username}") 此注解的目的,大家应该都知道就是做配置获取值的
测试:启动springboot项目---》在浏览器中访问localhost:8080/test ,我们可以得到结果如下图所示:
并且你可以在nacos中更新配置看看自动属性配置是否生效,这个地方我就不演示了,可以自己去尝试一下。
四、springcloud使用nacos进行服务注册与发现
第一步:需要在 pom.xml 文件中引入 group ID 为 com.alibaba.cloud 和 artifact ID 为 spring-cloud-starter-alibaba-nacos-discovery 的 starter:
<!--服务注册-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2.2.8.RELEASE</version
</dependency>
第二步:添加应用配置:在应用的 /src/main/resources/application.properties 配置文件中配置 Nacos Server 地址(当然如果你做了配置中心的话这个地方就可以不用在加了):
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
第三步:使用 @EnableDiscoveryClient 注解开启服务注册与发现功能:
@SpringBootApplication
@EnableDiscoveryClient
public class Demo4Application {public static void main(String[] args) {SpringApplication.run(Demo4Application.class, args);}}
第四步:启动服务并且在nacos可视化界面验证,服务是否注册成功,这个地方的服务名也就是在bootstrap.propertes中设置的spring.application.name=test。
至此我们就学会了最简单的服务注册功能了。
五、springcloud使用nacos进行服务消费
第一步:新建一个springboot项目作为consumer消费者,并且引入pom.xml文件依赖如下:
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>2.2.8.RELEASE</version></dependency><!--服务注册--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2.2.8.RELEASE</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId><version>3.0.3</version></dependency>
第二步:编写bootstrap.properties文件,文件内容也就是把consumer注册到nacos服务端中,如下所示 :
# 应用服务 WEB 访问端口
server.port=7070spring.cloud.nacos.server-addr=127.0.0.1:8848
spring.application.name=consumer
spring.cloud.loadbalancer.nacos.enabled=true
第三步:引入RestTemplate,并且注入到springboot的bean中,代码如下所示:
package com.ltx.nacosconsumer.demos.config;import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;@Component
public class RestTemplateConfig {@Bean@LoadBalanced //负载均衡public RestTemplate restTemplate() {return new RestTemplate();}
}
第四步:编写controller并且调用provider中的方法
package com.ltx.nacosconsumer.demos.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;@RestController
public class ConsumerController {@Autowiredprivate RestTemplate restTemplate;@GetMapping(value = "/test")public String test() {return restTemplate.getForObject("http://provider/t", String.class);}
}
注意的是我们provider也就是我最先编写的那个test把spring.application.name=provider,改名得到的 ,改名了之后记得把配置中心里面的dataId也要改一下,并且在provider中的controller如下所示;
package com.example.demo.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RefreshScope
@RestController
public class testController {@Value("${spring.username}")private String username;@GetMapping("/t")public String t(){return "恭喜您测试成功啦!";}
}
第五步:浏览器测试访问,localhost:7070/test ,结果如下所示:
六、nacos的一些高级配置
1.临时实例和持久实例
其实实际上的持久实例和临时实例就差了一个注解只需要实现下面的注解就可以变成持久实例了
spring.cloud.nacos.discovery.ephemeral=false
因为之前的provider是临时实例所以我们直接加上注解就会报错
解决此问题我们需要去删掉nacos中的文件,\nacos\data\protocol\raft\naming_instance_metadata 下的文件全部删掉就可以了(在执行删除文件的操作之前需要把nacos的服务停止)
重新启动nacos,并且把刚刚配置的持久实例启动起来。我们可以发现这个时候服务就变成持久实例了。如图所示:
当然这个时候我们也可以停掉刚刚的持久实例我们就可以知道为什么是叫做持久实例了
因为是持久实例所以不会在我们听到此服务的时候就直接的删除实例
临时实例和持久化实例的区别
临时实例与持久化实例的区别主要体现在服务器对该实例的处理上。
临时实例向Nacos注册,Nacos不会对其进行持久化存储,只能通过心跳方式保活。默认模式是:客户端心跳上报Nacos实例健康状态,默认间隔5秒,Nacos在15秒内未收到该实例的心跳,则会设置为不健康状态,超过30秒则将实例删除。
持久化实例向Nacos注册,Nacos会对其进行持久化处理。当该实例不存在时,Nacos只会将其健康状态设置为不健康,但并不会对将其从服务端删除。
2.保护阈值
保护阈值的主要作用是防止健康实例因负载过高而被压垮。通过设置保护阈值,即使部分实例不健康,也可以将流量分散到所有实例中,从而避免健康实例因负载过高而崩溃
我举一个例子来说就是,如果我本来我这个服务上注册了100个实例,而且我设置的保护阈值是0.2,当我机器挂掉80台的时候就会触发保护阈值,这个时候当用户访问的时候,也是会从这100个实例中去访问采用随机或者权重的方式访问这些实例,虽然有些访问到80个挂了的机器上的实例时,不会得到结果,但是可以保证20个实例不会因为过高的并发而导致挂掉整个系统完全不可以用的情况发生。
保护阈值配置如下所示:
3.NacosRule
在 Nacos 中,NacosRule
是一个用于定义服务路由规则的类。它主要用于实现服务的智能路由,包括流量控制、权重分配、服务保护等功能。
4.Cluster就近访问
在 Nacos 中,Cluster(集群)就近访问是一种服务发现和路由策略,旨在优化服务调用的性能和响应时间。通过将请求路由到距离客户端最近的服务实例,可以减少网络延迟,提高响应速度。
只需要在服务注册的时候加上配置就好了,但是在服务器要使用的时候也需要加上配置就可以指定近距离的先使用。
spring.cloud.nacos.config.cluster-name=bj
5.订阅者列表
通过订阅者列表查询我们可以简单的就知道有哪些ip地址的人访问过ip地址了
七、nacos使用中遇到的一些报错以及解决方法
1.没有配置dataId
报错如下所示
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.testController': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.username' in value "${spring.username}"
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:405) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1425) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE]
此报错是因为找不到配置,因为没有正确的配置dataId就不知道去找哪个配置,所以就会出现找不到 spring.username,所以我们在需要使用到nacos作为配置中的时候一定要注意配置dataId
2.不可以使用进行服务使用
因为可能在高版本的nacos中springcloud并没有很好的兼容,就会出现一个情况你并不可以直接使用@LoadBalanced这个注解进负载均衡的配置,就会导致你可以使用RestTemplate中的方法,但是不可以使用服务名进行动态的帮你负载均衡,比如我之前使用到的2021.0.5版本的就用不了。
解决方法:降低或者重新选择版本进行尝试。