Pārlūkot izejas kodu

项目启动优化

zhanghaijun 2 gadi atpakaļ
vecāks
revīzija
71b094bd74

+ 9 - 9
train-common/train-common-core/src/main/java/top/haijunit/common/config/ExceptionAdvice.java

@@ -32,30 +32,30 @@ public class ExceptionAdvice {
 
     /** 自定义验证异常 */
     @ExceptionHandler(BindException.class)
-    public ResultData BindExceptionHandler(BindException e, HttpServletRequest request) {
+    public ResultData<String> BindExceptionHandler(BindException e, HttpServletRequest request) {
         log.error("异常: BindException, 请求地址: {}, 程序异常: {}", request.getRequestURI(), e.getMessage());
         List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
         String result = allErrors.stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining(","));
-        return ResultData.fail(result);
+        return ResultData.fail(result, "");
     }
 
     /** 通用Exception异常捕获 */
     @ExceptionHandler(Exception.class)
-    public ResultData ExceptionHandler(Exception e, HttpServletRequest request) {
+    public ResultData<String> ExceptionHandler(Exception e, HttpServletRequest request) {
         log.error("异常: Exception, 请求地址: {}, 程序异常: {}", request.getRequestURI(), e.getMessage());
-        return ResultData.fail("异常: " + e.getMessage());
+        return ResultData.fail("异常: " + e.getMessage(), "");
     }
 
     /** 请求方式不支持 */
     @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
-    public ResultData handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException ex, HttpServletRequest request) {
+    public ResultData<String> handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException ex, HttpServletRequest request) {
         log.error("异常: 请求方式不支持, 请求地址: {}, 程序异常: {}", request.getRequestURI(), ex.getMessage());
-        return ResultData.fail("请求方式不支持: "+ex.getMessage());
+        return ResultData.fail("请求方式不支持: " + ex.getMessage(), "");
     }
 
     /** 校验错误拦截处理 */
     @ExceptionHandler(MethodArgumentNotValidException.class)
-    public ResultData validationBodyException(MethodArgumentNotValidException ex, HttpServletRequest request) {
+    public ResultData<String> validationBodyException(MethodArgumentNotValidException ex, HttpServletRequest request) {
         log.error("异常: 校验错误拦截处理, 请求地址: {}, 程序异常: {}", request.getRequestURI(), ex.getMessage());
         BindingResult result = ex.getBindingResult();
         if (result.hasErrors()) {
@@ -67,8 +67,8 @@ public class ExceptionAdvice {
                 map.put(fieldError.getField(), fieldError.getDefaultMessage());
             });
             log.error("异常: 校验错误拦截处理, 程序异常: {}", JSONUtil.toJsonPrettyStr(map));
-            return ResultData.fail("参数异常: " + JSONUtil.toJsonPrettyStr(map));
+            return ResultData.fail("参数异常: " + JSONUtil.toJsonPrettyStr(map), "");
         }
-        return ResultData.fail("参数异常");
+        return ResultData.fail("参数异常", "");
     }
 }

+ 18 - 16
train-common/train-common-core/src/main/java/top/haijunit/common/domain/ResultData.java

@@ -9,42 +9,44 @@ import lombok.Data;
  * @description 返回的结构体
  */
 @Data
-public class ResultData {
+public class ResultData<T> {
     public final static int CODE_SUCCESS = 200;
     public final static int CODE_FAIL = 500;
 
-    private final Integer respCode;
-    private final String respMsg;
+    private final Integer code;
+    private final String message;
     private final Long timeStamp;
+    private final T data;
 
-    public ResultData(Integer respCode, String respMsg) {
-        this(respCode, respMsg, System.currentTimeMillis());
+    public ResultData(Integer code, String message, T data) {
+        this(code, message, System.currentTimeMillis(), data);
     }
 
-    public ResultData(Integer respCode, String respMsg, Long timeStamp) {
-        this.respCode = respCode;
-        this.respMsg = respMsg;
+    public ResultData(Integer code, String message, Long timeStamp, T data) {
+        this.code = code;
+        this.message = message;
         this.timeStamp = timeStamp;
+        this.data = data;
     }
 
     public boolean codeSucceed() {
-        return this.respCode == CODE_SUCCESS;
+        return this.code == CODE_SUCCESS;
     }
 
-    public static <T> ResultData success() {
-        return new ResultData(CODE_SUCCESS, "请求成功");
+    public static <T> ResultData<T> success(T data) {
+        return new ResultData<>(CODE_SUCCESS, "请求成功", data);
     }
 
-    public static <T> ResultData success(String message) {
-        return new ResultData(CODE_SUCCESS, message);
+    public static <T> ResultData<T> success(String message, T data) {
+        return new ResultData<>(CODE_SUCCESS, message, data);
     }
 
-    public static <T> ResultData fail(String message) {
-        return new ResultData(CODE_FAIL, StrUtil.blankToDefault(message, "请求失败"));
+    public static <T> ResultData<T> fail(String message, T data) {
+        return new ResultData<>(CODE_FAIL, StrUtil.blankToDefault(message, "请求失败"), data);
     }
 
     @Override
     public String toString() {
-        return "Result{" + "resp_code=" + respCode + ", resp_msg='" + respMsg + '\'' + ", time_stamp=" + timeStamp + '}';
+        return "Result{" + "resp_code=" + code + ", resp_msg='" + message + '\'' + ", time_stamp=" + timeStamp + '}';
     }
 }

+ 12 - 0
train-server/pom.xml

@@ -17,9 +17,21 @@
             <groupId>top.haijunit</groupId>
             <artifactId>train-common-core</artifactId>
         </dependency>
+        <!-- SpringBoot Web容器 -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>spring-boot-starter-tomcat</artifactId>
+                    <groupId>org.springframework.boot</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!-- web 容器使用 undertow 性能更强 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-undertow</artifactId>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>

+ 0 - 2
train-server/src/main/java/top/haijunit/train/TrainServerMain.java

@@ -5,8 +5,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.scheduling.annotation.EnableScheduling;
 
-@EnableAsync
-@EnableScheduling
 @SpringBootApplication
 public class TrainServerMain {
 

+ 31 - 0
train-server/src/main/java/top/haijunit/train/config/UndertowConfig.java

@@ -0,0 +1,31 @@
+package top.haijunit.train.config;
+
+import io.undertow.server.DefaultByteBufferPool;
+import io.undertow.websockets.jsr.WebSocketDeploymentInfo;
+import org.springframework.boot.autoconfigure.AutoConfiguration;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.server.WebServerFactoryCustomizer;
+
+/**
+ * @author zhanghaijun
+ * @date 2023/11/7 15:40
+ * @description Undertow 自定义配置
+ */
+@AutoConfiguration
+public class UndertowConfig implements WebServerFactoryCustomizer<UndertowServletWebServerFactory> {
+
+    /**
+     * 设置 Undertow 的 websocket 缓冲池
+     */
+    @Override
+    public void customize(UndertowServletWebServerFactory factory) {
+        // 默认不直接分配内存 如果项目中使用了 websocket 建议直接分配
+        factory.addDeploymentInfoCustomizers(deploymentInfo -> {
+            WebSocketDeploymentInfo webSocketDeploymentInfo = new WebSocketDeploymentInfo();
+            webSocketDeploymentInfo.setBuffers(new DefaultByteBufferPool(false, 512));
+            deploymentInfo.addServletContextAttribute("io.undertow.websockets.jsr.WebSocketDeploymentInfo", webSocketDeploymentInfo);
+        });
+    }
+
+}
+

+ 25 - 0
train-server/src/main/java/top/haijunit/train/controller/DemoController.java

@@ -0,0 +1,25 @@
+package top.haijunit.train.controller;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import top.haijunit.common.domain.ResultData;
+
+/**
+ * @author zhanghaijun
+ * @date 2023/11/7 15:30
+ * @description 示例请求入口
+ */
+@Slf4j
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/demo")
+public class DemoController {
+
+    @GetMapping("")
+    public ResultData<String> demo() {
+        return ResultData.success("");
+    }
+}

+ 6 - 2
train-server/src/main/java/top/haijunit/train/model/UserDO.java

@@ -1,5 +1,6 @@
-package top.haijunit.train.model;
+package top.haijunit.train.domain;
 
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
@@ -11,8 +12,11 @@ import lombok.Data;
 @Data
 @TableName("db_user")
 public class UserDO {
+
+    @TableId(value = "user_id")
     private Long userId;
+
     private String username;
-    private String email;
 
+    private String email;
 }

+ 1 - 1
train-server/src/main/java/top/haijunit/train/mapper/UserMapper.java

@@ -1,7 +1,7 @@
 package top.haijunit.train.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import top.haijunit.train.model.UserDO;
+import top.haijunit.train.domain.UserDO;
 
 /**
  * @author zhanghaijun

+ 7 - 0
train-server/src/main/resources/application.yml

@@ -5,6 +5,13 @@ server:
       charset: UTF-8
       force: true
     context-path: /
+  undertow:
+    max-http-post-size: -1
+    buffer-size: 512
+    direct-buffers: true
+    threads:
+      io: 8
+      worker: 256
 spring:
   application:
     name: train-server

+ 1 - 1
train-server/src/test/java/top/haijunit/train/mapper/UserMapperTest.java

@@ -11,7 +11,7 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
-import top.haijunit.train.model.UserDO;
+import top.haijunit.train.domain.UserDO;
 
 import java.util.List;