Nacos学习笔记

文章目录

  • 初识Nacos
    • 服务注册与发现
    • 启动Nacos
  • Nacos集群
  • NacosRule负载均衡
  • Nacos环境隔离
    • 修改命名空间
  • Nacos和Eureka的对比
  • Nacos配置管理
    • Nacos配置热更新
    • 多环境配置共享

初识Nacos

服务注册与发现

我在这篇文章中已经写好了服务消费者和服务提供者

给服务提供者和服务消费添加依赖

<dependency>
	<groupId>com.alibaba.cloudgroupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
	<version>2.2.5.RELEASEversion>
dependency>

在application.yml配置文件中添加nacos服务端地址

spring:
  cloud:
    nacos:
      #nacos服务端地址
      server-addr: localhost:8848

启动Nacos

注意一定要先启动nacos再启动springboot项目
Nacos学习笔记_第1张图片
然后启动服务提供者和服务消费者项目
Nacos学习笔记_第2张图片
测试
在这里插入图片描述

Nacos集群

配置集群

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
      	#配置集群名称(自定义)
        cluster-name: HZ

我这启动了四个项目于其中8083设置的是BJ集群剩下三个都是HZ集群
Nacos学习笔记_第3张图片
Nacos学习笔记_第4张图片
Nacos学习笔记_第5张图片

NacosRule负载均衡

将负载均衡设置为NacosRule表示会优先寻找与自己同集群的服务

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

权重负载均衡(权重越低分配到的请求越少,权重为0时不会分配到请求)
Nacos学习笔记_第6张图片
Nacos学习笔记_第7张图片

Nacos环境隔离

Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离
Nacos学习笔记_第8张图片
Nacos学习笔记_第9张图片

修改命名空间

修改8080服务的命名空间

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ
        #填命名空间ID
        namespace: 15a1ca9f-6f14-4da8-a1c5-7c2fdcf268f9

重启服务
Nacos学习笔记_第10张图片
再次访问查询order信息
Nacos学习笔记_第11张图片
报错原因:namespace不同导致orderservice找不到userservice实例

04-02 21:40:30:229 ERROR 30908 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : 
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; 
nested exception is java.lang.IllegalStateException: No instances available for userservice] with root cause

Nacos和Eureka的对比

  • 相同点:
    1、都支持服务的注册和拉取
    2、都支持服务提供者心跳方式做健康检测
  • 不同点:
    1、Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
    2、临时实例心跳不正常会被剔除,非临时实例则不会被剔除
    3、Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
    4、Nacos集群默认采用AP方式,当集群中存在非临时实例时采用PC模式,Eureka采用AP模式
spring:
  cloud:
    nacos:
      server-addr: localhost:8848,localhost:8847
      discovery:
        #设置是否为临时实例
        ephemeral: false

Nacos配置管理

一、新建配置信息
Nacos学习笔记_第12张图片
Data ID命名推荐使用[服务名]-[运行环境].yaml,后缀推荐使用yaml(不建议使用yml)
Nacos学习笔记_第13张图片
二、引入Nacos的配置管理客户端依赖


<dependency>
    <groupId>com.alibaba.cloudgroupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
    <version>2.2.5.RELEASEversion>
dependency>

三、在resources目录下新建bootstrap.yml文件。这个文件是引导文件,优先级高于application.yml。在程序启动时会根据这个配置文件中的nacos地址、服务名称、当前环境和文件后缀名读取nacos中的配置文件

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

Nacos配置热更新

Nacos中的配置文件变更后,微服务无需重启就可以感知

第一种方式:添加@RefreshScope注解

@Controller
@RequestMapping("/user")
@RefreshScope
public class UserController {
	//...
}

第二种方式:使用配置类

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

注入配置类

@Autowired
private PatternProperties properties;

多环境配置共享

微服务启动时会从nacos读取多个配置文件:

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

无论profile如何变化,[spring.application.name].yaml这个文件一定会加载,因此多环境共享配置可以写入这个文件
Nacos学习笔记_第14张图片
多种配置的优先级:[服务名]-[环境].yaml>[服务名].yaml>本地配置

不同微服务之间能共享配置文件吗?

可以,不同微服务之间可以共享配置文件

  • 方式一:
spring:
  cloud:
    nacos:
      config:
        file-extension: yaml #文件后缀名
        shared-configs: #多微服务间共享的配置列表
          - dataId: common.yaml #要共享的配置文件
  • 方式二
spring:
  cloud:
    nacos:
      config:
        file-extension: yaml #文件后缀名
        extends-configs: #多微服务间共享的配置列表
          - dataId: common.yaml #要共享的配置文件

你可能感兴趣的:(微服务专题笔记,服务器,nacos,spring,cloud)