Section 11: 实现支付微服务 (04:32:06 - 05:24:10)

创建支付微服务 (04:32:06 - 04:51:00)

现在,让我们来创建支付微服务。 同样,我们使用 Spring Initializr 或者 IntelliJ IDEA 创建一个新的 Maven 项目,并添加以下依赖项:

  • Spring Web
  • Spring Data JPA
  • PostgreSQL Driver
  • Spring Cloud Starter Config
  • Spring Cloud Starter Netflix Eureka Client
  • Lombok
  • Spring for Apache Kafka

创建好项目后,我们需要定义实体类。

  • Payment Entity: 支付实体,包含支付的基本信息,例如支付 ID、金额、支付方式和订单 ID。
  • PaymentMethod Enum: 支付方式枚举,定义了应用程式支持的支付方式,例如 PayPal、信用卡、Visa 卡、MasterCard 和 Bitcoin。

package com.alibou.ecommerce.payment;

public enum PaymentMethod {
    PAYPAL,
    CREDIT_CARD,
    VISA_CARD,
    MASTERCARD,
    BITCOIN
}

实现支付控制器和服务 (04:51:00 - 05:12:05)

接下来,我们将实现支付控制器和服务。支付控制器负责接收来自订单微服务的支付请求,并调用支付服务来处理这些请求。支付服务则负责处理支付相关的业务逻辑,例如保存支付信息和发送支付确认消息。

@RestController
@RequestMapping("/api/v1/payments")
@RequiredArgsConstructor
public class PaymentController {

    private final PaymentService service;

    @PostMapping
    public ResponseEntity<Integer> createPayment(@RequestBody @Valid PaymentRequest request) {
        return ResponseEntity.ok(service.createPayment(request));
    }
}

package com.alibou.ecommerce.payment;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class PaymentService {

    private final PaymentRepository repository;
    private final PaymentMapper mapper;
    private final NotificationProducer notificationProducer;

    public Integer createPayment(PaymentRequest request) {
        Payment payment = mapper.toPayment(request);
        Integer paymentId = repository.save(payment).getId();

        // Send notification to Kafka
        notificationProducer.sendNotification(request);

        return paymentId;
    }
}

Kafka 配置 (05:12:05 - 05:24:10)

src/main/resources/application.yml 文件中,添加 Kafka 相关的配置:

spring:
  kafka:
    bootstrap-servers: localhost:9092
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.springframework.kafka.support.serializer.JsonSerializer
    properties:
      spring.json.type.mapping: "paymentNotificationRequest:com.alibou.ecommerce.notification.Kafka.PaymentNotificationRequest"

    consumer:
      group-id: payment-group
      auto-offset-reset: earliest
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer

    json:
      trusted:
        packages: '*' # Or specify your package

请注意以下几点:

  • spring.kafka.bootstrap-servers: Kafka 服务器的地址。
  • spring.kafka.producer.key-serializer: Kafka 消息 Key 的序列化器。
  • spring.kafka.producer.value-serializer: Kafka 消息 Value 的序列化器。
  • spring.kafka.consumer.group-id: Kafka 消费者组 ID。
  • spring.kafka.consumer.auto-offset-reset: Kafka 偏移量重置策略。
  • spring.kafka.consumer.key-deserializer: Kafka 消息 Key 的反序列化器.
  • spring.kafka.consumer.value-deserializer: Kafka 消息 Value 的反序列化器.
  • spring.kafka.properties.spring.json.trusted.packages: Kafka 信任的包名,用于反序列化消息。

src/main/resources 目录下创建 templates 文件夹,用于存放邮件模板。

完成了以上步骤后,支付微服务就配置完成了,可以接收订单微服务的支付请求,并将支付结果发送到 Kafka 消息队列。