ljx преди 2 месеца
ревизия
bad9828b48
променени са 50 файла, в които са добавени 1159 реда и са изтрити 0 реда
  1. 8 0
      .idea/.gitignore
  2. 26 0
      .idea/compiler.xml
  3. 21 0
      .idea/encodings.xml
  4. 25 0
      .idea/jarRepositories.xml
  5. 22 0
      .idea/misc.xml
  6. 124 0
      .idea/uiDesigner.xml
  7. 10 0
      .idea/vcs.xml
  8. 110 0
      order/pom.xml
  9. 23 0
      order/src/main/java/com/springcloud/market/order/OrderApplication.java
  10. 18 0
      order/src/main/java/com/springcloud/market/order/conf/MybatisPlusConfig.java
  11. 94 0
      order/src/main/java/com/springcloud/market/order/controller/OrderController.java
  12. 15 0
      order/src/main/java/com/springcloud/market/order/feign/StockFeignService.java
  13. 9 0
      order/src/main/java/com/springcloud/market/order/mapper/OrderMapper.java
  14. 15 0
      order/src/main/java/com/springcloud/market/order/pojo/Order.java
  15. 9 0
      order/src/main/java/com/springcloud/market/order/service/OrderService.java
  16. 31 0
      order/src/main/java/com/springcloud/market/order/service/OrderTimeoutSender.java
  17. 45 0
      order/src/main/java/com/springcloud/market/order/service/impl/OrderServiceImpl.java
  18. 68 0
      order/src/main/resources/application.yml
  19. 12 0
      order/src/main/resources/bootstrap.yml
  20. 68 0
      order/target/classes/application.yml
  21. 12 0
      order/target/classes/bootstrap.yml
  22. BIN
      order/target/classes/com/springcloud/market/order/OrderApplication.class
  23. BIN
      order/target/classes/com/springcloud/market/order/conf/MybatisPlusConfig.class
  24. BIN
      order/target/classes/com/springcloud/market/order/controller/OrderController.class
  25. BIN
      order/target/classes/com/springcloud/market/order/feign/StockFeignService.class
  26. BIN
      order/target/classes/com/springcloud/market/order/mapper/OrderMapper.class
  27. BIN
      order/target/classes/com/springcloud/market/order/pojo/Order.class
  28. BIN
      order/target/classes/com/springcloud/market/order/service/OrderService.class
  29. BIN
      order/target/classes/com/springcloud/market/order/service/OrderTimeoutSender.class
  30. BIN
      order/target/classes/com/springcloud/market/order/service/impl/OrderServiceImpl.class
  31. 112 0
      pom.xml
  32. 61 0
      stock/pom.xml
  33. 15 0
      stock/src/main/java/com/springcloud/market/stock/StockApplication.java
  34. 18 0
      stock/src/main/java/com/springcloud/market/stock/conf/MybatisPlusConfig.java
  35. 32 0
      stock/src/main/java/com/springcloud/market/stock/controller/StockController.java
  36. 9 0
      stock/src/main/java/com/springcloud/market/stock/mapper/StockMapper.java
  37. 15 0
      stock/src/main/java/com/springcloud/market/stock/pojo/Stock.java
  38. 5 0
      stock/src/main/java/com/springcloud/market/stock/service/StockService.java
  39. 21 0
      stock/src/main/java/com/springcloud/market/stock/service/UserRegisterMessageHandler.java
  40. 20 0
      stock/src/main/java/com/springcloud/market/stock/service/impl/StockServiceImpl.java
  41. 43 0
      stock/src/main/resources/application.yml
  42. 43 0
      stock/target/classes/application.yml
  43. BIN
      stock/target/classes/com/springcloud/market/stock/StockApplication.class
  44. BIN
      stock/target/classes/com/springcloud/market/stock/conf/MybatisPlusConfig.class
  45. BIN
      stock/target/classes/com/springcloud/market/stock/controller/StockController.class
  46. BIN
      stock/target/classes/com/springcloud/market/stock/mapper/StockMapper.class
  47. BIN
      stock/target/classes/com/springcloud/market/stock/pojo/Stock.class
  48. BIN
      stock/target/classes/com/springcloud/market/stock/service/StockService.class
  49. BIN
      stock/target/classes/com/springcloud/market/stock/service/UserRegisterMessageHandler.class
  50. BIN
      stock/target/classes/com/springcloud/market/stock/service/impl/StockServiceImpl.class

+ 8 - 0
.idea/.gitignore

@@ -0,0 +1,8 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml

+ 26 - 0
.idea/compiler.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <annotationProcessing>
+      <profile default="true" name="Default" enabled="true" />
+      <profile name="Maven default annotation processors profile" enabled="true">
+        <sourceOutputDir name="target/generated-sources/annotations" />
+        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
+        <outputRelativeToContentRoot value="true" />
+        <module name="pay" />
+        <module name="stock" />
+        <module name="common" />
+        <module name="user" />
+        <module name="gateway" />
+        <module name="order" />
+      </profile>
+    </annotationProcessing>
+    <bytecodeTargetLevel>
+      <module name="common (1)" target="17" />
+      <module name="common (2)" target="17" />
+      <module name="order (1)" target="17" />
+      <module name="order (2)" target="17" />
+      <module name="sentinel" target="17" />
+    </bytecodeTargetLevel>
+  </component>
+</project>

+ 21 - 0
.idea/encodings.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding">
+    <file url="file://$PROJECT_DIR$/common/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/common/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/gateway/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/gateway/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/order/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/order/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/pay/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/pay/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/sentinel/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/sentinel/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/stock/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/stock/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/user/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/user/src/main/resources" charset="UTF-8" />
+  </component>
+</project>

+ 25 - 0
.idea/jarRepositories.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RemoteRepositoriesConfiguration">
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="https://repo.maven.apache.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Maven Central repository" />
+      <option name="url" value="https://repo1.maven.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="jboss.community" />
+      <option name="name" value="JBoss Community repository" />
+      <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="https://maven.aliyun.com/repository/public" />
+    </remote-repository>
+  </component>
+</project>

+ 22 - 0
.idea/misc.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+        <option value="$PROJECT_DIR$/user/pom.xml" />
+        <option value="$PROJECT_DIR$/common/pom.xml" />
+        <option value="$PROJECT_DIR$/gateway/pom.xml" />
+      </list>
+    </option>
+    <option name="ignoredFiles">
+      <set>
+        <option value="$PROJECT_DIR$/sentinel/pom.xml" />
+      </set>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/out" />
+  </component>
+</project>

+ 124 - 0
.idea/uiDesigner.xml

@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Palette2">
+    <group name="Swing">
+      <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
+      </item>
+      <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
+        <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
+        <initial-values>
+          <property name="text" value="Button" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="RadioButton" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="CheckBox" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="Label" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
+          <preferred-size width="-1" height="20" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
+      </item>
+    </group>
+  </component>
+</project>

+ 10 - 0
.idea/vcs.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/common" vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/gateway" vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/pay" vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/user" vcs="Git" />
+  </component>
+</project>

+ 110 - 0
order/pom.xml

@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.springcloud</groupId>
+        <artifactId>xuexi</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+
+    <groupId>org.springcloud</groupId>
+    <artifactId>order</artifactId>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>jakarta.annotation</groupId>
+            <artifactId>jakarta.annotation-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-bootstrap</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springcloud</groupId>
+            <artifactId>common</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
+            <version>3.5.6</version>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>8.0.30</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.csp</groupId>
+            <artifactId>sentinel-transport-simple-http</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.csp</groupId>
+            <artifactId>sentinel-datasource-nacos</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 23 - 0
order/src/main/java/com/springcloud/market/order/OrderApplication.java

@@ -0,0 +1,23 @@
+package com.springcloud.market.order;
+
+import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.client.RestTemplateBuilder;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.client.loadbalancer.LoadBalanced;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.Bean;
+import org.springframework.web.client.RestTemplate;
+
+@SpringBootApplication
+@EnableFeignClients
+@EnableDiscoveryClient
+@EnableDubbo
+@MapperScan("com.springcloud.market.order.mapper")
+public class OrderApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(OrderApplication.class, args);
+    }
+}

+ 18 - 0
order/src/main/java/com/springcloud/market/order/conf/MybatisPlusConfig.java

@@ -0,0 +1,18 @@
+package com.springcloud.market.order.conf;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class MybatisPlusConfig {
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        // 分页插件(必须指定数据库类型)
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
+        return interceptor;
+    }
+}

+ 94 - 0
order/src/main/java/com/springcloud/market/order/controller/OrderController.java

@@ -0,0 +1,94 @@
+package com.springcloud.market.order.controller;
+
+import com.alibaba.csp.sentinel.Entry;
+import com.alibaba.csp.sentinel.SphU;
+import com.alibaba.csp.sentinel.Tracer;
+import com.alibaba.csp.sentinel.annotation.SentinelResource;
+import com.alibaba.csp.sentinel.slots.block.BlockException;
+import com.alibaba.csp.sentinel.slots.block.RuleConstant;
+import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
+import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
+import com.springcloud.market.order.pojo.Order;
+import com.springcloud.market.order.service.OrderService;
+import com.springcloud.market.user.service.UserService;
+import com.springcloud.market.order.feign.StockFeignService;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import jakarta.annotation.PostConstruct;
+import java.util.ArrayList;
+import java.util.List;
+
+@RestController
+@RefreshScope
+@RequestMapping("/order")
+public class OrderController {
+    @Autowired
+    private StockFeignService stockFeignService;
+    @DubboReference
+    private UserService userService;
+    @Autowired
+    private OrderService orderService;
+    @Value("${user.name:defaultName}")
+    private String name;
+    @Value("${user.age:0}")
+    private Integer age;
+
+    @RequestMapping("/add")
+    public String add(){
+        return stockFeignService.reduce();
+    }
+
+    @RequestMapping("/add2")
+    public Order add2(@RequestBody Order order){
+        return orderService.create(order);
+    }
+
+    @RequestMapping("/info")
+    public String info(){
+            System.out.println("获取用户信息: 用户: " + name + ", 年龄: " + age);
+            return "name:" + name + " age:" + age;
+    }
+
+    @RequestMapping("/getUserInfo")
+    public String getUserInfo(){
+        return userService.getUserInfo();
+    }
+
+
+    // 定义资源点,并指定降级处理函数
+    @GetMapping("/createOrder")
+    @SentinelResource(value = "orderApi", blockHandler = "handleFlowBlock")
+    public String createOrder() {
+        return "订单创建成功! (Time: " + System.currentTimeMillis() + ")";
+    }
+
+    // 降级处理函数,原方法被限流时会被调用
+    public String handleFlowBlock(BlockException ex) {
+        return "请求过于频繁,请稍后再试! (触发限流)";
+    }
+
+    @GetMapping("/getUser")
+    @SentinelResource(value = "userApi", blockHandler = "handleDegradeBlock")
+    public String getUser(){
+        // 模拟业务逻辑:随机产生异常,模拟服务不稳定
+        if (Math.random() > 0.7) {
+            throw new RuntimeException("查询用户信息失败,数据库异常");
+        }
+        return userService.getUserInfo();
+    }
+    public String handleDegradeBlock(BlockException ex) {
+        return "服务暂时不可用,请稍后重试! (触发熔断)";
+    }
+
+    @GetMapping("/createOrder2")
+    public Order createOrder2() {
+        return orderService.createOrder();
+    }
+}

+ 15 - 0
order/src/main/java/com/springcloud/market/order/feign/StockFeignService.java

@@ -0,0 +1,15 @@
+package com.springcloud.market.order.feign;
+
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@FeignClient(name = "stock", path = "/stock")
+public interface StockFeignService {
+    @RequestMapping("/reduce")
+    String reduce();
+
+    @PostMapping("/reduce2")
+    String reduce2(@RequestParam("productId")Integer productId);
+}

+ 9 - 0
order/src/main/java/com/springcloud/market/order/mapper/OrderMapper.java

@@ -0,0 +1,9 @@
+package com.springcloud.market.order.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.springcloud.market.order.pojo.Order;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface OrderMapper extends BaseMapper<Order> {
+}

+ 15 - 0
order/src/main/java/com/springcloud/market/order/pojo/Order.java

@@ -0,0 +1,15 @@
+package com.springcloud.market.order.pojo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("order_tb")
+public class Order {
+    private Integer id;
+    private Integer productId;
+}

+ 9 - 0
order/src/main/java/com/springcloud/market/order/service/OrderService.java

@@ -0,0 +1,9 @@
+package com.springcloud.market.order.service;
+
+import com.springcloud.market.order.pojo.Order;
+
+public interface OrderService {
+    public Order create(Order order);
+
+    public Order createOrder();
+}

+ 31 - 0
order/src/main/java/com/springcloud/market/order/service/OrderTimeoutSender.java

@@ -0,0 +1,31 @@
+package com.springcloud.market.order.service;
+
+import lombok.extern.slf4j.Slf4j; // 推荐使用Lombok
+import org.springframework.cloud.stream.function.StreamBridge;
+import org.springframework.messaging.support.MessageBuilder;
+import org.springframework.stereotype.Service;
+
+@Slf4j // 添加此注解
+@Service
+public class OrderTimeoutSender {
+    private final StreamBridge streamBridge;
+    private static final String DELAY_LEVEL = "3";
+    public OrderTimeoutSender(StreamBridge streamBridge) {
+        this.streamBridge = streamBridge;
+    }
+    public void sendOrderTimeoutMessage(String orderId) {
+        // 发送前打日志
+        log.info("尝试发送订单超时消息,订单ID: {}", orderId);
+
+        boolean sent = streamBridge.send("orderCancelProducer-out-0",
+                MessageBuilder.withPayload(orderId)
+                        .setHeader("DELAY", DELAY_LEVEL)
+                        .build());
+        // 根据发送结果打日志
+        if (sent) {
+            log.info("订单超时消息发送成功,订单ID: {}", orderId);
+        } else {
+            log.error("订单超时消息发送失败,订单ID: {}", orderId);
+        }
+    }
+}

+ 45 - 0
order/src/main/java/com/springcloud/market/order/service/impl/OrderServiceImpl.java

@@ -0,0 +1,45 @@
+package com.springcloud.market.order.service.impl;
+
+import com.springcloud.market.order.feign.StockFeignService;
+import com.springcloud.market.order.mapper.OrderMapper;
+import com.springcloud.market.order.pojo.Order;
+import com.springcloud.market.order.service.OrderService;
+import com.springcloud.market.order.service.OrderTimeoutSender;
+import io.seata.spring.annotation.GlobalTransactional;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+public class OrderServiceImpl implements OrderService {
+    @Autowired
+    private OrderMapper orderMapper;
+    @Autowired
+    private StockFeignService stockFeignService;
+    @Autowired
+    private OrderTimeoutSender orderTimeoutSender;
+    @GlobalTransactional
+    @Override
+    public Order create(Order order) {
+        orderMapper.insert(order);
+        String msg = stockFeignService.reduce2(order.getProductId());
+        System.out.println(msg);
+        //故意异常
+        int i = 1/0;
+        return order;
+    }
+
+    @Override
+    public Order createOrder() {
+        Integer orderId = 202; // 假设这是生成的订单ID
+        //发送延迟消息
+        try {
+            orderTimeoutSender.sendOrderTimeoutMessage(orderId.toString());
+        } catch (Exception e) {
+            // 记录日志,但通常不应回滚主业务
+            System.err.println("发送超时消息失败: " + e.getMessage());
+        }
+        //返回订单信息。可在订单中加上状态字段,如未支付则取消订单,如支付则执行已支付的逻辑(发送已支付消息,已支付消费者执行)
+        return new Order(orderId, 203);
+    }
+}

+ 68 - 0
order/src/main/resources/application.yml

@@ -0,0 +1,68 @@
+server:
+  port: 18071
+
+spring:
+  application:
+    name: order
+  cloud:
+    nacos:
+      discovery:
+        server-addr: localhost:8848
+    sentinel:
+      transport:
+        dashboard: localhost:8858
+      datasource:
+        flow:
+          nacos:
+            server-addr: localhost:8848
+            data-id: sentinel-flow-rules
+            group-id: SENTINEL_GROUP
+            data-type: json
+            rule-type: flow
+        degrade:
+          nacos:
+            server-addr: localhost:8848
+            data-id: sentinel-degrade-rules
+            group-id: SENTINEL_GROUP
+            data-type: json
+            rule-type: degrade
+    function:
+      definition: orderCancelProducer # 定义函数式绑定(生产者)
+    stream:
+      rocketmq:
+        binder:
+          name-server: 127.0.0.1:9876 # RocketMQ NameServer地址
+      bindings:
+        orderCancelProducer-out-0: # 生产者输出通道
+          destination: order-timeout-topic # Topic名称
+          content-type: application/json
+          group: order-producer-group
+
+dubbo:
+  application:
+      name: order-consumer
+  registry:
+      address: nacos://localhost:8848?register-consumer-url=true
+  consumer:
+    check: false
+  cloud:
+      subscribed-services: user-provider
+
+seata:
+  tx-service-group: order_tx_group
+  service:
+    vgroup-mapping:
+      order_tx_group: default
+  registry:
+    type: nacos
+    nacos:
+      server-addr: localhost:8848
+      group: SEATA_GROUP
+      namespace: public
+  config:
+    nacos:
+      server-addr: localhost:8848
+      group: SEATA_GROUP
+      namespace: public
+
+

+ 12 - 0
order/src/main/resources/bootstrap.yml

@@ -0,0 +1,12 @@
+spring:
+  application:
+    name: order
+  profiles:
+    active: public
+  cloud:
+    nacos:
+      config:
+        file-extension: yaml
+        server-addr: localhost:8848
+
+#该文件优于application启动

+ 68 - 0
order/target/classes/application.yml

@@ -0,0 +1,68 @@
+server:
+  port: 18071
+
+spring:
+  application:
+    name: order
+  cloud:
+    nacos:
+      discovery:
+        server-addr: localhost:8848
+    sentinel:
+      transport:
+        dashboard: localhost:8858
+      datasource:
+        flow:
+          nacos:
+            server-addr: localhost:8848
+            data-id: sentinel-flow-rules
+            group-id: SENTINEL_GROUP
+            data-type: json
+            rule-type: flow
+        degrade:
+          nacos:
+            server-addr: localhost:8848
+            data-id: sentinel-degrade-rules
+            group-id: SENTINEL_GROUP
+            data-type: json
+            rule-type: degrade
+    function:
+      definition: orderCancelProducer # 定义函数式绑定(生产者)
+    stream:
+      rocketmq:
+        binder:
+          name-server: 127.0.0.1:9876 # RocketMQ NameServer地址
+      bindings:
+        orderCancelProducer-out-0: # 生产者输出通道
+          destination: order-timeout-topic # Topic名称
+          content-type: application/json
+          group: order-producer-group
+
+dubbo:
+  application:
+      name: order-consumer
+  registry:
+      address: nacos://localhost:8848?register-consumer-url=true
+  consumer:
+    check: false
+  cloud:
+      subscribed-services: user-provider
+
+seata:
+  tx-service-group: order_tx_group
+  service:
+    vgroup-mapping:
+      order_tx_group: default
+  registry:
+    type: nacos
+    nacos:
+      server-addr: localhost:8848
+      group: SEATA_GROUP
+      namespace: public
+  config:
+    nacos:
+      server-addr: localhost:8848
+      group: SEATA_GROUP
+      namespace: public
+
+

+ 12 - 0
order/target/classes/bootstrap.yml

@@ -0,0 +1,12 @@
+spring:
+  application:
+    name: order
+  profiles:
+    active: public
+  cloud:
+    nacos:
+      config:
+        file-extension: yaml
+        server-addr: localhost:8848
+
+#该文件优于application启动

BIN
order/target/classes/com/springcloud/market/order/OrderApplication.class


BIN
order/target/classes/com/springcloud/market/order/conf/MybatisPlusConfig.class


BIN
order/target/classes/com/springcloud/market/order/controller/OrderController.class


BIN
order/target/classes/com/springcloud/market/order/feign/StockFeignService.class


BIN
order/target/classes/com/springcloud/market/order/mapper/OrderMapper.class


BIN
order/target/classes/com/springcloud/market/order/pojo/Order.class


BIN
order/target/classes/com/springcloud/market/order/service/OrderService.class


BIN
order/target/classes/com/springcloud/market/order/service/OrderTimeoutSender.class


BIN
order/target/classes/com/springcloud/market/order/service/impl/OrderServiceImpl.class


+ 112 - 0
pom.xml

@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>com.springcloud</groupId>
+    <artifactId>xuexi</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <packaging>pom</packaging>
+    <name>xuexi</name>
+    <description>xuexi</description>
+    <modules>
+        <module>order</module>
+        <module>stock</module>
+        <module>user</module>
+        <module>common</module>
+        <module>gateway</module>
+        <module>pay</module>
+    </modules>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>17</java.version>
+        <spring-boot.version>3.2.8</spring-boot.version>
+        <spring-cloud.version>2023.0.3</spring-cloud.version>
+        <spring-cloud-alibaba.version>2023.0.1.2</spring-cloud-alibaba.version>
+        <dubbo.version>3.2.5</dubbo.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
+        </dependency>
+
+    </dependencies>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>com.alibaba.cloud</groupId>
+                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
+                <version>${spring-cloud-alibaba.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>${spring-cloud.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-bom</artifactId>
+                <version>${dubbo.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.1</version>
+                <configuration>
+                    <source>17</source>
+                    <target>17</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <mainClass>com.springcloud.xuexi.XuexiApplication</mainClass>
+                    <skip>true</skip>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>repackage</id>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 61 - 0
stock/pom.xml

@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.springcloud</groupId>
+        <artifactId>xuexi</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+
+    <groupId>org.springcloud</groupId>
+    <artifactId>stock</artifactId>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
+            <version>3.5.6</version>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>8.0.30</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>

+ 15 - 0
stock/src/main/java/com/springcloud/market/stock/StockApplication.java

@@ -0,0 +1,15 @@
+package com.springcloud.market.stock;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+
+@SpringBootApplication
+@EnableDiscoveryClient
+@MapperScan("com.springcloud.market.stock.mapper")
+public class StockApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(StockApplication.class, args);
+    }
+}

+ 18 - 0
stock/src/main/java/com/springcloud/market/stock/conf/MybatisPlusConfig.java

@@ -0,0 +1,18 @@
+package com.springcloud.market.stock.conf;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class MybatisPlusConfig {
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        // 分页插件(必须指定数据库类型)
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
+        return interceptor;
+    }
+}

+ 32 - 0
stock/src/main/java/com/springcloud/market/stock/controller/StockController.java

@@ -0,0 +1,32 @@
+package com.springcloud.market.stock.controller;
+
+import com.springcloud.market.stock.service.StockService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/stock")
+public class StockController {
+    @Value("${server.port}")
+    String port;
+
+    @Autowired
+    private StockService stockService;
+
+    @RequestMapping("/reduce")
+    public String reduce() {
+        System.out.println("扣减库存");
+        return "扣减库存"+port;
+    }
+
+    @PostMapping("/reduce2")
+    public String reduce2(@RequestParam("productId")Integer productId) {
+        stockService.reduce(productId);
+        System.out.println("扣减库存");
+        return "扣减库存"+port;
+    }
+}

+ 9 - 0
stock/src/main/java/com/springcloud/market/stock/mapper/StockMapper.java

@@ -0,0 +1,9 @@
+package com.springcloud.market.stock.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.springcloud.market.stock.pojo.Stock;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface StockMapper extends BaseMapper<Stock> {
+}

+ 15 - 0
stock/src/main/java/com/springcloud/market/stock/pojo/Stock.java

@@ -0,0 +1,15 @@
+package com.springcloud.market.stock.pojo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("stock_tb")
+public class Stock {
+    private Integer id;
+    private Integer count;
+}

+ 5 - 0
stock/src/main/java/com/springcloud/market/stock/service/StockService.java

@@ -0,0 +1,5 @@
+package com.springcloud.market.stock.service;
+
+public interface StockService {
+    public void reduce(Integer productId);
+}

+ 21 - 0
stock/src/main/java/com/springcloud/market/stock/service/UserRegisterMessageHandler.java

@@ -0,0 +1,21 @@
+package com.springcloud.market.stock.service;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+import java.util.function.Consumer;
+
+@Slf4j
+@Service
+public class UserRegisterMessageHandler {
+    @Bean
+    public Consumer<Map<String, Object>> userRegisterConsumer() {
+        return message -> {
+            String phoneNumber = (String) message.get("phoneNumber");
+            log.info("收到用户注册消息,开始发放礼品,库存-1,手机号: {}", phoneNumber);
+            // 省略真正扣库存发放礼品逻辑
+        };
+    }
+}

+ 20 - 0
stock/src/main/java/com/springcloud/market/stock/service/impl/StockServiceImpl.java

@@ -0,0 +1,20 @@
+package com.springcloud.market.stock.service.impl;
+
+import com.springcloud.market.stock.mapper.StockMapper;
+import com.springcloud.market.stock.pojo.Stock;
+import com.springcloud.market.stock.service.StockService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class StockServiceImpl implements StockService {
+    @Autowired
+    private StockMapper stockMapper;
+    @Override
+    public void reduce(Integer productId) {
+        Stock stock = stockMapper.selectById(productId);
+        stock.setCount(stock.getCount()-1);
+        stockMapper.updateById(stock);
+    }
+}
+

+ 43 - 0
stock/src/main/resources/application.yml

@@ -0,0 +1,43 @@
+server:
+  port: 18081
+spring:
+  application:
+    name: stock
+  cloud:
+    function:
+      definition: userRegisterConsumer
+    stream:
+      rocketmq:
+        binder:
+          name-server: 127.0.0.1:9876
+      bindings:
+        userRegisterConsumer-in-0:
+          destination: user-register-topic # 与生产者Topic名称一致
+          content-type: application/json
+          group: stock-service-group # 消费者组,用于集群消费和负载均衡
+    nacos:
+      discovery:
+        server-addr: localhost:8848
+
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://127.0.0.1:3306/stock_xuexi?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8
+    username: root
+    password: 123456
+
+seata:
+  tx-service-group: stock_tx_group
+  service:
+    vgroup-mapping:
+      stock_tx_group: default
+  registry:
+    type: nacos
+    nacos:
+      server-addr: localhost:8848
+      group: SEATA_GROUP
+      namespace: public
+  config:
+    nacos:
+      server-addr: localhost:8848
+      group: SEATA_GROUP
+      namespace: public

+ 43 - 0
stock/target/classes/application.yml

@@ -0,0 +1,43 @@
+server:
+  port: 18081
+spring:
+  application:
+    name: stock
+  cloud:
+    function:
+      definition: userRegisterConsumer
+    stream:
+      rocketmq:
+        binder:
+          name-server: 127.0.0.1:9876
+      bindings:
+        userRegisterConsumer-in-0:
+          destination: user-register-topic # 与生产者Topic名称一致
+          content-type: application/json
+          group: stock-service-group # 消费者组,用于集群消费和负载均衡
+    nacos:
+      discovery:
+        server-addr: localhost:8848
+
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://127.0.0.1:3306/stock_xuexi?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8
+    username: root
+    password: 123456
+
+seata:
+  tx-service-group: stock_tx_group
+  service:
+    vgroup-mapping:
+      stock_tx_group: default
+  registry:
+    type: nacos
+    nacos:
+      server-addr: localhost:8848
+      group: SEATA_GROUP
+      namespace: public
+  config:
+    nacos:
+      server-addr: localhost:8848
+      group: SEATA_GROUP
+      namespace: public

BIN
stock/target/classes/com/springcloud/market/stock/StockApplication.class


BIN
stock/target/classes/com/springcloud/market/stock/conf/MybatisPlusConfig.class


BIN
stock/target/classes/com/springcloud/market/stock/controller/StockController.class


BIN
stock/target/classes/com/springcloud/market/stock/mapper/StockMapper.class


BIN
stock/target/classes/com/springcloud/market/stock/pojo/Stock.class


BIN
stock/target/classes/com/springcloud/market/stock/service/StockService.class


BIN
stock/target/classes/com/springcloud/market/stock/service/UserRegisterMessageHandler.class


BIN
stock/target/classes/com/springcloud/market/stock/service/impl/StockServiceImpl.class