微服务注册中心和配置中心Nacos 实战总结

微服务注册中心和配置中心Nacos 实战总结

  • Nacos 注册中心 ,官网 , 快速入门 , github , 一个不错的文档

    • 注册中心(动态服务发现, 基于 RPC 的服务发现): 注册中心设计原理

    • 配置中心(动态配置服务)

      • 支持配置导出 和 导入,方便服务器迁移
      • 灰度配置 : 是指定部分客户端IP进行新配置的下发,其余客户端配置保持不变,用以验证新配置对客户端的影响
    • 动态 DNS 服务 : 地址服务模块 DNS: nacos-address-server-1.1.0

    • 健康检查 : Nacos 监控 : Prometheus

  • 安装 Nacos

    • 安装方法1,下载源代码

      unzip nacos-source.zip
      cd nacos/
      mvn -Prelease-nacos clean install -U
      cd nacos/distribution/target/nacos-server-1.1.4/nacos/bin
      
    • 安装方法2, 下载运行包

      unzip nacos-server-1.1.4.zip OR tar -xvf nacos-server-1.1.4.tar.gz
      cd nacos/bin
      
    • 安装方法3, docker , dockerfile

      docker pull nacos/nacos-server
      docker run --env MODE=standalone --name nacos -d -p 8848:8848 -v /mnt/logs/nacos:/home/nacos/logs nacos/nacos-server
      #测试URL: http://192.168.51.141:8858/nacos/index.html
      
    • 单机模式: 运行服务 和 停止服务

      sh startup.sh -m standalone  # standalone 模式启动, 适合开发和测试环境
      sh shutdown.sh
      #nacos 管理界面 http://127.0.0.1:8848/nacos/
      #默认用户名和密码: nacos / nacos , config.server.service.LocalDataSourceServiceImpl
      
    • MySQL 配置

      -- 初始化mysql数据库,手动创建 nacos 库
      -- 然后在nacos库中执行SQL文件:nacos-mysql.sql ,创建表,文件位置在 nacos-server/conf 目录下
      
      #修改nacos-server/conf/application.properties文件,增加支持mysql数据源配置
      spring.datasource.platform=mysql
      
      db.num=1
      db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_dev?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
      db.user=root
      db.password=123456
      
  • 集群模式部署 : 生产环境应采用集群部署,需要3台服务器 ,3台配置都一样, 修改日志路径

    • 修改 cluster.conf 文件
      cd /opt/nacos/conf & cp cluster.conf.example cluster.conf
      #在 cluster.conf 文件中,添加如下配置,ip:port
      192.168.1.38:8848
      192.168.2.38:8848
      192.168.3.38:8848
      
    • 修改 bin/startup.sh 文件中的 JVM Configuration, 推荐是 2G 内存
      if [[ "${MODE}" == "standalone" ]]; then
          JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
          JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=true"
      else
          #JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
          #-Xmx512m , 内存分配太小,会导致 Full GC 回收次数太多,CPU 太繁忙 , 现在改成 1G 试试
          JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
          JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/java_heapdump.hprof"
          JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"
      fi
      
    • 关闭 nacos accesslog ,因为该文件太大
      #修改 conf/application.properties文件
      server.tomcat.accesslog.enabled=false  #默认是true
      
    • 修改nacos 相关日志的路径
      #修改 start.out 日志文件的路径 -- 这个配置不是很好,别用了
      #nohup $JAVA ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1 &
      nohup $JAVA ${JAVA_OPT} nacos.nacos >> /mnt/logs/nacos/start.out 2>&1 &
      
      #修改nacos 日志的路径, 修改 conf/nacos-logback.xml文件 , 将logPah 属性修改掉
      
      
      
      
      
    • 启动和停止 nacos server
      sh startup.sh  #启动
      sh shutdown.sh # 停止
      
  • 常见问题

    • dubbo在向 Nacos 注册时,如何使用外网IP注册
    • dubbo 在注册时,默认会根据主机名称获取本地ip
      • 要想使用外网IP,只要修改 /etc/hosts 文件中 主机名对应的IP即可,将内网IP改成外网IP
      • 带来的问题:可能会找不到 provider,具体原因有待查找
    • dubbo 在向Nacos 注册时,报Timeout错误,注册失败
      • 原因:可能是公司网络不稳定导致的问题,可能是一台路由器连接的设备太多
      • 解决办法:Nacos 注册中心启动在本地,不使用开发环境的Nacos
  • 在dubbo 中使用 nacos 的注册中心

    • 添加pom依赖

      
      <dependency>
          <groupId>org.apache.dubbogroupId>
          <artifactId>dubbo-registry-nacosartifactId>
          <version>2.7.4.1version>
      dependency>
      
      <dependency>
          <groupId>com.alibaba.nacosgroupId>
          <artifactId>nacos-clientartifactId>
          <version>1.1.4version>
      dependency>
      
    • 配置 nacos 注册中心的地址

      dubbo.registry.address=nacos://127.0.0.1:8848
      
    • 只需这两步,就可以让Dubbo 使用 nacos 注册中心了。

  • 在 dubbo中使用 nacos 的配置中心,实现动态配置

    • 添加pom 依赖

      
      <dependency>
          <groupId>com.alibaba.bootgroupId>
          <artifactId>nacos-config-spring-boot-starterartifactId>
          <version>0.2.3version>
      dependency>
      
    • 配置 nacos 配置中心的地址

      nacos.config.server-addr=127.0.0.1:8848
      #不配置,是public 命名空间
      nacos.config.namespace=a5ffcb87-c011-45f9-849e-1f69c4484a64  
      
    • 在nacos 后台 新增dubbo-demo-api 配置文件,在文件里添加内容如下

      company=dfss+syp
      
    • 加载 dubbo-demo-api 配置文件 , 当然可以加载多个nacos中的配置文件,这样就实现了配置共享

      @SpringBootApplication
      // 自动加载配置资源
      @NacosPropertySource(dataId = "dubbo-demo-api", autoRefreshed = true)
      @NacosPropertySource(dataId = "dubbo-demo-share.properties", autoRefreshed = true)
      public class NacosConfigApplication {
          public static void main(String[] args) {
              SpringApplication.run(NacosConfigApplication.class, args);
          }
      }
      
      @Controller
      public class UserController {
          // 使用 @NacosValue 获取属性值
          @NacosValue(value = "${company:none}", autoRefreshed = true)
          private String company;
        
          @RequestMapping("/sayHello/{name}")
          public String sayHello(@PathVariable String name) {
              return userService.sayHello(company + ": " + name);
          }
      }
      
    • 在dubbo中使用 spring-cloud-starter-alibaba-nacos-config 依赖也是可以的,请看下面《在spring cloud中使用nacos 配置中心》,用法完全一样。具体怎么选择就看个人喜好了。

  • 在 springcloud 中使用 nacos的注册中心

    • 添加pom 依赖

      <dependency>
          <groupId>com.alibaba.cloudgroupId>
          <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
          <version>2.2.0.RELEASEversion>
      dependency>
      
    • 配置nacos 注册中心的地址

      spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
      
    • 在启动类上添加注解@EnableDiscoveryClient ,启动服务注册机制

      @SpringBootApplication
      @EnableDiscoveryClient
      public class PaymentServiceApplication {
      }
      
  • 在 springcloud 中使用 nacos的配置中心,实现动态配置 ;详情配置可参见:Nacos Config

    • 添加pom 依赖 但是有个问题无法解决

      <dependency>
          <groupId>com.alibaba.cloudgroupId>
          <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
          <version>2.2.0.RELEASEversion>
      dependency>
      
    • 在application.properties属性文件中,配置nacos 配置中心的地址

      spring.profiles.active=dev
      server.port=8001
      spring.application.name=payment-service
      #配置中心地址
      spring.cloud.nacos.config.server-addr=127.0.0.1:8848
      spring.cloud.nacos.config.refresh-enabled=true
      
    • 新建 bootstrap.properties 属性文件,添加共享配置,参见 spring-cloud-alibaba源码 中的example

      #注意:一定要配置在这里,如果放到application.properties中,则不能获取到扩展配置文件中的配置
      #共享配置, 默认在默认的组,不支持动态刷新;
      spring.cloud.nacos.config.shared-configs[0].data-id=springcloud-demo-share.properties
      spring.cloud.nacos.config.shared-configs[0].group=DEFAULT_GROUP
      spring.cloud.nacos.config.shared-configs[0].refresh=true
      # share 比 extension 优先级高
      spring.cloud.nacos.config.extension-configs[0].data-id=share.properties
      spring.cloud.nacos.config.extension-configs[0].group=DEFAULT_GROUP
      spring.cloud.nacos.config.extension-configs[0].refresh=true
      
    • 在nacos 后台 新增 payment-service-dev.properties 配置文件(不带dev也可),文件内容如下

      sleep=1000
      
    • 在nacos 后台 新增 share.properties 共享配置文件

      plateform=dubbo
      
    • 使用 nacos 配置中心的配置项

      // 在Controller 上添加 @RefreshScope注解,这样 @Value("${sleep:0}") 就可以取得nacos上的值了
      @RestController
      @RefreshScope  // 别忘记这个注解,解决自动刷新问题
      public class PaymentController {
          @Value("${sleep:0}")
          private int sleep;
          // 在共享配置文件中配置
          @Value("${share.message:none}")
          private String message;
      
          @RequestMapping("/pay/balance")
          public Balance getBalance(@RequestParam Integer id) {
              System.out.println("request: /pay/balance?id=" + id + ", sleep: " + sleep);
              return new Balance(0, 0, 0, message);
          }
      }
      

你可能感兴趣的:(微服务,dubbo)