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