Nacos 基础知识(安装配置 Nacos)

文章正文
发布时间:2025-05-11 19:22

概念 :Nacos 是一个注册中心,也是一个配置中心。

作为注册中心:每个微服务上线都会在注册中心登记,在注册中心 Nacos 上会提供一张所有微服务的列表清单,你可以看到所有上线的微服务的名称和端口号。一个微服务通过注册中心可以查询另一个微服务的端口号和微服务名称进行 RPC 模式(Remote Procedure Call)的远程调用另一个微服务的功能。

作为配置中心:可以统一管理和配置所有微服务的配置文件,还可以实时的自动刷新配置。

在spring-cloud项目中的配置: 第一、在pom.xml文件中导入相关依赖 <!-- 服务发现--> <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>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> 第二、Nacos安装:官网地址:

Nacos 快速开始 | Nacos 官网

https://nacos.io/docs/next/quickstart/quick-start/这里推荐不要下载最新版本的,要和springboot和springcloud版本适配,这里推荐尚硅谷课程配套版本如下:

下载完成后,解压到一个非中文不带空格的目录下,打开\bin文件 ,输入cmd,然后命令行中输入:startup.cmd -m standalone

 然后在浏览器中输入:localhost:8848/nacos/ 就可以打开注册中心了

 第三、在微服务application.properties文件中配置Nacos注册中心的地址,还有自己的微服务名称和端口号: #微服务名称 spring.application.name=service-order #微服务端口号 server.port=8000 #注册中心Nacos的地址 spring.cloud.nacos.server-addr=127.0.0.1:8848  最后启动微服务项目,就可以在Nacos注册中心中看到上线的微服务了

知识点1:服务发现功能 

开启了服务发现功能我们才能发现其他微服务的主机地址和端口号,才能远程调用其他微服务的功能。 

这需要我们在每个微服务的启动类上添加注解@EnableDiscoveryClient //开启服务发现功能

知识点二:那一个微服务如何远程调用另一个微服务呢? 方法一:调用springcloud自带的

API:DiscoveryClient,通过getInstances方法获取另一个微服务的实例名称,获取其所有的实例,然后取第一个实例作为调用的对象,最后通过获取该实例对象的主机地址和端口号来拼接成一个url地址。

用API Resttemplate,访问该url地址进行远程调用另一个微服务。

@Autowired DiscoveryClient discoveryClient; @Autowired RestTemplate restTemplate; private Product getProductFromRemote(Long productId){ //1、获取到商品服务所在的所有机器Ip+Port List<ServiceInstance> instances = discoveryClient.getInstances("service-product"); ServiceInstance serviceInstance = instances.get(0); //拼接成url地址 String url = ""+serviceInstance.getHost() + ":"+serviceInstance.getPort() +"/product/"+productId; log.info("远程请求:{}",url); //给远程发送请求 Product product = restTemplate.getForObject(url,Product.class); return product; }  方法二:增加负载均衡的远程调用另一个微服务

首先第一步要pom.xml文件导入依赖

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>

第二步要调用相关的API:LoadBalancerClient

 通过loadBalancerClient调用choose方法,获取微服务的实例,最后也是拼接成url地址进行访问。

//完成具有负载均衡发送请求的优化 @Autowired LoadBalancerClient loadBalancerClient; private Product getProductFromRemoteWithLoadBalance(Long productId){ //1、获取到商品服务所在的所有机器Ip+Port ServiceInstance choose = loadBalancerClient.choose("service-product"); //拼接成url地址 String url = ""+choose.getHost() + ":"+choose.getPort() +"/product/"+productId; log.info("远程请求:{}",url); //给远程发送请求 Product product = restTemplate.getForObject(url,Product.class); return product; } 方法三:优化负载均衡方法,通过注解的方式进行,只要把该注解标到远程调用Resttemplate方法上就能自行进行远程调用。  @Configuration public class OrderServiceConfig { @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } } //版本3、基于注解的负载均衡 private Product getProductFromRemoteWithLoadBalanceAnnotation(Long productId){ String url =""+productId; log.info("远程请求:{}",url); //给远程发送请求 service-product会被动态替换成对应的ip地址 Product product = restTemplate.getForObject(url,Product.class); return product; }

它这里用到的负载均衡算法是依次访问不同的微服务 (具有需要调用的功能)

 经典面试题:注册中心宕机了,远程调用还能成功吗?

RestTemplate具有一个实例缓存,请求过注册中心会获取其中微服务的访问地址列表,并会和注册中心进行同步和实时更新。

分两种情况:

第一种,之前调用过远程调用,那么其可以通过访问实例缓存中的地址列表进行远程调用,所以还是有可能成功。

第二种,没调用过,那就没有实例缓存,所以无地址可以访问,远程调用失败。

配置中心 

 第一,在pom.xml文件中引入依赖 <!-- 配置中心--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> 第二,在application.properties文件中导入注册中心的主机地址和端口号,导入配置中心的数据集  spring.cloud.nacos.server-addr=127.0.0.1:8848 spring.config.import=nacos:service-order.properties  第三,如果你要实时自动刷新你在配置中心的配置文件,你要在引入配置的地方加上@RefreshScope注解,下面是例子。orderTimout和orderAutoConfirm就是我引入的配置中心的配置项。 @RefreshScope//自动刷新配置中心内容 @RestController public class OrderController { @Value("${order.timeout}") String orderTimout; @Value("${order.auto-confirm}") String orderAutoConfirm;  第四,下面是在Nacos配置中心随便配的配置信息:

第五,如果你的微服务在pom.xml文件导入了配置信息的依赖,如 <!-- 配置中心--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>

但是你暂时没有用到配置中心配置信息,可以在application.properties文件中配置禁用导入检查这样,代码运行就不会报错了 

#禁用导入检查 spring.cloud.nacos.config.import-check.enabled=false  第六,下面来优化配置中心的动态刷新,把所有的配置信息抽取到一个类中,并将该类交给容器管理,如果要使用的时候,直接依赖注入,调用容器内的配置信息。

第七,在控制台中监听配置中心更新后的配置信息,直接在项目启动类进行监听,项目一启动就开始监听。需要用到spring自带的nacosConfigManager方法监听配置变化

 Nacos经典面试题--配置中心

Nacos中的数据集和application.properties有相同的配置项,哪个生效?

答:Nacos数据集中的生效。

记住一个原则:外部优先,先导入优先。

配置中心-数据隔离

作为配置中心,它怎么做到数据隔离呢,这里说到的数据隔离就是,在不同的环境中(如开发环境、测试环境、生产环境),不同的微服务中(如负责订单的微服务、负责购物车的微服务,负责数据库的微服务)不可能总是用同一份配置信息。我们要做到的是按需导入,这就需要数据离。 

 

上面就是数据隔离要做的所有任务

第一个,环境隔离,这首先需要我们在springboot的yml文件中配置激活好,如下图的例子,

再和Nacos配置中心名称空间的命名对应好,这样可以方便你查找,方便你修改对应的配置。

server: port: 8000 //该微服务的端口号 spring: profiles: active: dev //下面有三套环境,选择一套激活 application: name: service-order //定义该微服务的名称 cloud: nacos: config: server-addr: 127.0.0.1:8848 //配置中心的地址 config: import-check: enabled: false //禁用导入检查 namespace: ${spring.profiles.active:public} //导入上面激活的那套环境,默认public环境 --- //三个短杠是进行环境分隔的作用 spring: config: import: - nacos:common.properties?group=order //选择order分组的 - nacos:database.properties?group=order2 //选择order2分组的 activate: on-profile: dev //定义的是开发环境 --- spring: config: import: - nacos:common.properties?group=order - nacos:database.properties?group=order2 - nacos:haha.properties?group=product activate: on-profile: test --- spring: config: import: - nacos:common.properties?group=order - nacos:database.properties?group=order - nacos:nih.properties?group=product activate: on-profile: prod  第二个,区分多种微服务,就通过group组来进行区分,区分不同的配置文件,就通过数据集Id进行区分。

以上就是我要分享的所有内容 ,如果有啥建议和讲的不对的地方欢迎各位大佬评论区留言哦。

首页
评论
分享
Top