Nacos基本配置

Nacos官方文档

为什么需要服务注册中心?

微服务时代的服务管理
在微服务时代,我们所有的服务都被劲量拆分成最小的粒度,原先所有的服务都在混在1个server里,现在就被按照功能或者对象拆分成N个服务模块,这样做的好处是深度解耦,1个模块只负责自己的事情就好,能够实现快速的迭代更新。坏处就是服务的管理和控制变得异常的复杂和繁琐,人工维护难度变大。还有排查问题和性能变差(服务调用时的网络开销)文章来源地址:https://www.yii666.com/blog/390499.html

什么是注册中心?

注册中心的作用一句话概括就是存放和调度服务,实现服务和注册中心,服务和服务之间的相互通信。注册中心可以说是微服务架构中的”通讯录“,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址,进行调用。

如果没有注册中心?会怎样

 在不用服务注册之前,怎么去维护这种复制的关系网络呢?答案就是:写死!。
  1. 将其他模块的ip和端口写死在自己的配置文件里,甚至写死在代码里,每次要去新增或者移除1个服务的实例的时候,就得去通知其他所有相关联的服务去修改。
  2. 随之而来的就是各个项目的配置文件的反复更新、每隔一段时间大规模的ip修改和机器裁撤,非常的痛苦。

而有了注册中心之后,每个服务在调用别人的时候只需要服务的名称就好,调用时会通过注册中心根据服务编码进行具体服务地址进行调用。

服务注册中心的作用就是【服务的注册】和【服务的发现】

  • 服务注册,就是将提供某个服务的模块信息(通常是这个服务的ip和端口)注册到1个公共的组件上去(比如: zookeeper\consul)。
  • 服务发现,就是新注册的这个服务模块能够及时的被其他调用者发现。不管是服务新增和服务删减都能实现自动发现。

服务发现是怎么回事?

  1. 微服务启动的时候将service_name,IP,port,status发送到Nacos服务注册中心,Nacos保存这些数据。
  2. 消费者本地缓存服务信息,并且定时同步,所以就算Nacos宕机了也不怕不能调用
  3. 服务提供者每5秒发送心跳给服务发现组件,当一段时间没收到心态,服务发现组件标记服务状态为宕机。15秒无心跳则认为实例不健康,30秒健康检查失败则剔除实例。
  4. 这样的好处:
    1. 不用每次都请求服务发现组件,提升了性能
    2. 服务发现组件崩溃,不影响正常调用

整合Nacos 服务中心

 nacos 下载地址 :https://github.com/alibaba/nacos/releases

 nacos 搭建参考文档地址:https://nacos.io/zh-cn/docs/quick-start.html

 下载那一个包?如何解决兼容性问题?技巧如下:

   打开idea进入pom.xml 文件,打开spring-cloud-alibaba-dependencies 找到Nacos-client的版本

加依赖
  <!--nacos 注册中心-->
  <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  </dependency>
写配置
spring:
  application:
    name: shopping-account-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
写注解(开发)
//早期版本需要在启动类上加本注解,现在已经不是必须的了
@EnableDiscoveryClient
根据service-name获取在nacos中注册的实例信息:

 DiscoveryClient 可以操作Nacos元数据

 DiscoveryClient由SpringCloud提供,不只是可以查询Nacos。

 元数据有什么用?

  列如:有服务器A版本为V1.0,有服务器B版本为V1.0,有服务器C版本为V2.0,有服务器D版本为V2.0,可以做到V1.0的服务只调用V1.0,V2.0只调用V2.0。

服务发现的领域模型

  1.  Namespace 命名空间(实现隔离、默认是public) 对应不同的环境(dev、prot、test)
  2.  group 分组对应不同的节点(不同的微服务分在在同一个分组)
  3.  service 服务 对应不同的集群服务
  4.  cluster:(集群-对应服务器)对指定微服务的一个虚拟划分,默认DEFAULT
  5.  instance:微服务实列

为什么要实现配置管理?

 不同的环境不同的配置

  如:dev和prod环境的数据库地址和密码肯定不一样的

 配置属性动态刷新

  如:双十一需要修改数据库连接池,我需要在不重启服务的情况下修改

配置动态刷新

 动态刷新的几种方式

  方式一:yaml中开启 refresh-enabled=true 时(默认开启),通过applicationContext.getEnvironment.getProperty 直接获取

  方式二:standalone使用,@NacosValue获取最新值nacos配置信息需要写在配置类上

  方式三:结合springcloud ,@Value获取最新值一定要加@RefreshScope注解,配置文件中配置refresh: true

 Spring boot 启动或者更改配置后控制台打印配置信息

# 日志级别,可以指定到具体类
logging:
  level:
    # 3、在任意格式的配置文件中将该包路径的日志设置为 ERROR 或者 WARN 级别即可
    # Nacos 注册中心客户端心跳日志禁用 get changedGroupKeys:[] 刷屏
    com:
      alibaba:
        cloud:
          nacos: DEBUG

配置共享

  其他配置方式中可以查看

配置优先级

  其他配置方式中可以查看

数据持久化

  服务发现组件(所有配置文件存放的位置)

  数据持久化默认位置:~/nacos/naming

  配置服务器

  配置数据:$NACOS_HOME/data/derby-data

    在nacos控制台修改的配置都在此数据库中做持久化

    derby-data:不适合生产环境配置,内嵌(只能单机)数据库不能做高可用。

    需要停止nacos才能查看。

  快照:

    保存位置:~/nacos/config

    里面主要是在nacos中设置的内容,快照可以提升性能以及做容灾

加依赖

<!--nacos 注册中心-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

写配置

spring:
  cloud:
    nacos:
      discovery:
        #Nacos的地址,如果是集群的话使用,号隔开  如:localhost1,localhost2
        server-addr: 127.0.0.1:8848
        file-extension: yaml
  application:
    name: shopping-trade-service
  profiles:
    #以什么结尾的文件 shopping-trade-service-dev.yml
    active: dev

#读取Nacos上的shopping-trade-service-dev.yml配置文件

 

写注解(开发)

其他配置方式

bootstrap.xml文件

# bootstrap 会在加载application.yml之前先连接nacos,获取远程的配置,然后再进行初始化
# 因此bootstrap要配置的重点就是
# 1. nacos的地址: 获取配置的入口
# 2. application的name: 根据SpringCloud的约定,是根据name-{profile}.yaml去读取远程配置文件的
spring:
  application:
    name: snapex-account-service
  cloud:
    nacos:
      config:
        #NACOS_HOST 是环境变量
        #默认配置会默认自动刷新
        #当配置了环境变量时使用环境变量,如果没有配置时使用:后面的地址
        server-addr: ${NACOS_HOST:192.168.199.57:8848}
        #命名空间,和Nacos控制台的命名空间一致
        #此处的命名空间指的是Nacos控制台创建命名空间时命名空间ID
        namespace: ${NACOS_NAMESPACE:dev}
        file-extension: yaml
        group: DEFAULT_GROUP
        extension-configs:
          #配置中心配置的公共配置文件,yml后缀不能少,只支持yaml/properties
          #越靠后,优先级越高,优先级 database.yaml > commons.yaml
          - data-id: commons.yaml
            #commons.yaml所在的group
            group: DEFAULT_GROUP
            #是否动态的刷新
            refresh: true
          - data-id: database.yaml
            group: DEFAULT_GROUP
            #是否动态的刷新
            refresh: true
      discovery:
        server-addr: ${NACOS_HOST:192.168.199.57:8848}
        namespace: ${NACOS_NAMESPACE:dev2-dzq}
        group: DEFAULT_GROUP

application.xml文件

spring:
  profiles:
    #以什么结尾的文件 shopping-trade-service-dev.yml
    active: ${SPRING_PROFILES_ACTIVE:dev}

部分理论参考: 微服务:注册中心的作用 (yii666.com)

posted @ 2023-07-13 16:48  Faith_zhang  阅读(890)  评论(0编辑  收藏  举报