美文网首页一些收藏
Spring Cloud-Nacos服务注册&发现

Spring Cloud-Nacos服务注册&发现

作者: 石头耳东 | 来源:发表于2022-03-06 18:14 被阅读0次

    前置文章:
    Spring Cloud-Erueka服务注册

    零、本文纲要

    • 一、安装Nacos
    • 二、Nacos服务注册&发现
    • 三、Nacos服务集群&负载均衡
    • 四、Nacos服务权重&命名空间
    • 五、Nacos服务实例
    • 六、对比Nacos和Eureka

    tips:Ctrl + F快速定位所需内容进行阅读吧。

    一、安装Nacos

    Nacos 快速开始

    • 1、Linux系统安装Nacos

    1.1 Java环境准备

    ①下载JDK:Java Archive Downloads - Java SE 8 (oracle.com),根据自己的Linux系统实际位数下载对应压缩包即可。

    下载JDK压缩包.png

    ②上传JDK压缩包至Linux系统,比如:/usr/local/。
    ③然后解压:tar -xvf jdk-8u202-linux-x64.tar.gz,重命名解压后目录文件夹名为java

    # 如需复制命令,请复制此处:
    tar -xvf jdk-8u202-linux-x64.tar.gz
    mv jdk-8u202-linux-x64 java
    

    ④配置环境变量
    export JAVA_HOME=/usr/local/java
    export PATH=$PATH:$JAVA_HOME/bin

    # 如需复制命令,请复制此处:
    export JAVA_HOME=/usr/local/java
    export PATH=$PATH:$JAVA_HOME/bin
    

    ⑤设置环境变量:

    source /etc/profile
    

    1.2 安装Nacos

    ①下载Nacos
    https://github.com/alibaba/nacos/releases

    下载Nacos压缩包.png

    ②上传Nacos压缩包至Linux系统,比如:/usr/local/src/。
    ③解压&删除压缩包

    tar -xvf nacos-server-1.4.1.tar.gz
    rm -rf nacos-server-1.4.1.tar.gz
    

    ④启动Nacos
    进入bin目录,启动Nacos(standalone代表着单机模式运行,非集群模式):

    sh startup.sh -m standalone
    
    • 2、Windows系统安装Nacos

    ①下载Nacos压缩包
    ②解压Nacos压缩包
    ③启动Nacos
    进入bin目录,启动Nacos(standalone代表着单机模式运行,非集群模式):

    startup.cmd -m standalone
    
    image.png

    二、Nacos服务注册&发现

    • 1、服务模块搭建
      1.1 spring_cloud_orderservice模块:
      ①mapper-[I接口]OrderMapper
      ②pojo-[C类]Order
      ③service-[I接口]OrderService-[C类]OrderServiceImpl
      ④web-[C类]OrderController
      ⑤启动类-[C类]SpringCloudOrderserviceApplication
      1.2 spring_cloud_userservice模块:
      ①mapper-[I接口]UserMapper
      ②pojo-[C类]User
      ③service-[I接口]UserService-[C类]UserServiceImpl
      ④web-[C类]UserController
      ⑤启动类-[C类]SpringCloudUserserviceApplication
    • 2、pom.xml配置相关依赖

    顶级父模块配置依赖管理,添加spring-cloud-alibaba-dependencies相关依赖。

        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring-cloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
                <dependency>
                    <groupId>com.alibaba.cloud</groupId>
                    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                    <version>2.2.5.RELEASE</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    

    各个服务添加nacos相关依赖,spring-cloud-starter-alibaba-nacos-discovery。

            <!-- nacos客户端依赖包 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
    
    • 3、application.yml配置nacos服务

    配置order服务和user服务的application.yml文件,添加nacos服务的相关配置。其他关于server-port、datasource、application-name、mybatis、logging的配置与之前Eureka的内容一致。

    # server-port
    server:
      port: 8081
    # datasource
    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        username: root
        password: root
        url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false
    # application name
      application:
        name: userservice
    # nacos server
      cloud:
        nacos:
          server-addr:  127.0.0.1:8848 #nacos server address
    # mybatis
    mybatis:
      type-aliases-package: com.stone.pojo
      configuration:
        map-underscore-to-camel-case: true
    # logging
    logging:
      level:
        com.stone: debug
      pattern:
        dateformat: yyyy-MM-dd HH:mm:ss:SSS
    

    所以,此处我们只需将eureka-server的内容替换成nacos-server的配置即可。

    • 4、启动服务模块

    此时我们就可以通过Nacos控制台来查看我们启动的服务,如下:

    通过Nacos控制台查看服务.png

    三、Nacos服务集群&负载均衡

    • 1、集群模拟

    集群模拟与Eureka集群模拟一样,通过IDEA的copy configuration来配置server.port来配置不同端口的服务即可。

    user服务集群.png
    • 2、服务分级存储

    ①user服务配置集群
    通过配置服务集群,来给服务进行分级存储。
    Ⅰ 模拟上海(ShangHai)地区配置集群:

    spring:
      cloud:
        nacos:
          # server address
          server-addr:  127.0.0.1:8848
          discovery:
            # cluster
            cluster-name: ShangHai 
    

    Ⅱ 模拟杭州(HangZhou)地区配置集群:

    spring:
      cloud:
        nacos:
          server-addr:  127.0.0.1:8848
          discovery:
            cluster-name: HangZhou
    
    杭州&上海服务集群.png

    ②order服务配置负载均衡策略
    NacosRule负载均衡策略:
    Ⅰ 优先选择本地:优先选择配置指定的集群,如果指定集群未有有效可使用的服务,则使用其他集群可用服务。
    Ⅱ 本地内随机。

    # user-service ribbon rule
    userservice:
      ribbon:
        # 优先选择本地,在本地内随机
        NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
    

    ③order服务配置服务发现集群

    spring:
      cloud:
        nacos:
          server-addr: 127.0.0.1:8848
          discovery:
            cluster-name: HangZhou
    

    此时如果发生了跨集群的调用,日志内会有相应记录:A cross-cluster call occurs。

    2022-03-06 16:20:15:571  WARN 36360 --- [nio-8082-exec-6] c.alibaba.cloud.nacos.ribbon.NacosRule   : A cross-cluster call occurs,name = userservice, clusterName = HZ, instance = [Instance{instanceId='192.168.2.105#8084#SH#DEFAULT_GROUP@@userservice', ip='192.168.2.105', port=8084, weight=0.1, healthy=true, enabled=true, ephemeral=true, clusterName='SH', serviceName='DEFAULT_GROUP@@userservice', metadata={preserved.register.source=SPRING_CLOUD}}, Instance{instanceId='192.168.2.105#8081#SH#DEFAULT_GROUP@@userservice', ip='192.168.2.105', port=8081, weight=1.0, healthy=true, enabled=true, ephemeral=true, clusterName='SH', serviceName='DEFAULT_GROUP@@userservice', metadata={preserved.register.source=SPRING_CLOUD}}, Instance{instanceId='192.168.2.105#8083#SH#DEFAULT_GROUP@@userservice', ip='192.168.2.105', port=8083, weight=0.1, healthy=true, enabled=true, ephemeral=true, clusterName='SH', serviceName='DEFAULT_GROUP@@userservice', metadata={preserved.register.source=SPRING_CLOUD}}]
    

    四、Nacos服务权重&命名空间

    • 1、服务权重

    服务权重一般配置在0-1之间,0表示无权重,则默认不会调用该服务;
    使用场景:服务升级,将集群中某部分服务权重先调整为0,而后停用重启新服务。

    服务权重配置.png
    • 2、命名空间

    ①数据模型
    可以先看下Nacos数据模型,如下:

    Nacos数据模型.png

    Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP。
    实际开发中,Namespace可能根据开发、测试、生产做不同划分,服务不可以跨Namespace进行调用。
    ②命名空间设置
    命名空间ID可以不做设置,系统会默认生成UUID。

    命名空间设置.png

    ③服务模块配置指定命名空间
    namespace的配置使用命名空间ID即可,不能填写自己的命名空间名(如:dev)。

    spring:
      cloud:
        nacos:
          server-addr: 127.0.0.1:8848
          discovery:
            cluster-name: HZ
            namespace: 15740536-b11b-4e42-9f85-31686f5fb8c6
    

    五、Nacos服务实例

    Nacos一般我们仅需配置临时实例即可,以下做下了解。

    • 1、临时实例
      通过心跳监测,如果服务宕机不可用,则会被Nacos注册中心从服务列表中剔除;
    • 2、非临时实例
      Nacos注册中心会主动询问,如果服务宕机不可用,不会被剔除(会等待直至服务恢复正常,或者手动被删除)。
    image.png

    application.yml中配置ephemeral属性,来控制临时/非临时实例,如下:

    spring:
      cloud:
        nacos:
          server-addr: 127.0.0.1:8848
          discovery:
            cluster-name: HZ
            namespace: 15740536-b11b-4e42-9f85-31686f5fb8c6
            ephemeral: false #默认为true,即为临时实例
    

    六、对比Nacos和Eureka

    • 1、共同点
      ①都支持 服务注册 & 服务拉取
      ②都支持 服务提供者 心跳方式健康检测
    • 2、不同点
      ①Nacos支持服务端主动检测提供者状态:临时实例-心跳方式、非临时实例-主动检测;
      ②Nacos临时实例-异常剔除、非临时实例-不主动剔除;
      ③Nacos支持服务列表变更推送,服务列表及时更新;
      ④Nacos集群默认采用AP模式,存在非临时实例采用CP模式、
      Eureka采用AP模式。

    七、结尾

    以上即为服务注册和发现的基础内容,感谢阅读。

    相关文章

      网友评论

        本文标题:Spring Cloud-Nacos服务注册&发现

        本文链接:https://www.haomeiwen.com/subject/oskwrrtx.html