🔥关注墨瑾轩,带你探索编程的奥秘!🚀
🔥超萌技术攻略,轻松晋级编程高手🚀
🔥技术宝库已备好,就等你来挖掘🚀
🔥订阅墨瑾轩,智趣学习不孤单🚀
🔥即刻启航,编程之旅更有趣🚀
** Java中间件与微服务的“组合拳”**
第一章:微服务架构VS单体架构——一场“变形记”
问题:为什么你的Java应用像“胖大海”?
答案:
微服务架构是单体架构的“变形金刚”!
-
单体架构缺点:
- “胖大海”式臃肿:一个应用包里塞满用户、订单、支付等模块。
- “一损俱损”:一个模块出问题,整个系统瘫痪。
- “龟速迭代”:新功能开发像给大象穿针线。
-
微服务架构优势:
- “乐高积木”式灵活:拆分成小服务,独立开发、部署、扩展。
- “故障隔离”:一个服务挂了,其他服务照常运转。
- “闪电迭代”:团队并行开发,效率翻倍!
第二章:搭建微服务基础——3步启动“服务宇宙”
目标:用Spring Boot创建第一个微服务!
步骤1:安装依赖
# 创建Maven项目,添加Spring Boot starter依赖
mvn archetype:generate \
-DgroupId=com.example \
-DartifactId=service-discovery \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DinteractiveMode=false
步骤2:编写服务注册中心(Eureka)
// application.yml配置
server:
port: 8761
eureka:
client:
fetch-registry: false
register-with-eureka: false
// 启动类添加@EnableEurekaServer注解
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
步骤3:创建第一个微服务(User Service)
// pom.xml添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
// application.yml配置
server:
port: 8081
spring:
application:
name: user-service
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
// 控制器代码
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public String getUser(@PathVariable String id) {
return "User " + id + " found!";
}
}
// 启动类添加@EnableEurekaClient注解
@SpringBootApplication
@EnableEurekaClient
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
运行效果:
- 访问
http://localhost:8081/users/123
→ 返回 “User 123 found!” - 访问
http://localhost:8761
→ Eureka控制台显示注册的服务!
第三章:核心中间件集成——5大“瑞士军刀”详解
1. 服务注册与发现(Eureka)——“交通指挥官”
// 服务发现配置示例
// 在消费者服务中添加@LoadBalanced注解
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
// 通过服务名调用
@Autowired
private RestTemplate restTemplate;
@GetMapping("/call-user-service")
public String callUserService() {
return restTemplate.getForObject("http://user-service/users/1", String.class);
}
2. 配置中心(Spring Cloud Config)——“远程遥控器”
// 配置中心服务配置
// git仓库存放配置文件(如user-service-dev.properties)
spring:
config:
import: configserver:http://localhost:8888
// 配置中心启动类
@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
// 微服务读取配置
// application.yml添加:
spring:
application:
name: user-service
cloud:
config:
uri: http://localhost:8888
3. API网关(Spring Cloud Gateway)——“流量守门人”
// 网关路由配置
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/users/**
// 启动类添加@EnableGateway注解
@SpringBootApplication
@EnableGateway
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
// 现在访问:http://localhost:9090/api/users/1 → 转发到user-service!
4. 容错与熔断(Hystrix)——“安全气囊”
// 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
// 控制器添加@HystrixCommand
@HystrixCommand(fallbackMethod = "fallbackMethod")
@GetMapping("/call-user-service")
public String callUserService() {
return restTemplate.getForObject("http://user-service/users/1", String.class);
// 定义降级方法
public String fallbackMethod() {
return "服务不可用!";
}
5. 消息队列(RabbitMQ)——“异步快递员”
// 生产者代码
@Autowired
private RabbitTemplate rabbitTemplate;
@PostMapping("/send-message")
public String sendMessage(@RequestBody String message) {
rabbitTemplate.convertAndSend("user-queue", message);
return "Message sent!";
// 消费者代码
@RabbitListener(queues = "user-queue")
public void receiveMessage(String message) {
System.out.println("Received: " + message);
}
第四章:实战案例——电商系统微服务化改造
目标:将单体电商系统拆分为用户、订单、库存3个微服务!
步骤1:拆分服务
// 用户服务(User Service)
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public User getUser(@PathVariable String id) {
// 从数据库查询用户
}
}
// 订单服务(Order Service)
@RestController
@RequestMapping("/orders")
public class OrderController {
@PostMapping
public Order createOrder(@RequestBody Order order) {
// 创建订单并调用库存服务
}
}
// 库存服务(Inventory Service)
@RestController
@RequestMapping("/inventory")
public class InventoryController {
@PostMapping("/reduce/{productId}")
public boolean reduceStock(@PathVariable String productId, @RequestParam int quantity) {
// 减少库存
}
}
步骤2:服务间通信(Feign)
// 订单服务调用库存服务
@FeignClient(name = "inventory-service")
public interface InventoryClient {
@PostMapping("/inventory/reduce/{productId}")
boolean reduceStock(@PathVariable String productId, @RequestParam int quantity);
}
// 在订单服务中使用
@Autowired
private InventoryClient inventoryClient;
@PostMapping
public Order createOrder(@RequestBody Order order) {
boolean success = inventoryClient.reduceStock(order.getProductId(), order.getQuantity());
if (success) {
// 保存订单
}
}
步骤3:全链路监控(Sleuth + Zipkin)
// 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
// 配置Zipkin服务
spring.zipkin.base-url=http://localhost:9411
运行效果:
- 订单服务调用库存服务时,请求链路在Zipkin中清晰可见!
- 故障时快速定位是库存服务超时还是网络问题!
第五章:性能优化与常见问题——“微服务避坑指南”
Q1:服务雪崩怎么办?
A:
- 熔断+降级:用Hystrix + 本地缓存返回。
- 隔离级别:设置线程池隔离不同服务。
Q2:分布式事务如何保证?
A:
- 最终一致性:用消息队列+补偿机制。
- Saga模式:分阶段提交,失败回滚。
Q3:配置中心如何动态更新?
A:
// 配置中心添加@RefreshScope
@RefreshScope
@Configuration
public class DynamicConfig {
@Value("${custom.config}")
private String configValue;
}
Q4:服务间通信卡顿?
A:
- 负载均衡:Eureka + Ribbon自动分配。
- 缓存:Redis缓存高频数据。
第六章:微服务架构VS单体架构——数据对比
维度 | 单体架构 | 微服务架构 |
---|---|---|
开发效率 | 低(耦合严重) | 高(并行开发) |
扩展性 | 差(整体部署) | 强(按需扩容) |
故障影响 | 全系统瘫痪 | 局部影响(如订单服务故障) |
部署复杂度 | 简单(单个JAR) | 复杂(需Docker/K8s) |
学习成本 | 低 | 高(需掌握中间件) |