微服务、分布式概念-以及集群部署 vs 分布式部署
微服务 是把各种服务拆分最小化, 分布式是把项目部署到多台服务器
微服务(Microservices)
微服务是一种架构风格,它的核心思想是将一个大型应用程序拆分成多个小型、独立的服务。
主要特点:
-
服务拆分最小化
- 按业务功能将系统拆分成多个小服务
- 每个服务专注于特定的业务领域
- 服务之间通过轻量级通信机制(如HTTP API)交互
-
独立性
- 每个服务可以独立开发、测试、部署和扩展
- 技术栈可以不同
- 故障隔离,一个服务的问题不会影响其他服务
-
去中心化
- 每个服务管理自己的数据存储
- 避免共享数据库
项目中的体现:
在您的项目中,可以看到微服务架构的影子:
project-common // 公共模块
project-member-server // 会员服务
project-order-server // 订单服务
...
每个服务专注于特定领域,通过Feign客户端进行服务间通信。
分布式系统(Distributed Systems)
分布式系统是指将不同的业务模块部署在不同的服务器上,通过网络进行通信和协调的系统。
主要特点:
-
物理分布
- 不同的服务可以部署在不同的服务器上
- 可以根据需求进行水平扩展
-
逻辑统一
- 虽然物理上分离,但逻辑上是一个整体系统
- 通过网络通信协调工作
-
高可用性
- 单点故障不会导致整个系统崩溃
- 可以通过负载均衡提高性能
两者关系
微服务和分布式系统不是互斥的概念,而是相互关联的:
微服务通常是分布式的
- 微服务架构天然适合分布式部署
- 每个微服务可以部署在不同的服务器上
分布式不一定是微服务
- 传统的单体应用也可以分布式部署(如集群部署)
- 但微服务架构更符合分布式系统的设计理念
项目中的实际应用
从您的项目结构可以看出:
微服务架构体现:
-
服务拆分:
- 会员服务(member-server)
- 订单服务(order-server)
- 公共模块(common)
-
独立部署:
// 服务间调用通过Feign客户端 @Component public class MarketingFeign {@Autowiredprivate DiscountClient marketingClient; // 调用营销服务 }
分布式部署体现:
-
Redis分布式缓存:
@Bean public RedisConnectionFactory redisConnectionFactory() {// Redis集群配置支持分布式部署 }
-
RabbitMQ分布式消息:
// 通过消息队列实现服务间异步通信 rabbitTemplate.convertAndSend("order.order.refund", JSON.toJSONString(refundOrder));
-
异步处理:
@Async @Override public void asyncMemberAndTeamExport(MemberAndTeamExportParams params) {// 异步处理提高系统响应性 }
总结
您的理解是正确的:
- 微服务关注的是逻辑架构的拆分,将系统按业务功能拆分成最小可独立部署的服务
- 分布式关注的是物理部署的分布,将服务部署到多台服务器上
在现代企业级应用中,这两种架构风格经常结合使用,微服务架构天然适合分布式部署,而分布式部署又能充分发挥微服务的优势,提高系统的可扩展性、可靠性和性能。
集群部署(Cluster Deployment)
集群部署是将相同的应用程序部署到多台服务器上,形成一个集群,对外提供统一的服务。
主要特点:
-
相同的应用实例
- 每台服务器上运行的是完全相同的应用程序
- 代码、配置、功能都是一样的
-
负载分担
- 通过负载均衡器将请求分发到不同的服务器
- 提高系统的处理能力和可用性
-
高可用性
- 当某台服务器出现故障时,其他服务器可以继续提供服务
- 避免单点故障
集群部署 vs 分布式部署
集群部署:
用户请求 → 负载均衡器 → [服务器1: 会员服务]→ [服务器2: 会员服务]→ [服务器3: 会员服务]
分布式部署:
用户请求 → API网关 → [服务器1: 会员服务]→ [服务器2: 订单服务]→ [服务器3: 支付服务]
集群部署的优势
1. 高可用性
// 在项目中,Redis集群配置体现了高可用思想
@Bean
public RedisConnectionFactory redisConnectionFactory() {// 配置连接池,提高Redis的可用性GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();poolConfig.setMaxIdle(100);poolConfig.setMinIdle(10);poolConfig.setMaxTotal(500);// ...
}
2. 负载均衡
// 通过配置多个服务实例实现负载均衡
@EnableDiscoveryClient // 启用服务发现,支持多个实例注册
@SpringBootApplication
public class MiniDolphinMemberServerApplication {public static void main(String[] args) {SpringApplication.run(MiniDolphinMemberServerApplication.class, args);}
}
3. 水平扩展
当系统负载增加时,可以简单地增加服务器实例来分担负载。
项目中的集群部署体现
1. 服务多实例部署
在微服务架构中,同一个服务可以部署多个实例:
会员服务实例1 (端口: 8081)
会员服务实例2 (端口: 8082)
会员服务实例3 (端口: 8083)
2. 数据库集群
// Redis连接池配置支持高并发访问
@Bean
public RedisConnectionFactory redisConnectionFactory() {GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();poolConfig.setMaxIdle(100); // 最大空闲连接poolConfig.setMinIdle(10); // 最小空闲连接poolConfig.setMaxTotal(500); // 最大连接数// ...
}
3. 消息队列集群
// RabbitMQ支持集群部署,提高消息处理能力
@Autowired
private RabbitTemplate rabbitTemplate;// 异步处理提高系统吞吐量
@Async
@Override
public void asyncMemberAndTeamExport(MemberAndTeamExportParams params) {// ...
}
集群部署的实际场景
开发环境:
通常只部署一个实例,方便调试和开发
生产环境:
[负载均衡器 Nginx]↓
[会员服务实例1] [会员服务实例2] [会员服务实例3]↓ ↓ ↓
[共享数据库] ←----------------------------------
与微服务、分布式的关系
部署方式 | 特点 | 目的 |
---|---|---|
集群部署 | 相同应用多实例 | 高可用、负载均衡 |
分布式部署 | 不同服务独立部署 | 业务解耦、技术分离 |
微服务 | 按业务功能拆分服务 | 独立开发、部署、扩展 |
总结
集群部署不是简单地把完整项目部署到多台服务器,而是:
- 相同的应用程序在多台服务器上运行
- 通过负载均衡器统一调度
- 目的是提高可用性和性能
- 是实现高并发、高可用的重要手段
在您的项目中,集群部署主要体现在:
- 同一个微服务可以部署多个实例
- Redis连接池提高并发处理能力
- 异步处理提高系统吞吐量
- 通过服务发现实现负载均衡
这种架构结合了微服务的业务拆分优势和集群部署的高可用优势,构建了一个健壮、可扩展的系统。