Nacos学习笔记

x33g5p2x  于2022-04-10 转载在 其他  
字(3.0k)|赞(0)|评价(0)|浏览(400)

初识Nacos

服务注册与发现

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

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

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

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

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

启动Nacos

注意一定要先启动nacos再启动springboot项目

然后启动服务提供者和服务消费者项目

测试

Nacos集群

配置集群

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

我这启动了四个项目于其中8083设置的是BJ集群剩下三个都是HZ集群

NacosRule负载均衡

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

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

权重负载均衡(权重越低分配到的请求越少,权重为0时不会分配到请求)

Nacos环境隔离

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

修改命名空间

修改8080服务的命名空间

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

重启服务

再次访问查询order信息

报错原因: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配置管理

一、新建配置信息

Data ID命名推荐使用[服务名]-[运行环境].yaml,后缀推荐使用yaml(不建议使用yml)

二、引入Nacos的配置管理客户端依赖

<!--nacos配置管理依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2.2.5.RELEASE</version>
</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这个文件一定会加载,因此多环境共享配置可以写入这个文件

多种配置的优先级:[服务名]-[环境].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 #要共享的配置文件

相关文章