[從零開始’寫’博客] - 框架整合及接口開發

框架整合

1. 配置數據源和mybatis

數據源使用的*HikariCP(光)*,從這個名字就能看出它突出一個快,號稱目前性能最強。Springboot2都已經將默認數據庫連接池從tomcat改成hikariCP了。所以直接修改配置文件即可。

spring:
  datasource:                                           # 數據源的相關配置
    type: com.zaxxer.hikari.HikariDataSource          # 數據源類型:HikariCP
    driver-class-name: com.mysql.jdbc.Driver          # mysql驅動
    url: jdbc:mysql://localhost:3306/blog?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
    username: root
    password: password
    hikari:
      connection-timeout: 30000     
      minimum-idle: 5                 # 最小連接數 5-10
      maximum-pool-size: 20           # 最大連接數 20 和硬件配置有關,4核10個 8核20
      auto-commit: true               # 自動提交
      idle-timeout: 600000            # 連接超時的最大時長(毫秒),超時則被釋放(retired),默認:10分鐘
      pool-name: DateSourceHikariCP     # 連接池名字
      max-lifetime: 1800000          
      connection-test-query: SELECT 1


2. 整合Swagger2構建強大API文檔

爲減少程序員編寫文檔時間,提高生產力,swagger2應運而生。他可以幫助程序員在編寫代碼時自動生成文檔。

  1. 添加maven依賴
<!— swagger2 配置 —>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.4.0</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.4.0</version>
</dependency>
<!— 優化swagger2ui頁面 —>
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>2.0.2</version>
</dependency>

knife4j是爲Java MVC框架集成Swagger生成Api文檔的增強解決方案,提供更符合國人習慣的文檔界面。

  1. 編寫swagger2配置類
@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)  // 指定api類型爲swagger2
                    .apiInfo(apiInfo())                 // 用於定義api文檔彙總信息
                    .select()
                    .apis(RequestHandlerSelectors.basePackage("com.changzhen.blog.controller"))
                    .paths(PathSelectors.any())
                    .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("blog 接口api")        // 文檔頁標題
                .contact(new Contact("博客發佈平臺",
                        "http://chzhlp.com",
                        "[email protected]"))        // 聯繫人信息
                .description("專爲blog發佈平臺提供的api文檔")
                .version("0.0.1")   // 文檔版本號
                .termsOfServiceUrl("http://chzhlp.com")
                .build();
    }

}

使用@EnableSwagger2開啓swagger2
配置Docket bean,主要是掃描的包和接口信息
接着訪問 {ip}:{port}/doc.html 出現下圖則集成成功
[外鏈圖片轉存中…(img-XkaEN7gY-1591198077494)]

3. 整合log4j日誌打印

  1. 移除springboot中默認日誌
<exclusions>
	<exclusion>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-logging</artifactId>
	</exclusion>
</exclusions>
  1. 添加日誌框架
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.21</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.21</version>
</dependency>
  1. 在資源目錄下src/main/resources創建配置文件 log4j.properties
log4j.rootLogger=DEBUG,stdout,file
log4j.additivity.org.apache=true

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.threshold=INFO
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.DatePattern='.'yyyy-MM-dd-HH-mm
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
log4j.appender.file.Threshold=INFO
log4j.appender.file.append=true
log4j.appender.file.File=logs/blog-api/run.log

關於使用Restful api

Restful是目前最流行的 API 設計規範,用於 Web 數據接口的設計。設計時通常在uri中只能使用名詞,因其代表資源故不能使用動詞。通過http協議使用 GET 、POST、PUT、DELETE來操作資源。
1. GET — 獲取資源
2. POST — 新建資源
3. PUT — 更新資源
4. DELETE — 刪除資源
但是,在我們工作的時因爲便利性而將設計規範弱化。通常只會只用兩種,

  • GET用來獲取資源
  • POST用來修改資源

在設計URI的過程中如果按照設計規範,有時GET、PUT、DELETE會使用相同的URI,當前端人員對接接口時就會產生困惑。所以一般設計時也會使用一些動詞,使接口的含義更加簡單明瞭。

關於通用response響應內容

目前有兩種格式的響應使用的比較多。一、所有請求都返回200 OK的狀態碼,在data中再次定義code,msg,data的內容,根據業務確定自己的狀態碼,前端根據獲取到的內容進行下一步處理。二、所有返回都遵循http響應碼根據響應碼來判斷錯誤,但是業務如果複雜了,狀態碼錶達的含義可能還是不夠。
目前我使用的是第一種方式,原因如下:
1. http響應碼可能表達的含義不夠,還是需要自定義響應碼。
2. 目前接口對接人員水平參差不齊,可能我使用了狀態碼而對接人員並不清楚具體含義。
3. 自定義code時,只有定義文檔清晰應該對接起來很方便。
4. 好多運營商和所謂智能瀏覽器會劫持你的非200請求。
我自定義的response如下,其中添加了一下常用的相應方法。使用起來還是比較方便的。

@Data
public class ApiJsonResponse {

    private int code;
    private String msg;
    private Object data;

    public ApiJsonResponse(int code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public ApiJsonResponse() {
        this.code = Status.SUCCESS.getCode();
        this.msg = Status.SUCCESS.getStandardMessage();
    }


    public static ApiJsonResponse Message(int code, String msg) {
        return new ApiJsonResponse(code, msg, null);
    }

    public static ApiJsonResponse Success(Object data) {
        return new ApiJsonResponse(Status.SUCCESS.getCode(), Status.SUCCESS.getStandardMessage(), data);
    }
    public static ApiJsonResponse Error(Object data) {
        return new ApiJsonResponse(Status.INTERNAL_SERVER_ERROR.getCode(), Status.INTERNAL_SERVER_ERROR.getStandardMessage(), data);
    }
    public static ApiJsonResponse ErrorMsg(String msg) {
        return new ApiJsonResponse(Status.INTERNAL_SERVER_ERROR.getCode(),msg,null);
    }

    public static ApiJsonResponse Status(Status status) {
        return new ApiJsonResponse(status.getCode(), status.getStandardMessage(), null);
    }
    public static ApiJsonResponse ok() {
        return new ApiJsonResponse(Status.SUCCESS.code, Status.SUCCESS.standardMessage, null);
    }
    public static ApiJsonResponse ok(Object object) {
        return new ApiJsonResponse(Status.SUCCESS.code, Status.SUCCESS.standardMessage, object);
    }

    public enum Status {
        SUCCESS(200, "OK"),
        BAD_REQUEST(400, "請求錯誤!"),
        NOT_FOUND(404, "未找到該請求!"),
        INTERNAL_SERVER_ERROR(500, "系統內部錯誤,請稍後再試"),
        NOT_VALID_PARAM(40005, "參數錯誤"),
        NOT_SUPPORTED_OPERATION(40006, "不支持此操作"),
        NOT_LOGIN(50000, "賬號未登錄,請登錄後重試");

        private int code;
        private String standardMessage;

        Status(int code, String standardMessage) {
            this.code = code;
            this.standardMessage = standardMessage;
        }

        public int getCode() {
            return code;
        }

        public void setCode(int code) {
            this.code = code;
        }

        public String getStandardMessage() {
            return standardMessage;
        }

        public void setStandardMessage(String standardMessage) {
            this.standardMessage = standardMessage;
        }
    }
}


第二篇分應該就是這些了。太久沒寫了,本想的一鼓作氣把博客上線後再慢慢梳理內容,可惜自己前端vue還是比較薄弱,耽誤太長時間。過完年後有幾個項目都很緊就把這博客這就放下了。最近想起差點羞的又把之前那篇刪了,糾結半天最後還是考慮擼起袖子加油幹吧,先寫着之後發現有不對的地方再返回改吧。反正成長不就是一次次打臉的過程麼。
準備工作基本就緒,下一篇應該會進入到coding。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章