微服务概述1
一、微服务架构核心概念
1. 微服务 vs 单体应用
特性 | 单体应用 | 微服务 |
---|---|---|
部署 | 一个包、一次部署 | 多个独立服务,可独立部署 |
模块耦合 | 高耦合 | 低耦合 |
技术栈 | 单一 | 可多样化 |
扩展 | 整体扩展 | 服务级别扩展 |
容错 | 整体宕机 | 单个服务宕机,不影响全局 |
数据管理 | 共享数据库 | 每个服务独立数据库 |
2. 微服务特点
- 独立性:每个服务独立运行和部署。
- 自治性:服务自己管理数据和业务逻辑。
- 弹性伸缩:可根据负载独立扩容。
- 可观测性:日志、监控和链路追踪清晰。
- 服务间通信:一般通过 REST、gRPC、消息队列。
二、Java 微服务技术栈(深度解析)
1. 核心开发框架
-
Spring Boot:快速搭建独立服务,内置 Tomcat。
-
Spring Cloud:提供微服务常用组件:
- Eureka:服务注册与发现
- Ribbon:客户端负载均衡
- Feign:声明式 REST 调用
- Gateway / Zuul:API 网关
- Config:配置中心
- Hystrix / Resilience4j:熔断、降级
2. 数据与持久化
-
每个微服务拥有自己的数据库,避免服务间耦合。
-
使用 Spring Data JPA / MyBatis 简化 ORM 操作。
-
分布式事务解决方案:
- Saga 模式:基于事件的异步事务
- TCC(Try-Confirm-Cancel):显式三步事务
3. 消息与异步通信
-
消息队列(MQ)用于异步解耦:
- RabbitMQ / Kafka / RocketMQ
-
常用于:
- 事件驱动架构(EDA)
- 异步处理(订单支付、库存更新)
4. 配置与治理
-
配置中心:Spring Cloud Config、Nacos
-
服务治理:
- 动态注册和发现
- 健康检查(Health Check)
- 负载均衡(Ribbon / Gateway)
- 熔断器与限流(Resilience4j)
5. 容器化与运维
-
Docker:打包微服务镜像
-
Kubernetes:编排和自动伸缩
-
CI/CD:Jenkins/GitHub Actions/GitLab CI 实现自动部署
-
监控与日志:
- ELK(Elasticsearch + Logstash + Kibana)
- Prometheus + Grafana
- 链路追踪:Sleuth + Zipkin 或 SkyWalking
三、微服务设计原则
-
单一职责:每个服务只做一件事。
-
去中心化:服务自治、数据独立。
-
轻量通信:REST/gRPC/消息队列,尽量避免重型 RPC。
-
容错与弹性:
- 熔断、限流、防雪崩
- 重试机制
-
可观测性:
- 集中日志
- 指标监控
- 分布式链路追踪
四、Java微服务典型架构
+--------------------+| API Gateway |+--------------------+|+---------------+----------------+| | |
+------+ +--------+ +------+
| User | | Order | |Payment|
+------+ +--------+ +------+| | |v v vUser DB Order DB Payment DB
1. API 网关
- 统一入口,负责路由、鉴权、限流。
- 技术:Spring Cloud Gateway / Zuul
2. 服务注册与发现
- 服务启动注册到 Eureka/Consul。
- 服务调用通过服务名解析实际地址。
3. 服务调用
- 同步调用:REST + Feign + Ribbon
- 异步调用:消息队列 Kafka / RabbitMQ
五、典型代码示例(Spring Boot + Spring Cloud)
1. 服务注册中心(Eureka Server)
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}
}
2. 服务提供者(User Service)
@SpringBootApplication
@EnableEurekaClient
@RestController
public class UserServiceApplication {public static void main(String[] args) {SpringApplication.run(UserServiceApplication.class, args);}@GetMapping("/user/{id}")public String getUser(@PathVariable String id) {return "User-" + id;}
}
3. 服务消费者(Order Service 调用 User Service)
@FeignClient("user-service")
public interface UserClient {@GetMapping("/user/{id}")String getUser(@PathVariable("id") String id);
}@RestController
public class OrderController {@Autowiredprivate UserClient userClient;@GetMapping("/order/{id}")public String getOrder(@PathVariable String id) {return "Order-" + id + ", " + userClient.getUser("1");}
}
六、微服务实践注意事项
-
服务拆分策略:
- 按业务领域拆分(DDD)
- 避免过度拆分(导致分布式复杂性高)
-
容错设计:
- 使用 Resilience4j 或 Spring Retry 实现熔断和重试
- 降级策略
-
分布式事务:
- Saga 或 TCC,避免跨服务锁
-
监控和追踪:
- 集中日志 + 分布式链路追踪
-
安全性:
- OAuth2 / JWT 认证
- 网关统一鉴权