Nacos注册中心


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

1. 服务注册到Nacos

1)引入依赖

在父工程的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>

然后在 服务提供者 和 服务消费者 中的pom文件中引入nacos-discovery依赖:

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

2)配置nacos地址

在 服务提供者 和 服务消费者 中的application.yml中添加nacos地址:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848 #默认端口8848

到这里,服务已经简单的注册到了nacos了,

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

2. Nacos与Eureka的区别

在这里插入图片描述

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

  • 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。
  • 非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例。

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

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        ephemeral: false # 设置为非临时实例

Nacos与Eureka的区别

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

CAP定理

  • Consistency(一致性)
  • Availability(可用性)
  • Partition tolerance (分区容错性)

在这里插入图片描述
这三个指标不可能同时做到

3. Nacos统一配置管理

3.1.统一配置管理

1)nacos中添加配置文件

在这里插入图片描述

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

2)微服务拉取配置文件

spring的bootstrap.yaml配置文件,会在application.yml之前被读取。

所以我们在 服务提供者中创建 bootstrap.yaml配置文件,如下:

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

对应上nacos中配置文件的名称:xxxservice-dev.yaml

3)测试

使用**@Value注解**进行简单测试:

@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {

    @Value("${example.name}")
    private String name;
    
    @GetMapping("/name")
    public String getName(){
        return name;
    }
}

3.2.配置热更新

配置热更新:修改nacos中的配置后,微服务中无需重启即可让配置生效。

1)方式一

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

@Slf4j
@RefreshScope  //实现nacos配置热更新
@RestController
@RequestMapping("/test")
public class TestController {

    @Value("${example.name}")
    private String name;
    
    @GetMapping("/name")
    public String getName(){
        return name;
    }
}
2)方式二

在服务中新建一个Properties类,读取Nacos配置文件中的属性值:

@Component
@Data
@ConfigurationProperties(prefix = "example")
public class ExampleProperties {
    private String name;
}

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

@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {

    @Autowired
    private ExampleProperties exampleProperties;
    
    @GetMapping("/name")
    public String getName(){
        return exampleProperties.getName();
    }
}

3.3.配置共享

1)配置nacos共享文件

微服务启动时,会去nacos读取多个配置文件;

其中,不包含环境的配置文件,可以被多个环境共享,

如: xxxservice.yaml ,即 [服务名].[后缀名] ,即 [spring.application.name].yaml

在这里插入图片描述

2)测试

修改ExampleProperties类:

@Component
@Data
@ConfigurationProperties(prefix = "example")
public class ExampleProperties {
    private String name;
    private String age;
}

在TestController添加新方法:

@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {

    @Autowired
    private ExampleProperties exampleProperties;
    
    @GetMapping("/name")
    public String getName(){
        return exampleProperties.getName();
    }
    @GetMapping("/example")
    public String test(){
        return exampleProperties;
    }
}

然后进行测试。

可以再新开一个,测试环境的启动项(copy当前启动项,修改端口和开发环境),然后进行测试更加严谨。

3)配置文件的优先级

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

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值