全部产品
云市场

将 Spring Cloud 应用托管到 EDAS

更新时间:2019-08-05 22:43:12

本文档将以一个 Spring Cloud 应用(包含一个服务提供者和一个服务消费者)为例,介绍如何在本地开发(添加依赖和所需配置)、测试,并部署到 EDAS 中,实现应用的服务注册与发现,以及消费者对提供者的调用。

  • 如果您完全不了解 Spring Cloud,只有简单的 Spring 和 Maven 基础,详细阅读本文后,您将了解如何通过 Spring Cloud Alibaba Nacos Discovery 实现 Spring Cloud 应用的服务注册与发现,以及实现消费者对提供者的调用。

  • 如果您熟悉 Spring Cloud 中的服务注册组件(如 Eureka、Consul 和 ZooKeeper),但尚未使用过 Spring Cloud Alibaba 的服务注册组件 Nacos Discovery,那么您只需要将这些服务注册组件的依赖和配置替换成 Spring Cloud Alibaba Nacos Discovery,无需修改任何代码。

    Spring Cloud Alibaba Nacos Discovery 同样实现了 Spring Cloud Registry 的标准接口与规范,和您之前使用 Spring Cloud 接入服务注册与发现的方式基本一致。

  • 如果您熟悉如何使用开源版本的 Spring Cloud Alibaba Nacos Discovery 实现 Spring Cloud 应用的服务注册与发现,那么您可以将应用直接部署到 EDAS(详情请参见将应用部署到 EDAS),即可使用到 EDAS 提供的商业版服务注册与发现的能力。

EDAS 服务注册中心提供了开源 Nacos Server 的商业化版本,使用开源版本 Spring Cloud Alibaba Nacos Discovery开发的应用可以直接使用 EDAS 提供的商业版服务注册中心。

商业版的 EDAS 服务注册中心,与 Nacos、Eureka 和 Consul 相比,具有以下优势:

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

本地开发

本地开发中主要描述开发中涉及的关键信息,如果您想了解完整的 Spring Cloud 应用程序,可下载 service-providerservice-consumer

准备工作

在开始开发前,请确保您已经完成以下工作:

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

创建服务提供者

在本地创建一个服务提供者应用工程,添加依赖,开启服务注册与发现功能,并将注册中心指定为 Nacos Server。

操作步骤

  1. 创建一个 Maven 工程,命名为nacos-service-provider

  2. pom.xml 文件中添加依赖。

    以 Spring Boot 2.1.4.RELEASE 和 Spring Cloud Greenwich.SR1 为例,依赖如下:

    1. <parent>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-parent</artifactId>
    4. <version>2.1.4.RELEASE</version>
    5. <relativePath/>
    6. </parent>
    7. <dependencies>
    8. <dependency>
    9. <groupId>com.alibaba.cloud</groupId>
    10. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    11. <version>2.1.0.RELEASE</version>
    12. </dependency>
    13. <dependency>
    14. <groupId>org.springframework.boot</groupId>
    15. <artifactId>spring-boot-starter-web</artifactId>
    16. </dependency>
    17. </dependencies>
    18. <dependencyManagement>
    19. <dependencies>
    20. <dependency>
    21. <groupId>org.springframework.cloud</groupId>
    22. <artifactId>spring-cloud-dependencies</artifactId>
    23. <version>Greenwich.SR1</version>
    24. <type>pom</type>
    25. <scope>import</scope>
    26. </dependency>
    27. </dependencies>
    28. </dependencyManagement>
    29. <build>
    30. <plugins>
    31. <plugin>
    32. <groupId>org.springframework.boot</groupId>
    33. <artifactId>spring-boot-maven-plugin</artifactId>
    34. </plugin>
    35. </plugins>
    36. </build>

    示例中使用的版本为 Spring Cloud Greenwich ,对应 Spring Cloud Alibaba 版本为 2.1.0.RELEASE。

    • 如果使用 Spring Cloud Finchley 版本,对应 Spring Cloud Alibaba 版本为 2.0.0.RELEASE。
    • 如果使用 Spring Cloud Edgware 版本,对应 Spring Cloud Alibaba 版本为 1.5.0.RELEASE。

      说明:Spring Cloud Edgware 版本的生命周期即将在 2019 年 8 月结束,不推荐使用这个版本开发应用。

  3. src\main\java下创建 Packagecom.aliware.edas

  4. 在 Packagecom.aliware.edas中创建服务提供者的启动类ProviderApplication,并添加如下代码:

    其中@EnableDiscoveryClient注解表明此应用需开启服务注册与发现功能。

    1. package com.aliware.edas;
    2. import org.springframework.boot.SpringApplication;
    3. import org.springframework.boot.autoconfigure.SpringBootApplication;
    4. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    5. @SpringBootApplication
    6. @EnableDiscoveryClient
    7. public class ProviderApplication {
    8. public static void main(String[] args) {
    9. SpringApplication.run(ProviderApplication.class, args);
    10. }
    11. }
  5. 在 Packagecom.aliware.edas中创建EchoController,指定 URL mapping 为 {/echo/{String}},指定 HTTP 方法为 GET,方法参数从 URL 路径中获得,回显收到的参数。

    1. package com.aliware.edas;
    2. import org.springframework.web.bind.annotation.PathVariable;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. import org.springframework.web.bind.annotation.RequestMethod;
    5. import org.springframework.web.bind.annotation.RestController;
    6. @RestController
    7. public class EchoController {
    8. @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
    9. public String echo(@PathVariable String string) {
    10. return string;
    11. }
    12. }
  6. src\main\resources路径下创建文件application.properties,在application.properties中添加如下配置,指定 Nacos Server 的地址。

    其中127.0.0.1为 Nacos Server 的地址。如果您的 Nacos Server 部署在另外一台机器,则需要修改成对应的 IP 地址。如果有其它需求,可以参考配置项参考application.properties文件中增加配置。

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

结果验证

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

  2. 登录本地启动的 Nacos Server 控制台http://127.0.0.1:8848/nacos(本地 Nacos 控制台的默认用户名和密码同为 nacos),在左侧导航栏中选择服务管理 > 服务列表,可以看到服务列表中已经包含了service-provider,且在详情中可以查询该服务的详情。

创建服务消费者

这一节中不仅会演示服务注册的功能,还将说明 Nacos 服务发现与 RestTemplate 和 FeignClient 这两个客户端是如何配合使用的。

操作步骤

  1. 创建一个 Maven 工程,命名为nacos-service-consumer

  2. pom.xml中添加依赖。

    1. <parent>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-parent</artifactId>
    4. <version>2.1.4.RELEASE</version>
    5. <relativePath/>
    6. </parent>
    7. <dependencies>
    8. <dependency>
    9. <groupId>com.alibaba.cloud</groupId>
    10. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    11. <version>2.1.0.RELEASE</version>
    12. </dependency>
    13. <dependency>
    14. <groupId>org.springframework.boot</groupId>
    15. <artifactId>spring-boot-starter-web</artifactId>
    16. </dependency>
    17. <dependency>
    18. <groupId>org.springframework.cloud</groupId>
    19. <artifactId>spring-cloud-starter-openfeign</artifactId>
    20. </dependency>
    21. </dependencies>
    22. <dependencyManagement>
    23. <dependencies>
    24. <dependency>
    25. <groupId>org.springframework.cloud</groupId>
    26. <artifactId>spring-cloud-dependencies</artifactId>
    27. <version>Greenwich.SR1</version>
    28. <type>pom</type>
    29. <scope>import</scope>
    30. </dependency>
    31. </dependencies>
    32. </dependencyManagement>
    33. <build>
    34. <plugins>
    35. <plugin>
    36. <groupId>org.springframework.boot</groupId>
    37. <artifactId>spring-boot-maven-plugin</artifactId>
    38. </plugin>
    39. </plugins>
    40. </build>
  3. src\main\java下创建 Packagecom.aliware.edas

  4. 在 Packagecom.aliware.edas中配置 RestTemplate 和 FeignClient。

    1. 在 Packagecom.aliware.edas 中创建一个接口类EchoService,添加@FeignClient注解,并配置对应的 HTTP URL 地址及 HTTP 方法。

      1. package com.aliware.edas;
      2. import org.springframework.cloud.openfeign.FeignClient;
      3. import org.springframework.web.bind.annotation.PathVariable;
      4. import org.springframework.web.bind.annotation.RequestMapping;
      5. import org.springframework.web.bind.annotation.RequestMethod;
      6. @FeignClient(name = "service-provider")
      7. public interface EchoService {
      8. @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
      9. String echo(@PathVariable("str") String str);
      10. }
    2. 在 Packagecom.aliware.edas 中创建启动类ConsumerApplication并添加相关配置。

      • 使用@EnableDiscoveryClient注解启用服务注册与发现。
      • 使用@EnableFeignClients注解激活 FeignClient。
      • 添加@LoadBalanced注解将 RestTemplate 与服务发现集成。
      1. package com.aliware.edas;
      2. import org.springframework.boot.SpringApplication;
      3. import org.springframework.boot.autoconfigure.SpringBootApplication;
      4. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
      5. import org.springframework.cloud.client.loadbalancer.LoadBalanced;
      6. import org.springframework.cloud.openfeign.EnableFeignClients;
      7. import org.springframework.context.annotation.Bean;
      8. import org.springframework.web.client.RestTemplate;
      9. @SpringBootApplication
      10. @EnableDiscoveryClient
      11. @EnableFeignClients
      12. public class ConsumerApplication {
      13. @LoadBalanced
      14. @Bean
      15. public RestTemplate restTemplate() {
      16. return new RestTemplate();
      17. }
      18. public static void main(String[] args) {
      19. SpringApplication.run(ConsumerApplication.class, args);
      20. }
      21. }
  5. 在 Packagecom.aliware.edas 中创建类TestController以演示和验证服务发现功能。

    1. package com.aliware.edas;
    2. import org.springframework.beans.factory.annotation.Autowired;
    3. import org.springframework.web.bind.annotation.PathVariable;
    4. import org.springframework.web.bind.annotation.RequestMapping;
    5. import org.springframework.web.bind.annotation.RequestMethod;
    6. import org.springframework.web.bind.annotation.RestController;
    7. import org.springframework.web.client.RestTemplate;
    8. @RestController
    9. public class TestController {
    10. @Autowired
    11. private RestTemplate restTemplate;
    12. @Autowired
    13. private EchoService echoService;
    14. @RequestMapping(value = "/echo-rest/{str}", method = RequestMethod.GET)
    15. public String rest(@PathVariable String str) {
    16. return restTemplate.getForObject("http://service-provider/echo/" + str,
    17. String.class);
    18. }
    19. @RequestMapping(value = "/echo-feign/{str}", method = RequestMethod.GET)
    20. public String feign(@PathVariable String str) {
    21. return echoService.echo(str);
    22. }
    23. }
  6. src\main\resources路径下创建文件application.properties,在application.properties中添加如下配置,指定 Nacos Server 的地址。

    其中127.0.0.1:8848为 Nacos Server 的地址。如果您的 Nacos Server 部署在另外一台机器,则需要修改成对应的地址。如果有其它需求,可以参考配置项参考application.properties文件中增加配置。

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

结果验证

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

  2. 登录本地启动的 Nacos Server 控制台 http://127.0.0.1:8848/nacos(本地 Nacos 控制台的默认用户名和密码同为 nacos),在左侧导航栏中选择服务管理 > 服务列表,可以看到服务列表中已经包含了service-consumer,且在详情中可以查询该服务的详情。

本地测试

在本地测试消费者对提供者的服务调用结果。

  • Linux/Unix/Mac 系统:执行curl http://127.0.0.1:18082/echo-rest/rest-restcurl http://127.0.0.1:18082/echo-feign/feign-rest

    服务调用

  • Windows系统:在浏览器中输入http://127.0.0.1:18082/echo-rest/rest-resthttp://127.0.0.1:18082/echo-feign/feign-rest

将应用部署到 EDAS

当在本地完成应用的开发和测试后,便可将应用程序打包并部署到 EDAS。您可以根据您的实际情况选择将 Spring Cloud 应用可以部署到 ECS 集群、容器服务 Kubernetes集群或 EDAS Serverless。部署应用的详细步骤请参见部署应用概述

说明:第一次部署建议通过控制台部署,且如果使用 JAR 包部署,在创建应用时应用运行环境 务必选择 标准 Java 应用运行环境

SC 应用运行环境选择

EDAS 服务注册中心提供了商业化版本 Nacos Server。当您将应用部署到 EDAS 的时候,EDAS 会通过优先级更高的方式去设置 Nacos Server 服务端地址和服务端口,以及 namespace、access-key、secret-key、context-path 信息。您无需进行任何额外的配置,原有的配置内容可以选择保留或删除。

结果验证

在部署完成之后,在 EDAS 控制台左侧导航栏选择微服务管理 > 服务查询,在服务查询页面选择地域命名空间,然后通过搜索service-providerservice-consumer查询您部署的应用。

配置项参考

配置项 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 文档

FAQ

  1. 使用其他版本

    示例中使用的 Spring Cloud 版本为 Greenwich,对应的 Spring Cloud Alibaba 版本为 2.1.0.RELEASE。Spring Cloud Finchley 对应的 Spring Cloud Alibaba 版本为 2.0.0.RELEASE,Spring Cloud Edgware 对应的 Spring Cloud Alibaba 版本为 1.5.0.RELEASE。

    说明:Spring Cloud Edgware 版本的生命周期即将在 2019 年 8 月结束,不推荐使用这个版本开发应用。

  2. 从 ANS 迁移

    EDAS 注册中心在服务端对 ANS 和 Nacos 的数据结构做了兼容,在同一个命名空间下,且 Nacos 未设置 group 时,Nacos 和 ANS 客户端可以互相发现 对方注册的服务。