"SpringCloud笔记Day01 - 服务拆分及远程调用,Eureka,Nacos解释,黑马系列课笔记(个人)"
在微服务架构中,Spring Cloud 是一个非常重要的工具集,它提供了诸如服务发现、负载均衡、断路器等组件,帮助开发者构建分布式系统。本笔记主要关注服务拆分、远程调用以及服务注册与发现的基础概念。
## 一、服务拆分及远程调用
服务拆分是微服务架构的核心原则之一,它将大型单体应用分解为小型、独立的、专注于单一功能的微服务。服务拆分有以下几个关键点:
1. **单一职责**:每个微服务应专注于一个特定的业务领域,避免功能重复,以减少代码冗余和提高可维护性。
2. **数据独立**:每个微服务应拥有自己的数据库,避免跨服务的数据库访问,以确保数据的一致性和服务边界清晰。
3. **接口暴露**:微服务之间通过接口进行通信,而不是直接访问对方的数据库,实现松耦合。
在案例1中,我们有一个订单(order)服务和用户(user)服务。当查询订单信息时,原始的订单详情不包含用户信息。为了获取用户详情,我们需要通过用户服务的接口进行远程调用,而不能直接访问其数据库。
## 二、远程调用
远程调用是微服务间通信的关键。通常,我们可以使用 HTTP 请求来实现这一目标。以下是在 Spring Cloud 中使用 RestTemplate 进行远程调用的基本步骤:
1. **注册 RestTemplate**:在 Spring Boot 的启动类中注入 RestTemplate,以便后续使用。这可以通过 @Autowired 注解实现,或者在配置类中定义并声明为 Bean。
2. **重写业务方法**:在需要远程调用的地方,修改原有方法以发送 HTTP 请求。例如,我们可以重写 `queryOrderById` 方法,在查询订单的同时,通过用户ID去调用用户服务获取用户信息。
```java
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
// 其他相关依赖...
public Order queryOrderById(Long orderId) {
// 查询订单...
// 获取订单关联的用户信息
User user = getUserById(userId);
// 将用户信息合并到订单对象中
order.setUser(user);
return order;
}
private User getUserById(Long userId) {
// 使用 RestTemplate 发送 GET 请求到用户服务,传入 userId
// ...
}
}
```
这里,`getUserById` 方法会使用 RestTemplate 发送 HTTP 请求到用户服务的对应接口,获取用户信息,并将其附加到订单对象上,从而提供完整的订单详情。
## 三、服务注册与发现
在实际的微服务环境中,服务之间的调用需要知道对方的地址。Eureka 和 Nacos 是两种常见的服务注册与发现组件。Eureka 是 Netflix 提供的服务发现框架,而 Nacos 是阿里巴巴开源的项目,除了服务发现,还提供配置管理等功能。
- **Eureka**:每个服务启动时都会向 Eureka Server 注册自身信息,包括服务名、IP 地址、端口等。其他服务在需要调用时,通过 Eureka 查找目标服务的实例信息,进行通信。
- **Nacos**:类似 Eureka,Nacos 也是服务注册中心,但它的功能更全面,如动态配置、服务发现、健康检查等。服务启动后向 Nacos 注册,其他服务通过 Nacos API 查询服务实例并发起调用。
通过服务注册与发现,微服务可以动态地找到彼此,提高了系统的扩展性和容错性。
总结,Spring Cloud 提供了实现服务拆分、远程调用和服务发现的工具,使得构建分布式系统变得更加便捷。理解并熟练掌握这些概念和技术,对于开发高效、可靠的微服务架构至关重要。