Spring微服务学习笔记之Spring Cloud Alibaba远程服务调用实战

时间:2024-10-28 12:39:10

Spring微服务概述

微服务是一种架构风格,它将单个应用程序拆分为一组小型、独立的服务,每个服务实现特定的业务功能,并且可以独立部署和扩展。Spring 微服务即基于Spring Cloud框架构建的微服务应用。Spring Cloud提供了一系列工具和服务来简化分布式系统的开发,可以视为构建面向终端消费者的应用软件的一种最佳实践。例如,在一个团队开始构建Web或App应用时,随着项目的复杂度增加及团队规模扩大,传统的单体架构可能无法满足需求。此时采用服务化的方式,通过将系统分解为多个相互协作但又彼此隔离的服务,能够显著提高系统的可用性与稳定性,同时提升团队成员间的协作效率。

具体而言,当一个电商平台需要支持高并发访问以应对促销活动带来的流量激增时,利用Spring Cloud进行服务化改造就显得尤为重要。比如商品查询、订单处理、支付接口等核心功能被划分为不同的微服务后,不仅有助于分散压力、降低故障影响范围,还便于针对各个服务做精细化管理和优化。借助于Spring Cloud提供的诸如服务发现、负载均衡等功能,开发者能够轻松实现高效的服务调用,确保即使在极端情况下也能维持良好的用户体验。

Spring Cloud Alibaba概述

Spring Cloud Alibaba是Spring Cloud目前最佳的本地化实践之一,结合了阿里在Java应用开发领域多年的实践经验,为业务的可持续发展提供了坚实的保障。它包含了多个核心组件来支持微服务架构:

  • Nacos:作为服务发现与配置中心,提供动态服务注册、发现及配置管理功能。
  • Sentinel:专注于流量控制、熔断降级等容错机制,保证系统的稳定性。
  • Seata:分布式事务解决方案,确保跨服务操作的一致性。
  • RocketMQ:高效的消息中间件,适用于大规模消息处理场景。
  • Dubbo:高性能的RPC框架,简化了微服务间通信的过程。
  • SchedulerX:基于云上的分布式任务调度平台,易于管理和扩展。
  • GraalVM:用于实现静态编译,提高程序运行效率。
  • iLogtail:强大的日志收集与分析工具,便于监控系统状态。

这些组件共同构建了一个全面且高效的微服务生态系统。

Spring Cloud Alibaba远程服务调用实战

spring cloud alibaba服务调用实践

一、项目环境准备

在开始之前,请确保您已经安装了Java开发环境(JDK 1.8+)、Maven以及Nacos Server。如果还未安装Nacos,可以参考第2篇参考内容中的本地安装方式或者选择接入阿里云上的托管Nacos Server。

二、创建Maven项目

本示例将通过两个简单的Spring Boot应用来演示如何使用Spring Cloud Alibaba与Nacos实现一次远程服务调用。一个作为服务提供者(service-provider),另一个作为服务消费者(service-consumer)。两者都将注册到同一个Nacos实例上,并通过服务发现机制完成交互。

1. 服务提供者 (service-provider)

首先,我们需要构建service-provider应用。这个应用对外暴露了一个REST API接口,用于响应来自其他微服务的请求。

  • pom.xml
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>2.2.5.RELEASE</version>
    </dependency>
</dependencies>
  • application.properties (位于src/main/resources/目录下)
spring.application.name=service-provider
server.port=18082
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
  • ProviderApplication.java (启动类)
package com.example.provider;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }

    @RestController
    public static class EchoController {
        @GetMapping("/echo/{string}")
        public String echo(@PathVariable String string) {
            return "Hello, " + string + " from service-provider!";
        }
    }
}
2. 服务消费者 (service-consumer)

接下来是创建service-consumer应用,它将利用Spring Cloud LoadBalancer和OpenFeign来调用上述提供的服务。

  • pom.xml
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>2.2.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>
  • application.properties
spring.application.name=service-consumer
server.port=18083
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
  • ConsumerApplication.java
package com.example.consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}
  • EchoService.java (Feign客户端)
package com.example.consumer;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient(name = "service-provider")
public interface EchoService {
    @GetMapping("/echo/{str}")
    String echo(@PathVariable("str") String str);
}
  • TestController.java (测试控制器)
package com.example.consumer;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
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;

    @GetMapping("/echo-rest/{str}")
    public String rest(@PathVariable String str) {
        return restTemplate.getForObject("http://service-provider/echo/" + str, String.class);
    }

    @GetMapping("/echo-feign/{str}")
    public String feign(@PathVariable String str) {
        return echoService.echo(str);
    }
}

三、验证服务调用

现在,分别启动service-providerservice-consumer两个应用,并访问以下URL以确认服务调用是否成功:

  • 使用RestTemplate: http://localhost:18083/echo-rest/test
  • 使用Feign: http://localhost:18083/echo-feign/test

如果一切配置正确,您应该能看到类似于"Hello, test from service-provider!"的消息返回,这表明您的服务调用已经成功实现了!

以上步骤详细地展示了如何使用Spring Cloud Alibaba结合Nacos进行远程服务调用的过程,包括从依赖添加、基本配置设置到具体代码实现的所有细节。

Nacos服务器的安装与配置

Nacos server的安装和部署

安装 Nacos Server

首先,您需要选择是使用阿里云上的托管Nacos Server还是本地安装。对于本示例,我们将采用阿里云提供的免费MSE(微服务引擎)来快速体验Nacos服务发现的功能。

接入云上免费版本
  1. 访问阿里云免费试用页面:通过这个链接访问阿里云的免费试用服务,并登录您的阿里云账号。
  2. 找到并申请微服务引擎:在产品类别下选择“中间件 > 微服务引擎”,接着点击“注册配置 MSE Nacos/ZooKeeper”的“立即试用”按钮。
  3. 配置实例
    • 选择引擎类型为 Nacos
    • 输入自定义实例名称。
    • 在资源组中选择默认选项。
    • 如果您的应用将部署于VPC内,请选择网络类型为“专有网络”,并在下方指定相应的VPC和交换机;如果是在公网环境中,则选择“公网网络”。注意,如果您需要同时支持VPC内外的应用连接到注册配置中心,也应选择“专有网络”并配置至少1 Mbps带宽以启用公网访问。
  4. 完成创建:阅读并接受服务条款后点击“立即试用”提交您的申请。系统将自动开始创建Nacos实例,这通常需要大约3到5分钟时间。一旦实例状态变为“运行中”,即表示您可以开始使用了。

接入 Nacos 配置中心与服务发现

接下来,在您的Spring Cloud Alibaba (SCA) 应用程序中接入已创建好的Nacos实例,实现服务发现功能。

添加依赖

确保您的项目 pom.xml 中包含了如下依赖,以便引入Nacos的服务发现能力:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置服务发现

编辑 /src/main/resources/application.yaml 文件,添加Nacos服务端地址信息,以及任何其他必要的配置项。例如:

spring:
  cloud:
    nacos:
      discovery:
        server-addr: mse.XX.nacos.mse.aliyuncs.com:8848 # 使用您自己的Nacos服务器地址替换这里

请注意替换上述URL中的 mse.XX.nacos.mse.aliyuncs.com:8848 为实际从阿里云控制台获取的Nacos实例地址。

启动应用验证
  1. 按照常规方式启动您的Spring Boot应用程序,可以是直接通过IDE或构建后使用命令行。
  2. 应用成功启动后,它会自动向指定的Nacos服务器注册自身。您可以登录到Nacos控制台检查是否能看到新注册的服务。

以上步骤完成后,您的微服务就已经成功地利用了阿里云MSE上的Nacos作为其服务发现组件。这意味着不同微服务之间能够相互识别并通过服务名进行调用,而无需关心具体的IP地址等细节信息。