本文以包含服务提供者和服务消费者的 Spring Cloud微服务应用为例,让您快速体验如何在 MSE上构建 ZooKeeper、Eureka 和 Nacos 等服务注册中心,实现应用的服务注册与发现,以及消费者对提供者的调用。

前提条件

在 MSE 上创建服务注册中心

本文以在 MSE 构建 Nacos 为例。

说明
  1. 登录 MSE 控制台
  2. 实例列表左上角单击创建实例
  3. 创建实例对话框设置实例参数,并单击创建
    MSE创建Nacos实例
    • 地域:选择华东1(杭州)
    • 引擎类型:选择 Nacos
    • 版本:选择 1.1.3
    • 网络类型:选择公网实例
    • 规格:选择 1核 2G(磁盘60)× 3节点
    创建完成后,如果所创建的 Nacos 状态为运行中,表示 Nacos 创建完成。在MSE创建Nacos完成

    其中访问列对应的mse.XX.nacos.mse.aliyuncs.com为 Nacos 访问地址。

创建服务提供者

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

  1. 创建命名为nacos-service-provider的 Maven 工程。
  2. pom.xml 文件中添加依赖。

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

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
        <relativePath/>
    </parent>
    
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
    
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>                  

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

    • 如果使用 Spring Cloud Finchley 版本,对应 Spring Cloud Alibaba 版本为 2.0.1.RELEASE。
    • 如果使用 Spring Cloud Edgware 版本,对应 Spring Cloud Alibaba 版本为 1.5.1.RELEASE。
    说明 Spring Cloud Edgware 版本的生命周期已结束,不推荐使用这个版本开发应用。
  3. src\main\java下创建名为com.aliware.edasPackage
  4. com.aliware.edas 中创建服务提供者的启动类 ProviderApplication,并添加如下代码。

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

    package com.aliware.edas;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    
    @SpringBootApplication
        @EnableDiscoveryClient
        public class ProviderApplication {
    
            public static void main(String[] args) {
                SpringApplication.run(ProviderApplication.class, args);
            }
        }             
  5. 在 Packagecom.aliware.edas中创建EchoController,指定 URL mapping 为 {/echo/{String}},指定 HTTP 方法为 GET,方法参数从 URL 路径中获得,回显收到的参数。
    package com.aliware.edas;
    
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class EchoController {
       @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
        public String echo(@PathVariable String string) {
           return string;
          }
    }              
  6. src\main\resources路径下创建文件application.properties,在application.properties中添加如下配置,并指定 Nacos Server 的访问地址。
    spring.application.name=service-provider
    server.port=18081
    spring.cloud.nacos.discovery.server-addr=mse.XX.nacos.mse.aliyuncs.com:8848               

    其中mse.XX.nacos.mse.aliyuncs.com为在 MSE 上传创建的 Nacos 的外网访问地址,如下图所示。

    在MSE创建Nacos完成
  7. 验证结果。
    1. 执行nacos-service-providerProviderApplicationmain函数,启动应用。
    2. 登录 MSE 控制台
    3. 在左侧导航树中单击实例列表,并在实例列表页单击已创建的 MSE 实例。
    4. 设置 MSE 引擎访问白名单。
      如果没有填写任何 IP 地址及掩码,表示允许所有地址均可访问该实例。本文以无白名单为例。
    5. 在实例详情页面的左侧导航树,单击服务管理
      如果在服务管理列表中存在所 Provider 服务表示,该服务注册成功。SpringCloud应用使用mse创建的nacos服务注册成功

创建服务消费者

本内容除介绍服务注册的功能,还将介绍 Nacos 服务发现与 RestTemplate 和 FeignClient 两个客户端如何配合使用。

  1. 创建命名为nacos-service-consumer的 Maven 工程。
  2. pom.xml中添加依赖。
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
        <relativePath/>
    </parent>
    
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>
    
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>        
  3. src\main\java下创建名为 com.aliware.edasPackage
  4. com.aliware.edas中配置 RestTemplate 和 FeignClient。
    1. 在 Packagecom.aliware.edas 中创建一个接口类EchoService,添加@FeignClient注解,并配置对应的 HTTP URL 地址及 HTTP 方法。
      package com.aliware.edas;
      
      import org.springframework.cloud.openfeign.FeignClient;
      import org.springframework.web.bind.annotation.PathVariable;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RequestMethod;
      
      @FeignClient(name = "service-provider")
      public interface EchoService {
          @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
          String echo(@PathVariable("str") String str);
      }                   
    2. com.aliware.edas 中创建启动类ConsumerApplication并添加相关配置。
      • 使用@EnableDiscoveryClient注解启用服务注册与发现。
      • 使用@EnableFeignClients注解激活 FeignClient。
      • 添加@LoadBalanced注解将 RestTemplate 与服务发现集成。
      package com.aliware.edas;
      
      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;
      import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
      import org.springframework.cloud.client.loadbalancer.LoadBalanced;
      import org.springframework.cloud.openfeign.EnableFeignClients;
      import org.springframework.context.annotation.Bean;
      import org.springframework.web.client.RestTemplate;
      
      @SpringBootApplication
      @EnableDiscoveryClient
      @EnableFeignClients
      public class ConsumerApplication {
      
          @LoadBalanced
          @Bean
          public RestTemplate restTemplate() {
              return new RestTemplate();
          }
      
          public static void main(String[] args) {
              SpringApplication.run(ConsumerApplication.class, args);
          }
      }
  5. com.aliware.edas 中创建类TestController以演示和验证服务发现功能。
    package com.aliware.edas;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    @RestController
    public class TestController {
    
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private EchoService echoService;
    
    @RequestMapping(value = "/echo-rest/{str}", method = RequestMethod.GET)
    public String rest(@PathVariable String str) {
          return restTemplate.getForObject("http://service-provider/echo/" + str,
                        String.class);
            }
    
          @RequestMapping(value = "/echo-feign/{str}", method = RequestMethod.GET)
          public String feign(@PathVariable String str) {
                return echoService.echo(str);
            }
    
        }           
  6. src\main\resources路径下创建文件application.properties,在application.properties中添加如下配置,指定 Nacos Server 的地址。
    spring.application.name=service-consumer
    server.port=18082
    spring.cloud.nacos.discovery.server-addr=mse.XX.nacos.mse.aliyuncs.com:8848

    其中mse.XX.nacos.mse.aliyuncs.com为在 MSE 上传创建的 Nacos 的外网访地址,如下图所示。

    在MSE创建Nacos完成
  7. 验证结果。
    1. 执行nacos-service-consumerConsumerApplicationmain 函数,启动应用。
    2. 登录 MSE 控制台
    3. 在左侧导航树中单击实例列表,并在实例列表页单击已创建的 MSE 实例。
    4. 设置 MSE 引擎访问白名单。
      如果没有填写任何 IP 地址及掩码,表示允许所有地址均可访问该实例。本文以无白名单为例。
    5. 在实例详情页面的左侧导航树单击服务管理

      如果在服务管理列表中存在所 Consumer 服务表示,该服务注册成功。

      SpringCloud应用使用mse创建的nacos服务注册成功-consumer

本地测试

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

  • Linux/Unix/Mac 系统:运行以下命令。
    curl http://127.0.0.1:18082/echo-rest/rest-rest
    curl 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

本示例以Windows系统为例。

Spring Cloud微服务应用是使用MSE调用成功

常见问题

  • 本地开发的 Spring Cloud 微服务应用,其服务注册中心为 MSE 上创建的 Nacos,应用运行后,在 MSE 服务管理页面看不到服务信息,如何处理?

    您需要对您的应用访问进行白名单配置,具体请参见为实例设置白名单

    MSE 默认设置为127.0.0.1/32 ,表示禁止所有地址的访问。

  • 示例中支持那些 Spring Cloud 版本?

    示例中使用的 Spring Cloud 版本为 Greenwich,对应的 Spring Cloud Alibaba 版本为 2.1.1.RELEASE。Spring Cloud Finchley 对应的 Spring Cloud Alibaba 版本为 2.0.1.RELEASE,Spring Cloud Edgware 对应的 Spring Cloud Alibaba 版本为 1.5.1.RELEASE。

    说明 Spring Cloud Edgware 版本的生命周期已结束,不推荐使用这个版本开发应用。