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应用篇

    项目源码

    在这里插入图片描述

  • 相关阅读:
    Balance的数学思想构造辅助函数
    1663. Smallest String With A Given Numeric Value (M)
    1680. Concatenation of Consecutive Binary Numbers (M)
    1631. Path With Minimum Effort (M)
    1437. Check If All 1's Are at Least Length K Places Away (E)
    1329. Sort the Matrix Diagonally (M)
    1657. Determine if Two Strings Are Close (M)
    1673. Find the Most Competitive Subsequence (M)
    1641. Count Sorted Vowel Strings (M)
    1679. Max Number of K-Sum Pairs (M)
  • 原文地址:https://www.cnblogs.com/chinaWu/p/13575813.html
Copyright © 2011-2022 走看看