zoukankan      html  css  js  c++  java
  • SpringCloud系列之Nacos应用篇

    前言

    原先项目是以SpringConfig作为项目配置中心组件,Eureka作为服务注册发现组件,基本上就是SpringCloud全家桶,Eureka已经停更,所以前期调研可替换方案,主流替换方案有Consul/ZooKeeper/Nacos/Etcd等,网上资料也比较多,再加上之前有个项目用过Nacos商用产品,那就先试试Nacos,不得不说妙哉妙哉!!!

    项目版本

    spring-boot.version:2.2.5.RELEASE
    spring-cloud.version:Hoxton.SR3
    nacos.version:1.3.2

    项目说明

    项目模块说明如下,目的是把红框中的配置和服务注册发现组件替换成Nacos。示例项目中通过网关转发请求支付模块对外接口,在该接口中又涉及到用户模块服务的调用,从而验证配置是否正确。

    启动Nacos

    1.下载Nacos服务
    https://github.com/alibaba/nacos/releases/download/1.3.2/nacos-server-1.3.2.zip
    如嫌下载慢,可关注本文下方微信公众号二维码,关注后回复“666”即可获取开发常用工具包
    2.解压至本地目录后,进入bin目录执行startup.cmd脚本即可,启动成功后如下图,Linux环境下操作类似不做展开说明

    启动成功后通过浏览器访问如下地址
    http://localhost:8848/nacos
    默认用户/密码:nacos/nacos
    注意事项
    Nacos1.3.2版本默认启动模式是集群模式,本地测试需调整为单机模式,编辑startup.cmd文件将MODE值由“cluster”调整为“standalone”

    set MODE="standalone"
    

    项目调整

    只涉及调整点说明,主要是将SpringCloud及Eureka相关依赖、配置调整成Nacos的就可以了,其余都不需要改动,非常nice。完整项目代码请查看本文下方源码链接

    spring-cloud-gateway

    pom.xml

    <!--eureka服务注册-->
    <!--<dependency>-->
        <!--<groupId>org.springframework.cloud</groupId>-->
        <!--<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>-->
    <!--</dependency>-->
    <!-- nacos 注册中心-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>2.1.0.RELEASE</version>
    </dependency>
    

    bootstrap.yml

    server:
      port: 9005
    spring:
      application:
        name: springcloud-gateway-service
      security:
        user:
          name: test
          password: 123456
      cloud:
        gateway:
          enabled: true  #开启网关
          discovery:
            locator:
              enabled: true #开启自动路由,以服务id建立路由,服务id默认大写
              lower-case-service-id: true #服务id设置为小写
    # eureka:
    #  client:
    #    service-url:
    #      defaultZone: http://localhost:9003/eureka/
    #  instance:
    #    prefer-ip-address: true
    #    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848
    

    pay-service

    pom.xml

    <!--eureka客户端-->
    <!--<dependency>-->
        <!--<groupId>org.springframework.cloud</groupId>-->
        <!--<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>-->
    <!--</dependency>-->
    <!--config客户端-->
    <!--<dependency>-->
        <!--<groupId>org.springframework.cloud</groupId>-->
        <!--<artifactId>spring-cloud-starter-config</artifactId>-->
    <!--</dependency>-->
    <!-- nacos 配置中心-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        <version>2.1.0.RELEASE</version>
    </dependency>
    <!-- nacos 注册中心-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>2.1.0.RELEASE</version>
    </dependency>
    

    bootstrap.properties

    # 服务端口
    server.port=9011
    # 服务应用名称
    spring.application.name=pay-service
    
    # 应用服务名称
    #spring.cloud.config.name=pay-service
    # 对应git上分支名称
    #spring.cloud.config.label=master
    # 对应配置文件上profiles参数项
    #spring.cloud.config.profile=dev
    # 开启服务发现
    #spring.cloud.config.discovery.enabled=true
    # 配置Config服务应用名称
    #spring.cloud.config.discovery.service-id=config-server
    
    # eureka服务端地址
    #eureka.client.serviceUrl.defaultZone=http://localhost:9003/eureka/
    #eureka.instance.prefer-ip-address=true
    #eureka.instance.instance-id=${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
    
    # nacos配置中心
    spring.cloud.nacos.config.server-addr=127.0.0.1:8848
    spring.cloud.nacos.config.file-extension=properties
    

    application.properties

    # nacos服务发现
    spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
    

    user-service

    pom.xml

    <!--eureka客户端-->
    <!--<dependency>-->
        <!--<groupId>org.springframework.cloud</groupId>-->
        <!--<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>-->
    <!--</dependency>-->
    <!--config客户端-->
    <!--<dependency>-->
        <!--<groupId>org.springframework.cloud</groupId>-->
        <!--<artifactId>spring-cloud-starter-config</artifactId>-->
    <!--</dependency>-->
    
    <!-- nacos 配置中心-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        <version>2.1.0.RELEASE</version>
    </dependency>
    <!-- nacos 注册中心-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>2.1.0.RELEASE</version>
    </dependency>
    

    bootstrap.properties

    # 应用服务名称
    #spring.cloud.config.name=user-service
    # 对应git上分支名称
    #spring.cloud.config.label=master
    # 对应配置文件上profiles参数项
    #spring.cloud.config.profile=dev
    # 开启服务发现
    #spring.cloud.config.discovery.enabled=true
    # 配置Config服务应用名称
    #spring.cloud.config.discovery.service-id=config-server
    
    # eureka服务端地址
    #eureka.client.serviceUrl.defaultZone=http://localhost:9003/eureka/
    #eureka.instance.prefer-ip-address=true
    #eureka.instance.instance-id=${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
    
    # nacos配置中心
    spring.cloud.nacos.config.server-addr=127.0.0.1:8848
    spring.cloud.nacos.config.group=DEFAULT_GROUP
    spring.cloud.nacos.config.file-extension=properties
    

    application.properties

    # nacos服务发现
    spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
    

    Nacos控制台

    启动各个服务后,就大功告成啦,接下来让我们看下Nacos控制台吧
    在服务管理中我们可以看到已经注册进来的服务,服务间就可以互相调用啦,如下图

    看到这里好像配置中心没啥体现,接下来就说说,当前项目中仅仅只有user-service模块使用到配置中心,针对数据库的配置信息使用了,如下

    spring.datasource.name=${user-service.datasource.name}
    spring.datasource.type=${user-service.datasource.type}
    spring.datasource.url=${user-service.datasource.url}
    spring.datasource.username=${user-service.datasource.username}
    spring.datasource.password=${user-service.datasource.password}
    spring.datasource.driver-class-name=${user-service.datasource.driver-class-name}
    

    那具体要怎么配置呢,接着往下看

    Data ID:user-service.properties(下面会进行解释)
    Group:DEFAULT_GROUP
    配置格式选择Properties
    配置内容:

    user-service.datasource.name=user-service-datasource
    user-service.datasource.type=com.alibaba.druid.pool.DruidDataSource
    user-service.datasource.url=jdbc:mysql://127.0.0.1:3306/spring-cloud?useUnicode=true&amp;characterEncoding=utf8&amp;zeroDateTimeBehavior=convertToNull&amp;transformedBitIsBoolean=true&amp;useSSL=false&amp;allowMultiQueries=true&amp;autoReconnect=true
    user-service.datasource.username=root
    user-service.datasource.password=root
    user-service.datasource.driver-class-name=com.mysql.jdbc.Driver
    

    重点说下Data ID,在 Nacos Spring Cloud 其完整的格式如下

    ${prefix}-${spring.profile.active}.${file-extension}
    

    prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
    spring.profile.active 即为当前环境对应的 profile。
    注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成如下

    ${prefix}.${file-extension}
    

    file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。
    了解了dataId的格式,那自然也明白了上述配置项中为什么用user-service.properties命名,添加完该配置项后,我们来请求下接口,请求接口地址如下
    直接请求支付模块接口地址
    http://localhost:9011/pay/get
    经网关转发后接口地址
    http://localhost:9005/pay-service/pay/get
    最终都会得到如下响应数据
    在这里插入图片描述
    通过访问以下接口获取配置项数据库连接地址
    http://localhost:9005/user-service/user/getDatasourceUrl

    至此Nacos已全面替换Eureka和Config。中途有个插曲,替换成Nacos后,网关自动路由居然失效了,一直提示404,反复折腾来折腾去的,最终在Nacos Github上看到一个Issues
    https://github.com/alibaba/nacos/issues/2302
    在这里插入图片描述
    于是马上调整至如下版本进行尝试,重新编译后请求访问,一切都是那么的熟悉,这感觉真好

    spring-boot.version:2.1.16.RELEASE
    spring-cloud.version:Greenwich.SR3
    

    测试成功后,看了下spring-cloud-alibaba v2.2.1.RELEASE已经发布了,那岂不是解决这个问题了,试一试不就知道了,于是又把Spring boot,Spring cloud版本切换至本文最初的配置,另外将nacos版本升级至2.2.1版本,重新编译运行,请求一切正常。

    <!-- nacos 配置中心-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        <version>2.2.1.RELEASE</version>
    </dependency>
    <!-- nacos 注册中心-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>2.2.1.RELEASE</version>
    </dependency>
    

    参考资料

    Nacos官网

    Nacos Github

    系列文章

    SpringCloud系列之配置中心(Config)使用说明

    SpringCloud系列之服务注册发现(Eureka)应用篇

    SpringCloud系列之网关(Gateway)应用篇

    SpringCloud系列之集成Dubbo应用篇

    SpringCloud系列之集成分布式事务Seata应用篇

    项目源码

    在这里插入图片描述

  • 相关阅读:
    Java Mysql连接池配置和案例分析--超时异常和处理
    springmvc学习笔记--Interceptor机制和实践
    Apache HttpClient使用之阻塞陷阱
    springmvc学习笔记--REST API的异常处理
    基于redis的排行榜设计和实现
    MySQL修改root密码的方法总结
    Ubuntu 16.04下安装golang
    锁优化的手段总结
    Java内存溢出问题总结
    GC日志时间分析
  • 原文地址:https://www.cnblogs.com/chinaWu/p/13575813.html
Copyright © 2011-2022 走看看