将Spring Cloud应用托管到SAE

更新时间: 2024-01-03 15:46:10

本文以包含服务提供者(Provider)和服务消费者(Consumer)的Spring Cloud微服务应用为例,指导您将原依赖Eureka、Consul、ZooKeeper等组件实现服务注册与发现的Spring Cloud应用部署到SAE中,并实现应用的服务注册与发现,以及Consumer对Provider的调用。

前提条件

  1. 下载并解压Nacos Server

  2. 进入nacos/bin目录,启动Nacos Server。

    • Linux、Unix、macOS系统:执行命令sudo sh startup.sh -m standalone

    • Windows系统:执行命令startup.cmd -m standalone

    说明

    standalone表示单机模式运行,非集群模式。startup.cmd文件默认以集群模式启动,因此您在使用Windows系统时,如果直接双击执行startup.cmd文件会导致启动失败,此时需要在startup.cmd文件内设置MODE="standalone"。 更多信息,请参见Nacos快速开始

为什么托管到SAE

原依赖Eureka、Consul、ZooKeeper和Redis等组件实现服务注册与发现的Spring Cloud应用,如果需要部署至SAE,仅需将原服务注册与发现中心和配置中心替换为Alibaba Nacos Discovery,无需修改任何业务代码。

SAE服务注册中心具有Spring Cloud Alibaba Nacos Discovery所有功能,SAE服务注册中心可以完全代替Eureka、Consul、ZooKeeper和Redis等,作为您微服务应用的服务注册中心。

将Spring Cloud应用托管到SAE,您仅需关注Spring Cloud应用自身的逻辑,无需再关注注册中心和配置中心的搭建和维护,托管后还可以使用SAE提供的弹性伸缩、一键批量启停、应用监控等功能,大幅度降低开发和运维成本。

当您的微服务应用较多时,注册中心按推荐程度由高到低依次排序如下。

  • 商业版的服务注册中心(MSE)

    bt_use_mse_nacos_in_service_registration_and_discovery

    搭建并部署商业版的服务注册中心(使用MSE的Nacos作为服务注册中心)的具体操作,请参见使用MSE的Nacos注册中心

  • 自建服务注册中心

    bt_use_user_created_nacos_in_service_registration_and_discovery

    搭建并部署自建Nacos注册中心时,您需要确认以下内容。

    • 确保SAE的网络与自建Nacos的网络互通。

    • 确保-D-XX参数未交替使用,以免命令失效。示例代码如下:

      • 修改前:

        java -Dalicloud.deployment.mode=EDAS_MANAGED -XX:+UseContainerSupport -XX:InitialRAMPercentage=70.0 -XX:MaxRAMPercentage=70.0 -XX:+UnlockExperimentalVMOptions -XX:+UseWisp2 -Dio.netty.transport.noNative=true -XX:+UseG1GC -Dspring.profiles.active=yace -Dnacos.use.endpoint.parsing.rule=false -Dnacos.use.cloud.namespace.parsing=false -jar /home/admin/app/xx-server.jar
      • 修改后:

        java -XX:+UseContainerSupport -XX:InitialRAMPercentage=70.0 -XX:MaxRAMPercentage=70.0 -XX:+UnlockExperimentalVMOptions -XX:+UseWisp2 -Dio.netty.transport.noNative=true -XX:+UseG1GC -Dspring.profiles.active=yace -Dnacos.use.endpoint.parsing.rule=false -Dnacos.use.cloud.namespace.parsing=false -jar /home/admin/app/xx-server.jar
    • 建议在部署应用时,使用镜像或者JAR包方式,并配置启动参数-Dnacos.use.endpoint.parsing.rule=false-Dnacos.use.cloud.namespace.parsing=false

      重要

      启动参数需要放在-jar之前,否则可能会导致无法使用非SAE自带的注册中心。

      • 如果采用镜像方式,请将-Dnacos.use.endpoint.parsing.rule=false-Dnacos.use.cloud.namespace.parsing=false配置在镜像文件的程序启动命令中。Docker镜像制作方法,请参见制作Java镜像

        示例代码如下:

        RUN echo 'eval exec java -Dnacos.use.endpoint.parsing.rule=false -Dnacos.use.cloud.namespace.parsing=false -jar $CATALINA_OPTS /home/admin/app/hello-edas-0.0.1-SNAPSHOT.jar'> /home/admin/start.sh && chmod +x /home/admin/start.sh
      • 如果采用JAR包方式,请在控制台启动命令设置区域的options设置文本框输入-Dnacos.use.endpoint.parsing.rule=false -Dnacos.use.cloud.namespace.parsing=false。图示为Open JDK 8运行环境下的Java应用。具体操作,请参见设置启动命令sc_configure_a_startup_command_for_nacos

  • SAE内置服务注册中心

    sc_sae_service_registration_and_discovery

    SAE提供Java微服务自动寻址的Nacos Server能力,您可以通过SAE服务注册发现功能配置。具体操作,请参见使用SAE内置Nacos

步骤一:获取Demo

eureka-service-provider和eureka-service-consumer是SAE提供的微服务Demo应用程序包,二者均为已经接入Eureka的Spring Cloud应用。Consumer应用消费Provider应用提供的服务。

步骤二:修改Provider应用的服务注册与发现配置

将云原生的Provider应用托管到SAE中,需要在应用程序中修改pom依赖,并指定Nacos Server的IP地址。

说明

以下情况需要指定Nacos Server的IP地址:

  • 本地测试时,本地测试通过后再部署到SAE中。

  • SAE的服务注册中心为自建的Nacos。

  1. 添加pom依赖。

    打开应用的pom.xml文件,将spring-cloud-starter-netflix-eureka-client替换成为spring-cloud-starter-alibaba-nacos-discovery,并设置Nacos Server的版本信息。

    替换前:

    <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>                            

    替换后:

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>2.1.1.RELEASE</version>
    </dependency>                           
    说明
    • 示例中使用的版本是Spring Cloud Greenwich,对应spring-cloud-starter-alibaba-nacos-discovery的版本为2.1.1.RELEASE

    • 如果您使用的是Spring Cloud Finchley版本,对应spring-cloud-starter-alibaba-nacos-discovery的版本为2.0.1.RELEASE

    • 如果您使用的是Spring Cloud Edgware版本,对应spring-cloud-starter-alibaba-nacos-discovery的版本为1.5.1.RELEASE。该版本的生命周期已结束,因此不推荐使用该版本。更多信息,请参见Spring Cloud Edgware Release Notes

  2. 指定Nacos Server的IP地址。

    打开src\main\resources路径下的application.properties文件,指定Nacos Server的IP地址。

    修改前:

    spring.application.name=service-provider
    server.port=18081
    eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8761/eureka/                            

    修改后:

    spring.application.name=service-provider
    server.port=18081
    spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848                            

    其中127.0.0.1为Nacos Server的IP地址。如果Nacos Server部署在其他机器上,则需要修改为对应的IP地址。如果有其他需求,请参见配置项参考application.properties文件中增加所需配置。

  3. 查询应用服务。

    1. 执行nacos-service-providerProviderApplicationmain函数,启动应用。

    2. 登录本地启动的Nacos Server控制台127.0.0.1:8848/nacos,在左侧导航栏中选择服务管理 > 服务列表

      说明

      本地Nacos Server控制台的默认用户名和密码均为nacos。

      如果服务列表中显示service-provider,且在详情中可以查询该服务的详情,那么表示服务注册成功。

步骤三:修改Consumer应用的服务注册与发现配置

将云原生的Consumer应用托管到SAE中,需要在应用程序中修改pom依赖,并指定Nacos Server的IP地址。

说明

以下情况需要指定Nacos Server的IP地址:

  • 本地测试时,本地测试通过后再部署到SAE中。

  • SAE的服务注册中心为自建的Nacos。

  1. 添加pom依赖。

    打开应用的pom.xml文件,将spring-cloud-starter-netflix-eureka-client替换成为spring-cloud-starter-alibaba-nacos-discovery,并设置Nacos Server的版本信息。

    替换前:

    <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>                            

    替换后:

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>2.1.1.RELEASE</version>
    </dependency>                           
    说明
    • 示例中使用的版本是Spring Cloud Greenwich,对应spring-cloud-starter-alibaba-nacos-discovery的版本为2.1.1.RELEASE

    • 如果您使用的是Spring Cloud Finchley版本,对应spring-cloud-starter-alibaba-nacos-discovery的版本为2.0.1.RELEASE

    • 如果您使用的是Spring Cloud Edgware版本,对应spring-cloud-starter-alibaba-nacos-discovery的版本为1.5.1.RELEASE。该版本的生命周期已结束,因此不推荐使用该版本。更多信息,请参见Spring Cloud Edgware Release Notes

  2. 指定Nacos Server的IP地址。

    打开src\main\resources路径下的application.properties文件,指定Nacos Server的IP地址。

    修改前:

    spring.application.name=service-consumer
    server.port=18082
    eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8761/eureka/                            

    修改后:

    spring.application.name=service-consumer
    server.port=18082
    spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848                            

    其中127.0.0.1为Nacos Server的IP地址。如果Nacos Server部署在其他机器上,则需要修改为对应的IP地址。如果有其他需求,请参见配置项参考application.properties文件中增加所需配置。

  3. 查询应用服务。

    1. 执行nacos-service-consumerConsumerApplicationmain函数,启动应用。

    2. 登录本地启动的Nacos Server控制台127.0.0.1:8848/nacos,在左侧导航栏中选择服务管理 > 服务列表

      说明

      本地Nacos Server控制台的默认用户名和密码均为nacos。

      如果服务列表中显示service-consumer,且在详情中可以查询该服务的详情,那么表示服务注册成功。

步骤四:查看Provider与Consumer的调用结果

在本地查看Consumer对Provider的服务调用结果。启动服务,执行IP+port/echo-rest/{自定义变量}IP+port/echo-feign/{自定义变量}查看调用结果。

  • Linux、Unix、macOS系统:执行curl http://127.0.0.1:18082/echo-rest/{自定义变量}curl http://127.0.0.1:18082/echo-feign/{自定义变量}

  • Windows系统:在浏览器中输入http://127.0.0.1:18082/echo-rest/{自定义变量}http://127.0.0.1:18082/echo-feign/{自定义变量}

示例:以Windows系统为例,当显示以下结果时,表示Provider与Consumer业务调用成功。

结果验证

步骤五:将应用部署到SAE

  1. 在应用的pom.xml文件中添加应用程序的打包配置,添加完成后执行mvn clean package命令将本地的程序编译成可执行的JAR包。

    <build>
         <plugins>
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
                 <executions>
                     <execution>
                         <goals>
                             <goal>repackage</goal>
                         </goals>
                     </execution>
                 </executions>
             </plugin>
         </plugins>
     </build>                        
  2. 将编译好的Provider和Consumer应用包部署至SAE。具体操作,请参见部署微服务应用到SAE

    重要
    • SAE不支持创建空应用,因此第一次部署需在控制台完成。

    • 如果使用JAR包部署,在应用部署配置时选择应用运行环境标准Java应用运行环境

    • 如果使用WAR包部署,在应用部署配置时应用运行环境apache-tomcat-XXX

    当您将应用部署到SAE时,SAE服务注册中心以高优先级自动设置Nacos Server服务端地址和服务端口,以及命名空间、AccessKey ID、AccessKey Secret等信息,您无需进行任何额外的配置。对于原有的配置内容您可以保留或删除。

步骤六:结果验证

  1. 为Consumer应用绑定公网CLB,并在浏览器键入所设置的公网访问地址,进入应用首页。具体操作,请参见为应用绑定CLB

  2. 在应用首页发起调用请求,然后登录SAE控制台,在左侧导航栏,选择应用管理 > 应用列表在顶部菜单栏,选择地域。

  3. 应用列表页面,选择Consumer应用,进入基本信息页面。

  4. 在左侧导航栏,选择应用监控 > 应用总览,查看服务调用数据总览。

    如果能够监测到调用数据,则说明服务调用成功。

配置项参考

配置项

Key

默认值

说明

服务端地址

spring.cloud.nacos.discovery.server-addr

Nacos Server启动监听的IP地址和端口。

服务名

spring.cloud.nacos.discovery.service

${spring.application.name}

当前服务的名称。

网卡名

spring.cloud.nacos.discovery.network-interface

当IP地址未配置时,注册IP为此网卡所对应的IP地址。如果此项也未配置,则默认取第一块网卡的IP地址。

注册的IP地址

spring.cloud.nacos.discovery.ip

高优先级。

注册的端口

spring.cloud.nacos.discovery.port

-1

默认情况下不用配置,系统会自动探测。

命名空间

spring.cloud.nacos.discovery.namespace

不同环境的注册逻辑隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

Metadata

spring.cloud.nacos.discovery.metadata

使用Map格式配置,您可以根据自己需要自定义和服务相关的元数据信息。

集群

spring.cloud.nacos.discovery.cluster-name

DEFAULT

配置Nacos集群名称。

接入点

spring.cloud.nacos.discovery.endpoint

地域的某个服务的入口域名,通过此域名可以动态地获取服务端地址,此配置在部署到SAE时无需填写。

是否集成Ribbon

ribbon.nacos.enabled

true

如果没有明确需求,不需要修改。

更多关于Spring Cloud Alibaba Nacos Discovery的信息,请参见开源版本的Spring Cloud Alibaba Nacos Discovery

更多信息

SAE部署应用完成后,您可以对应用进行如下操作。

操作

相关文档

更新、扩缩容、启停、删除应用等生命周期管理的操作

管理应用生命周期

自动弹性伸缩、CLB绑定和批量启停等提升应用性能的操作

日志管理、监控管理、应用事件查看和变更记录查看等聚焦应用运行状态的操作

阿里云首页 Serverless 应用引擎 相关技术圈