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 消息队列。 ⏎