← 返回首页

Java微服务架构入门

📂 java ⏱ 3 min 414 words

Java微服务架构入门

什么是微服务

微服务是一种架构风格,将单体应用拆分为一组小型、独立部署的服务,每个服务运行在自己的进程中,通过轻量级机制通信。

微服务架构图

┌─────────────────────────────────────────────────────┐
│                    API Gateway                       │
├─────────────────────────────────────────────────────┤
│  User Service  │ Order Service │ Product Service     │
├─────────────────────────────────────────────────────┤
│           Service Discovery (Nacos/Eureka)           │
├─────────────────────────────────────────────────────┤
│  Config Center │ Message Queue │ Distributed Lock   │
└─────────────────────────────────────────────────────┘

设计原则

// 1. 单一职责
@Service
public class UserService { /* 只处理用户相关 */ }

@Service
public class OrderService { /* 只处理订单相关 */ }

// 2. 服务自治
// 每个服务独立数据库
// UserService → user_db
// OrderService → order_db

// 3. 轻量级通信
// REST / gRPC / 消息队列

// 4. 容错设计
// 熔断、降级、限流

Spring Boot构建微服务

@SpringBootApplication
@RestController
@RequestMapping("/api/users")
public class UserServiceApplication {

    @Autowired
    private UserRepository userRepository;

    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }

    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        return userRepository.findById(id)
            .orElseThrow(() -> new RuntimeException("用户不存在"));
    }

    @PostMapping
    public User createUser(@RequestBody User user) {
        return userRepository.save(user);
    }
}

服务间通信

REST调用

@Configuration
public class RestTemplateConfig {
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

@Service
public class OrderService {
    @Autowired
    private RestTemplate restTemplate;

    public Order createOrder(Long userId, BigDecimal amount) {
        // 调用用户服务
        User user = restTemplate.getForObject(
            "http://user-service/api/users/" + userId, User.class);

        Order order = new Order();
        order.setUserId(userId);
        order.setUserName(user.getName());
        order.setAmount(amount);
        return orderRepository.save(order);
    }
}

Feign声明式调用

@FeignClient(name = "user-service", fallbackFactory = UserClientFallbackFactory.class)
public interface UserClient {
    @GetMapping("/api/users/{id}")
    User getUser(@PathVariable("id") Long id);
}

@Component
public class UserClientFallbackFactory implements FallbackFactory<UserClient> {
    @Override
    public UserClient create(Throwable cause) {
        return new UserClient() {
            @Override
            public User getUser(Long id) {
                User user = new User();
                user.setName("默认用户");
                return user;
            }
        };
    }
}

@Service
public class OrderServiceFeign {
    @Autowired
    private UserClient userClient;

    public Order createOrder(Long userId, BigDecimal amount) {
        User user = userClient.getUser(userId);
        // 创建订单...
    }
}

API Gateway

@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

// routes.yml
spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/api/users/**
        - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/api/orders/**

配置中心

// Nacos配置
@RefreshScope
@RestController
public class ConfigController {
    @Value("${app.feature.enabled:false}")
    private boolean featureEnabled;

    @GetMapping("/config")
    public Map<String, Object> getConfig() {
        return Map.of("featureEnabled", featureEnabled);
    }
}

服务发现

// Nacos服务注册
spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

// 服务调用
RestTemplate restTemplate = new RestTemplate();
User user = restTemplate.getForObject(
    "http://user-service/api/users/1", User.class);

熔断降级

@Component
public class UserClientFallback implements UserClient {
    @Override
    public User getUser(Long id) {
        return new User(id, "降级用户", "降级数据");
    }
}

// Resilience4j熔断
@CircuitBreaker(name = "user-service", fallbackMethod = "getUserFallback")
public User getUser(Long id) {
    return restTemplate.getForObject(
        "http://user-service/api/users/" + id, User.class);
}

public User getUserFallback(Long id, Exception e) {
    return new User(id, "默认用户", "服务暂时不可用");
}

总结

微服务架构需要配套的基础设施:服务发现、配置中心、网关、熔断器等。Spring Cloud提供了完整的解决方案,适合构建企业级微服务系统。