本文以包含服务提供者和服务消费者的 Spring Cloud 应用为例,让您快速体验如何在本地开发、调试 Spring Cloud 应用并部署到 SAE 中,实现应用的服务注册与发现,以及消费者对提供者的调用。

背景信息

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

Spring Cloud Alibaba Nacos Discovery 实现了 Spring Cloud Registry 的标准接口与规范,与 Spring Cloud 接入 Eureka、Consul、ZooKeeper 等组件实现服务注册与发现的方式一致。

使用开源版本 Spring Cloud Alibaba Nacos Discovery 开发的应用部署到 SAE 上,可以享受商业版的 SAE 服务注册中心的优势和能力。

SAE 服务注册中心,与 Nacos、Eureka 和 Consul 相比,具有以下优势:
  • 共享组件,节省了您部署、运维 Nacos、Eureka 或 Consul 的成本。
  • 对服务注册和发现的调用均进行了链路加密,保护您的服务安全性,无需担心服务被未授权的应用发现。
  • SAE 服务注册中心与 SAE 其他组件紧密结合,为您提供一套完整的微服务解决方案,包括环境隔离、平滑上下线、灰度发布等。

前提条件

下载最新版本的 Nacos Server,并按以下步骤启动 Nacos Server。
  1. 解压已下载的 Nacos Server 压缩包。
  2. 进入nacos/bin目录,启动 Nacos Server。
    • Linux/Unix/Mac 系统:执行命令sh startup.sh -m standalone
    • Windows 系统:双击执行startup.cmd文件。

步骤一:获取 Demo

eureka-service-provider eureka-service-consumer是SAE提供的2个 Demo ,二者均为已经接入 Eureka 服务注册与发现的 Spring Cloud 应用,您需要下载到本地完成后续操作。

步骤二: Provider 应用侧操作

将原来的应用托管到 SAE 中,需要在 Provider 应用程序中添加 pom 依赖,并指定 Nacos Server 的 IP 地址。
  1. 添加 pom 依赖。

    打开 Provider 应用的 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.0.RELEASE</version>
    </dependency>
    							
    说明
    • 本示例中使用的版本为 Spring Cloud Greenwich,对应 spring-cloud-starter-alibaba-nacos-discovery 版本为 2.1.0.RELEASE
    • 如果您使用的是 Spring Cloud Finchley 版本,对应 spring-cloud-starter-alibaba-nacos-discovery 版本为 2.0.0.RELEASE
    • 如果使用的是 Spring Cloud Edgware 版本,对应 spring-cloud-starter-alibaba-nacos-discovery 版本为 1.5.0.RELEASE
  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 控制台http://127.0.0.1:8848/nacos,在左侧导航栏中选择服务管理 > 服务列表 ,可以看到服务列表中包含了service-provider,且在详情中可以查询该服务的详情。
      说明 本地 Nacos 控制台的默认用户名和密码均为 nacos

步骤三: Consumer 应用侧操作

将原来的应用托管到 SAE 中,需要在 Consumer 应用程序中添加 pom 依赖,并指定 Nacos Server 的IP地址。
  1. 添加 pom 依赖。

    在 Consumer 应用的 pom.xml 文件中,将 spring-cloud-starter-netflix-eureka-server 替换成 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.0.RELEASE</version>
    </dependency>
    							
    说明
    • 本示例中使用的版本为 Spring Cloud Greenwich,对应 spring-cloud-starter-alibaba-nacos-discovery 版本为 2.1.0.RELEASE
    • 如果您使用的是 Spring Cloud Finchley 版本,对应 spring-cloud-starter-alibaba-nacos-discovery 版本为 2.0.0.RELEASE
    • 如果使用的是 Spring Cloud Edgware 版本,对应 spring-cloud-starter-alibaba-nacos-discovery 版本为 1.5.0.RELEASE
  2. 修改配置。

    打开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. 执行eureka-service-providerConsumerApplication.java,启动应用。
    2. 登录本地启动的 Nacos Server 控制台http://127.0.0.1:8848/nacos,在左侧导航栏中选择服务管理 > 服务列表 ,可以看到服务列表中已经包含了service-consumer,且在详情中可以查询该服务的详情。
      说明 本地 Nacos 控制台的默认用户名和密码均为 nacos

步骤四:查看调用结果

在本地测试消费者对提供者的服务调用结果。启动服务,执行 IP + port / echo-rest / 自定义变量IP + port / echo-feign / 自定义变量 查看调用结果。
  • Linux/Unix/Mac 系统:执行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/{自定义变量}

步骤五:将应用部署到 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. 参照部署微服务应用到 SAE,分别将在步骤二: Provider 应用侧操作步骤二: Provider 应用侧操作修改依赖配置后的两个应用包部署至 SAE。
    注意
    • SAE 暂不支持创建空应用,故第一次部署需在控制台完成。
    • 如果使用 JAR 包部署,在应用部署配置时应用运行环境必需选择标准 Java 应用运行环境
    • 如果使用 WAR 包部署,在应用部署配置时应用运行环境必需选择apache-tomcat-XXX

    当您将应用部署到 SAE 时,SAE 服务注册中心会以高优先级去自动设置 Nacos Server 服务端地址和服务端口,以及 namespace、access-key、secret-key、context-path 等信息。您无需进行任何额外的配置,原有的配置内容可以选择保留或删除。

步骤六:结果验证

  1. 为 Consumer 应用绑定公网 SLB,并在浏览器键入所设置的公网访问地址,进入应用首页。
  2. 在应用首页发起调用请求,然后登录 SAE 控制台,进入消费者应用详情页面。
  3. 在左侧导航栏选择应用监控 > 应用总览,查看服务调用数据总览。当能够监测到调用数据则说明服务调用成功。

配置项参考

配置项 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 地址 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.enpoint UTF-8 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址,此配置在部署到 EDAS 时无需填写。
是否集成 Ribbon ribbon.nacos.enabled true 一般不需要修改

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