Spring Cloud 微服务架构概述
Spring Cloud 是一套基于 Spring Boot 构建的微服务生态体系,它为开发者提供了一套完整的解决方案,帮助构建面向终端消费者的应用软件。当一个应用已经初步建立起来并且团队规模不断扩大时,采用 Spring Cloud 可以更好地处理后端服务的可用性、稳定性和提高开发人员之间的协作效率。通过将大型单体应用拆分为多个小型、独立的服务(即微服务架构),每个服务可以独立地开发、部署和扩展,从而提高了整个系统的灵活性和可维护性。
例如,在一个电商网站中,我们可以把订单管理、用户认证、库存控制等功能分别作为单独的服务来实现。这些服务之间通过定义良好的接口进行交互和服务调用,这样即使某个服务出现故障也不会影响到其他服务正常运行。此外,Spring Cloud 提供了诸如服务发现与配置中心、断路器机制等特性,进一步增强了系统的健壮性。总的来说,Spring Cloud 为构建复杂且高度分布式的系统提供了强大的支持。
Spring Cloud Alibaba组件概览
Spring Cloud Alibaba 是 Spring Cloud 的一个本地化实践,它结合了阿里巴巴在 Java 应用开发领域的多年经验,为业务的持续发展提供支持。以下是 Spring Cloud Alibaba 的主要组件介绍:
- 服务发现与配置中心 - Nacos:用于服务注册、发现和动态配置管理。
- 分布式定时任务 - SchedulerX:提供分布式任务调度能力。
- 分布式事务 - Seata:实现分布式事务的一致性解决方案。
- 限流降级 - Sentinel:提供流量控制、熔断降级等功能,保障系统的稳定性。
- 分布式消息 - RocketMQ:高性能、低延迟的消息中间件,适用于大规模消息传递场景。
- AI 集成 - Spring AI Alibaba:支持将AI功能集成到Spring应用中。
- 同构服务调用 - Dubbo:高性能的RPC框架,支持多种协议和序列化方式。
- 日志分析框架 - iLogtail:采集并处理日志数据,提供丰富的日志分析功能。
- 静态编译 - GraalVM:通过静态编译技术优化应用性能,并支持多语言运行环境。
这些组件共同构成了 Spring Cloud Alibaba 生态系统,旨在简化微服务架构下的应用开发与运维工作。
Spring Cloud Alibaba服务调用实例
spring cloud alibaba服务调用实践
依赖引入
在 pom.xml
文件中添加以下依赖,以便能够使用 Nacos 的服务注册与发现功能及 OpenFeign 进行远程服务调用:
<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>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2022.0.0.0</version> <!-- 使用最新版本 -->
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR12</version> <!-- 使用兼容的Spring Cloud版本 -->
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
服务提供者配置
首先定义一个简单的 REST API 作为服务提供者。该服务将返回传入字符串的一个简单回显。
/src/main/resources/application.properties
spring.application.name=service-provider
server.port=8081
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
class EchoController {
@GetMapping(value = "/echo/{string}")
public String echo(@PathVariable String string) {
return "Hello, " + string;
}
}
}
服务消费者配置
接下来创建一个服务消费者应用,通过 OpenFeign 调用上面的服务。
/src/main/resources/application.properties
spring.application.name=service-consumer
server.port=8080
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.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
@FeignClient(name = "service-provider")
interface EchoService {
@GetMapping("/echo/{str}")
String echo(@PathVariable("str") String str);
}
@RestController
class TestController {
@Autowired
private EchoService echoService;
@GetMapping("/call-echo/{str}")
public String callEcho(@PathVariable String str) {
return echoService.echo(str);
}
}
}
启动验证
- 确保 Nacos 服务器已启动,并且可以通过浏览器访问其控制台(默认地址:http://localhost:8848/nacos)。
- 首先运行服务提供者 (
ProviderApplication
)。 - 接着运行服务消费者 (
ConsumerApplication
)。 - 打开浏览器或使用工具如 Postman 访问
http://localhost:8080/call-echo/world
,如果一切正常,你应该看到页面返回了来自服务提供者的响应:“Hello, world”。
以上步骤详细展示了如何基于 Spring Cloud Alibaba 和 Nacos 实现一个简单的服务间调用场景。这包括从项目初始化、依赖管理、到最终的应用部署和测试全过程。
Nacos服务的安装与配置
Nacos server的安装和部署
接下来我们要将Nacos作为服务发现的核心组件进行部署,并且以阿里云MSE(微服务引擎)的免费试用为例来实现这一目标。以下是具体的步骤说明:
第一步:准备环境和资源
准备专有网络VPC和交换机
- 如果您已有适合的VPC和交换机,并且在该VPC内部署了您的微服务应用,请确保后续创建注册配置中心实例时所选的VPC与此相同。
- 若需新建VPC和交换机,请参考创建和管理专有网络。
开通微服务引擎注册配置 MSE Nacos/ZooKeeper
- 访问阿里云免费试用页面,登录或注册账号并完成实名认证。
- 选择“中间件 > 微服务引擎”类别下的“注册配置 MSE Nacos/ZooKeeper”,点击“立即试用”。
- 在配置面板中:
- 选择引擎类型为Nacos。
- 设置自定义实例名称。
- 根据您的需求选择适当的网络类型(专有网络、公网网络或者两者结合),注意如果选择公网还需额外承担公网费用。
- 指定VPC与交换机。
- 阅读并同意相关协议后提交申请。创建过程大约需要3~5分钟,完成后访问MSE控制台查看实例状态,当显示为“运行中”即表示可以开始使用。
第二步:微服务应用部署及注册
将自行开发部署的微服务应用注册到MSE Nacos
- 登录至Nacos实例列表页,找到刚创建的实例,在“访问方式”列获取Nacos实例访问地址。
- 修改您的微服务应用配置文件以指向这个新的Nacos服务器地址。对于Spring Cloud应用,这通常意味着更新
application.properties
或application.yml
中的以下设置:spring: cloud: nacos: discovery: server-addr: mse.XX.nacos.mse.aliyuncs.com:8848
- 重新启动您的微服务应用以便使更改生效。
通过上述步骤,您就完成了基于阿里云MSE服务上Nacos Server的安装与微服务应用的注册过程。