From 17f4bc075245770151ee4d4a92b268fa38a57359 Mon Sep 17 00:00:00 2001
From: qyx <565485304@qq.com>
Date: Fri, 20 Sep 2024 20:31:00 +0800
Subject: [PATCH] =?UTF-8?q?feat(master):=E7=89=A9=E6=B5=81=E5=BE=AE?=
=?UTF-8?q?=E6=9C=8D=E5=8A=A1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
代码完成
---
.../README.md | 1 +
.../pom.xml | 97 +++++++++++++++++++
.../org/example/LogisticsApplication.java | 21 ++++
.../example/dao/EcommerceLogisticsDao.java | 10 ++
.../example/entity/EcommerceLogistics.java | 70 +++++++++++++
.../example/service/LogisticsServiceImpl.java | 46 +++++++++
.../java/org/example/sink/LogisticsSink.java | 19 ++++
.../src/main/resources/bootstrap.yml | 77 +++++++++++++++
.../src/main/resources/file.conf | 65 +++++++++++++
.../src/main/resources/registry.conf | 17 ++++
.../resources/sql/t_ecommerce_logistics.sql | 11 +++
.../README.md | 2 +-
pom.xml | 1 +
13 files changed, 436 insertions(+), 1 deletion(-)
create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/README.md
create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/pom.xml
create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/java/org/example/LogisticsApplication.java
create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/java/org/example/dao/EcommerceLogisticsDao.java
create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/java/org/example/entity/EcommerceLogistics.java
create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/java/org/example/service/LogisticsServiceImpl.java
create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/java/org/example/sink/LogisticsSink.java
create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/resources/bootstrap.yml
create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/resources/file.conf
create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/resources/registry.conf
create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/resources/sql/t_ecommerce_logistics.sql
diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/README.md b/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/README.md
new file mode 100644
index 0000000..2003990
--- /dev/null
+++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/README.md
@@ -0,0 +1 @@
+# 物流微服务
\ No newline at end of file
diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/pom.xml b/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/pom.xml
new file mode 100644
index 0000000..727ab6f
--- /dev/null
+++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/pom.xml
@@ -0,0 +1,97 @@
+
+
+ 4.0.0
+
+ org.example
+ dev-protocol
+ 1.0-SNAPSHOT
+ ../../pom.xml
+
+
+ dev-protocol-springcloud-project-logistics-service
+ 1.0-SNAPSHOT
+ jar
+
+
+ 8
+ 8
+ UTF-8
+
+
+
+ dev-protocol-springcloud-project-logistics-service
+ 物流服务
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-zipkin
+
+
+ org.springframework.kafka
+ spring-kafka
+ 2.5.0.RELEASE
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+
+ org.springframework.cloud
+ spring-cloud-stream
+
+
+ org.springframework.cloud
+ spring-cloud-stream-binder-kafka
+
+
+
+ mysql
+ mysql-connector-java
+ 8.0.12
+ runtime
+
+
+ org.example
+ dev-protocol-springcloud-project-service-config
+ 1.0-SNAPSHOT
+
+
+ org.example
+ dev-protocol-springcloud-project-service-sdk
+ 1.0-SNAPSHOT
+
+
+
+
+
+ ${artifactId}
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ repackage
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/java/org/example/LogisticsApplication.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/java/org/example/LogisticsApplication.java
new file mode 100644
index 0000000..ac965ec
--- /dev/null
+++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/java/org/example/LogisticsApplication.java
@@ -0,0 +1,21 @@
+package org.example;
+
+import org.example.conf.DataSourceProxyAutoConfiguration;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.context.annotation.Import;
+import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
+
+/**
+ *
物流微服务启动入口
+ * */
+@Import(DataSourceProxyAutoConfiguration.class) // 用于分布式事务的数据源配置
+@EnableJpaAuditing
+@EnableDiscoveryClient
+@SpringBootApplication
+public class LogisticsApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(LogisticsApplication.class, args);
+ }
+}
\ No newline at end of file
diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/java/org/example/dao/EcommerceLogisticsDao.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/java/org/example/dao/EcommerceLogisticsDao.java
new file mode 100644
index 0000000..37d575f
--- /dev/null
+++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/java/org/example/dao/EcommerceLogisticsDao.java
@@ -0,0 +1,10 @@
+package org.example.dao;
+
+import org.example.entity.EcommerceLogistics;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+/**
+ * EcommerceLogistics Dao 接口定义
+ * */
+public interface EcommerceLogisticsDao extends JpaRepository {
+}
diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/java/org/example/entity/EcommerceLogistics.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/java/org/example/entity/EcommerceLogistics.java
new file mode 100644
index 0000000..c49156b
--- /dev/null
+++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/java/org/example/entity/EcommerceLogistics.java
@@ -0,0 +1,70 @@
+package org.example.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.LastModifiedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EntityListeners;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.util.Date;
+
+/**
+ * 物流表实体类定义
+ * */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Entity
+@EntityListeners(AuditingEntityListener.class)
+@Table(name = "t_dev_protocol_cloud_logistics")
+public class EcommerceLogistics {
+
+ /** 自增主键 */
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @Column(name = "id", nullable = false)
+ private Long id;
+
+ /** 用户 id */
+ @Column(name = "user_id", nullable = false)
+ private Long userId;
+
+ /** 订单 id */
+ @Column(name = "order_id", nullable = false)
+ private Long orderId;
+
+ /** 用户地址 id */
+ @Column(name = "address_id", nullable = false)
+ private Long addressId;
+
+ /** 备注信息(json 存储) */
+ @Column(name = "extra_info", nullable = false)
+ private String extraInfo;
+
+ /** 创建时间 */
+ @CreatedDate
+ @Column(name = "create_time", nullable = false)
+ private Date createTime;
+
+ /** 更新时间 */
+ @LastModifiedDate
+ @Column(name = "update_time", nullable = false)
+ private Date updateTime;
+
+ public EcommerceLogistics(Long userId, Long orderId, Long addressId, String extraInfo) {
+
+ this.userId = userId;
+ this.orderId = orderId;
+ this.addressId = addressId;
+ this.extraInfo = StringUtils.isNotBlank(extraInfo) ? extraInfo : "{}";
+ }
+}
diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/java/org/example/service/LogisticsServiceImpl.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/java/org/example/service/LogisticsServiceImpl.java
new file mode 100644
index 0000000..977e141
--- /dev/null
+++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/java/org/example/service/LogisticsServiceImpl.java
@@ -0,0 +1,46 @@
+package org.example.service;
+
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.example.dao.EcommerceLogisticsDao;
+import org.example.entity.EcommerceLogistics;
+import org.example.order.LogisticsMessage;
+import org.example.sink.LogisticsSink;
+import org.springframework.cloud.stream.annotation.EnableBinding;
+import org.springframework.cloud.stream.annotation.StreamListener;
+import org.springframework.messaging.handler.annotation.Payload;
+
+/**
+ * 物流服务实现
+ * */
+@Slf4j
+@EnableBinding(LogisticsSink.class)
+public class LogisticsServiceImpl {
+
+ private final EcommerceLogisticsDao logisticsDao;
+
+ public LogisticsServiceImpl(EcommerceLogisticsDao logisticsDao) {
+ this.logisticsDao = logisticsDao;
+ }
+
+ /**
+ * 订阅监听订单微服务发送的物流消息
+ * */
+ @StreamListener("logisticsInput")
+ public void consumeLogisticsMessage(@Payload Object payload) {
+
+ log.info("receive and consume logistics message: [{}]", payload.toString());
+ LogisticsMessage logisticsMessage = JSON.parseObject(
+ payload.toString(), LogisticsMessage.class
+ );
+ EcommerceLogistics ecommerceLogistics = logisticsDao.save(
+ new EcommerceLogistics(
+ logisticsMessage.getUserId(),
+ logisticsMessage.getOrderId(),
+ logisticsMessage.getAddressId(),
+ logisticsMessage.getExtraInfo()
+ )
+ );
+ log.info("consume logistics message success: [{}]", ecommerceLogistics.getId());
+ }
+}
diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/java/org/example/sink/LogisticsSink.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/java/org/example/sink/LogisticsSink.java
new file mode 100644
index 0000000..9910e2c
--- /dev/null
+++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/java/org/example/sink/LogisticsSink.java
@@ -0,0 +1,19 @@
+package org.example.sink;
+
+import org.springframework.cloud.stream.annotation.Input;
+import org.springframework.messaging.SubscribableChannel;
+
+/**
+ * 自定义物流信息接收器(Sink)
+ * */
+public interface LogisticsSink {
+
+ /** 输入信道名称 */
+ String INPUT = "logisticsInput";
+
+ /**
+ * 物流 Sink -> logisticsInput
+ * */
+ @Input(LogisticsSink.INPUT)
+ SubscribableChannel logisticsInput();
+}
diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/resources/bootstrap.yml b/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/resources/bootstrap.yml
new file mode 100644
index 0000000..815dc97
--- /dev/null
+++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/resources/bootstrap.yml
@@ -0,0 +1,77 @@
+server:
+ port: 8004
+ servlet:
+ context-path: /dev-protocol-springcloud-project-logistics-service
+
+spring:
+ main:
+ allow-bean-definition-overriding: true
+ application:
+ name: dev-protocol-springcloud-project-logistics-service
+ cloud:
+ stream:
+ kafka:
+ binder:
+ brokers: 127.0.0.1:9092
+ auto-create-topics: true
+ bindings:
+ logisticsInput:
+ destination: e-commerce-topic # kafka topic
+ content-type: text/plain
+ alibaba:
+ seata:
+ tx-service-group: dev-protocol # seata 全局事务分组
+ nacos:
+ discovery:
+ enabled: true # 如果不想使用 Nacos 进行服务注册和发现, 设置为 false 即可
+ server-addr: 127.0.0.1:8848
+ # server-addr: 127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850 # Nacos 服务器地址
+ namespace: 1ccc74ae-9398-4dbe-b9d7-4f9addf9f40c
+ # 引入 sleuth + zipkin + kafka
+ kafka:
+ bootstrap-servers: 127.0.0.1:9092
+ producer:
+ retries: 3
+ consumer:
+ auto-offset-reset: latest
+ sleuth:
+ sampler:
+ probability: 1.0 # 采样比例, 1.0 表示 100%, 默认是 0.1
+ zipkin:
+ sender:
+ type: kafka # 默认是 http
+ base-url: http://localhost:9411/
+ jpa:
+ show-sql: true
+ hibernate:
+ ddl-auto: none
+ properties:
+ hibernate.show_sql: true
+ hibernate.format_sql: true
+ open-in-view: false
+ datasource:
+ # 数据源
+ url: jdbc:mysql://127.0.0.1:3306/imooc_e_commerce?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
+ username: root
+ password: root
+ type: com.zaxxer.hikari.HikariDataSource
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ # 连接池
+ hikari:
+ maximum-pool-size: 8
+ minimum-idle: 4
+ idle-timeout: 30000
+ connection-timeout: 30000
+ max-lifetime: 45000
+ auto-commit: true
+ pool-name: devProtocolSpringcloudHikariCP
+
+# 暴露端点
+management:
+ endpoints:
+ web:
+ exposure:
+ include: '*'
+ endpoint:
+ health:
+ show-details: always
diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/resources/file.conf b/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/resources/file.conf
new file mode 100644
index 0000000..4e03188
--- /dev/null
+++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/resources/file.conf
@@ -0,0 +1,65 @@
+## transaction log store, only used in seata-server
+store {
+ ## store mode: file、db、redis
+ mode = "db"
+
+ ## file store property
+ file {
+ ## store location dir
+ dir = "sessionStore"
+ # branch session size , if exceeded first try compress lockkey, still exceeded throws exceptions
+ maxBranchSessionSize = 16384
+ # globe session size , if exceeded throws exceptions
+ maxGlobalSessionSize = 512
+ # file buffer size , if exceeded allocate new buffer
+ fileWriteBufferCacheSize = 16384
+ # when recover batch read size
+ sessionReloadReadSize = 100
+ # async, sync
+ flushDiskMode = async
+ }
+
+ ## database store property
+ db {
+ ## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp)/HikariDataSource(hikari) etc.
+ datasource = "druid"
+ ## mysql/oracle/postgresql/h2/oceanbase etc.
+ dbType = "mysql"
+ driverClassName = "com.mysql.jdbc.Driver"
+ url = "jdbc:mysql://127.0.0.1:3306/seata?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false"
+ user = "root"
+ password = "root"
+ minConn = 5
+ maxConn = 100
+ globalTable = "global_table"
+ branchTable = "branch_table"
+ lockTable = "lock_table"
+ queryLimit = 100
+ maxWait = 5000
+ }
+
+ ## redis store property
+ redis {
+ host = "127.0.0.1"
+ port = "6379"
+ password = ""
+ database = "0"
+ minConn = 1
+ maxConn = 10
+ maxTotal = 100
+ queryLimit = 100
+ }
+
+}
+
+service {
+ vgroupMapping.imooc-ecommerce = "default"
+ default.grouplist = "127.0.0.1:8091"
+}
+client {
+ async.commit.buffer.limit = 10000
+ lock {
+ retry.internal = 10
+ retry.times = 30
+ }
+}
diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/resources/registry.conf b/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/resources/registry.conf
new file mode 100644
index 0000000..f2a5df2
--- /dev/null
+++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/resources/registry.conf
@@ -0,0 +1,17 @@
+registry {
+ # file、nacos、eureka、redis、zk、consul
+ type = "file"
+
+ file {
+ name = "file.conf"
+ }
+
+}
+
+config {
+ type = "file"
+
+ file {
+ name = "file.conf"
+ }
+}
diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/resources/sql/t_ecommerce_logistics.sql b/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/resources/sql/t_ecommerce_logistics.sql
new file mode 100644
index 0000000..15fa647
--- /dev/null
+++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service/src/main/resources/sql/t_ecommerce_logistics.sql
@@ -0,0 +1,11 @@
+-- 创建 t_ecommerce_logistics 数据表
+CREATE TABLE IF NOT EXISTS `dev_protocol_springcloud_project`.`t_dev_protocol_cloud_logistics` (
+ `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
+ `user_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '用户 id',
+ `order_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '订单 id',
+ `address_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '用户地址记录 id',
+ `extra_info` varchar(512) NOT NULL COMMENT '备注信息(json 存储)',
+ `create_time` datetime NOT NULL DEFAULT '0000-01-01 00:00:00' COMMENT '创建时间',
+ `update_time` datetime NOT NULL DEFAULT '0000-01-01 00:00:00' COMMENT '更新时间',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COMMENT='物流表';
diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/README.md b/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/README.md
index 4275898..2fabc27 100644
--- a/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/README.md
+++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/README.md
@@ -1,4 +1,4 @@
# 订单微服务
-##
\ No newline at end of file
+## 12. 订单微服务总结
diff --git a/pom.xml b/pom.xml
index 0abec51..bc97e08 100644
--- a/pom.xml
+++ b/pom.xml
@@ -65,6 +65,7 @@
dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard
dev-protocol-springcloud/dev-protocol-springcloud-message-study
dev-protocol-springcloud/dev-protocol-springcloud-project-order-service
+ dev-protocol-springcloud/dev-protocol-springcloud-project-logistics-service