天天看點

整理最全規範之Git倉庫管理規範,Java開發規範,最全Java命名規範,資料庫開發設計規範接口規範一、代碼倉庫建立規範二、Java命名規範三、代碼開發規範四、資料庫設計規範五、接口設計規範參考連結

1、 項目建立需符合<code>group</code>規範。

2、 建立項目必須添加<code>project description</code>說明。

3、 每個項目都需要<code>readme.md</code>檔案。

4、 除文檔說明類型倉庫,所有代碼倉庫都需要<code>.gitignore</code>。

注:有模闆的項目,要以統一的模闆建立項目

readme檔案結構如下:

<code>introduction</code> 用于闡述項目基本情況和功能(是什麼,用來做什麼的)。

<code>quick start</code> 主要包括兩部分内容:簡易的安裝部署說明(deployment)和使用案例(example)。

<code>documentation</code> 部分是核心的文檔,對于大型項目可以使用超連結代替。

參考:

整理最全規範之Git倉庫管理規範,Java開發規範,最全Java命名規範,資料庫開發設計規範接口規範一、代碼倉庫建立規範二、Java命名規範三、代碼開發規範四、資料庫設計規範五、接口設計規範參考連結

項目代碼release包括三類:

大版本(x.0.0)

小版本(x.x.0)

更新檔(x.x.x)

git commit 送出樣式規範:

&lt;type&gt;: &lt;subject&gt; 注意:冒号後面又空格

用于說明 commit 的類别(type),隻允許使用下面7個辨別。

當一次改動包括<code>主要type</code>與<code>特殊type</code>時,統一采用<code>主要type</code>。

commit 目的的簡短描述,不超過50個字元

對本次 commit 的較長的描述,可以分成多行,可詳細說明代碼變動的動機。

遠端倉庫隻允許出現五種類型的分支:

主分支:項目的主要分支也就是master分支。用于正式釋出,該分支禁止任何人直接送出,送出合并請求由對應項目主管人員确認合并。

開發分支:項目的開發疊代分支,用于開發釋出,正常開發任務的代碼直接送出至該分支或者由臨時分支合并至該分支。

測試分支:項目的測試疊代分支,使用者測試釋出,該分支禁止任何人直接送出,送出合并請求由對應項目主管人員确認合并。

歸檔分支:項目的裡程碑版本保留分支,由測試負責人、項目負責人、産品負責人直接定義版本,從測試分支歸檔出新分支。

臨時分支:由項目的開發人員建立的臨時分支,禁止交叉送出,誰建立的分支便由誰負責管理,用于合并至開發分支,合并完成之後禁止新送出應當立刻删除。

主分支全局倉庫唯一,分支名稱固定為master,任何對主分支的直接送出定性為嚴重違規行為,需要嘗試對主分支進行合并應當由對應倉庫的開發負責人送出合并請求并由上級負責人通過合并實作對主分支的變更。

開發分支全局倉庫唯一,分支名稱固定為devloop,開發人員允許對該分支直接送出,任何向開發分支送出的代碼在送出之前應當保證能夠正常通過編譯、部署并運作,無法部署的送出應當立刻修複并重新送出。開發分支部署的代碼應當由開發人員完成所有的單元測試,全部通過之後再向測試分支送出。

測試分支全局倉庫唯一,分支名稱固定為testlooop,禁止直接對該分支送出,測試分支應當由開發分支送出合并請求而來,由開發人員送出合并請求,由主要開發人員通過合并請求實作測試部署。小型項目、中間件研發可以酌情省略測試分支,由開發分支部署交于測試進行品質校驗,大型項目或産品必須保證有測試分支。

歸檔分支全局倉管可以具備多個,直接由測試分支或主分支派生,除特殊情況下禁止任何送出行為,歸檔分支名稱格式為release-版本号(如:<code>release-1.2.0</code>),分支由對應項目的開發主要負責人再與測試負責人溝通之後建立,已經後續無論是bug、還是功能性問題都不應當項歸檔分支送出。

臨時分支全局倉庫可以具備多個,臨時分支名稱格式為tem-開發者-建立時間(如:<code>tem-tangyuecan-20200724</code>),由開發人員自行建立,臨時分支的送出進制交叉送出,隻允許分支建立者送出,臨時分支隻能合并到開發分支一旦完成合并之後應當立即删除,可以直接本地合并之後向開發分支送出或者送出合并請求由開發負責人進行合并,臨時分支的生命周期原則上不超過三個工作日。臨時分支主要用于無法在短時間之内完成的開發工作,或者整合至開發分支之後無法運作情況,這樣考慮之下才有臨時分支的概念。

是以代碼的送出、合并都應該通過文字目前描述出改此送出、合并的目的如下面幾種:

<code>修複問題:#xxxx</code>(禅道bug的id或者issue)

<code>修複問題:xxxx</code>(bug的名稱)

<code>完成功能:#xxxx</code>(禅道的任務id)

<code>完成功能:xxxxx</code>(功能的名稱)

任何無意義或者具體目的的送出禁止同步至遠端倉庫,包括遠端臨時分支(禁止commit)

整理最全規範之Git倉庫管理規範,Java開發規範,最全Java命名規範,資料庫開發設計規範接口規範一、代碼倉庫建立規範二、Java命名規範三、代碼開發規範四、資料庫設計規範五、接口設計規範參考連結

好的命名能展現出代碼的特征,含義或者是用途,讓閱讀者可以根據名稱的含義快速厘清程式的脈絡。不同語言中采用的命名形式大相徑庭,java 中常用到的命名形式共有三種,既首字母大寫的 uppercamelcase ,首字母小寫的 lowercamelcase 以及全部大寫的并用下劃線分割單詞的upper_camel_unser_score。通常約定,類一般采用大駝峰命名,方法和局部變量使用小駝峰命名,而大寫下劃線命名通常是常量和枚舉中使用。

類型

限制

項目名

全部小寫,多個單詞用中劃線分隔‘-’

spring-cloud

包名

全部小寫

com.alibaba.fastjson

類名

單詞首字母大寫

feature, parserconfig,defaultfielddeserializer

變量名

首字母小寫,多個單詞組成時,除首個單詞,其他單詞首字母都要大寫

password, username

常量名

全部大寫,多個單詞,用'_'分隔

cache_expired_time

方法

同變量

read(), readobject(), getbyid()

包名統一使用小寫,點分隔符之間有且僅有一個自然語義的英文單詞或者多個單詞自然連接配接到一塊(如 springframework,deepspace 不需要使用任何分割)。包名統一使用單數形式,如果類命有複數含義,則可以使用複數形式。

包名的構成可以分為以下幾四部分【字首】 【發起者名】【項目名】【子產品名】。常見的字首可以分為以下幾種:

字首名

含義

indi(或onem )

indi.發起者名.項目名.子產品名.……

個體項目,指個人發起,但非自己獨自完成的項目,可公開或私有項目,copyright主要屬于發起者。

pers

pers.個人名.項目名.子產品名.……

個人項目,指個人發起,獨自完成,可分享的項目,copyright主要屬于個人

priv

priv.個人名.項目名.子產品名.……

私有項目,指個人發起,獨自完成,非公開的私人使用的項目,copyright屬于個人。

team

team.團隊名.項目名.子產品名.……

團隊項目,指由團隊發起,并由該團隊開發的項目,copyright屬于該團隊所有

頂級域名

com.公司名.項目名.子產品名.……

公司項目,copyright由項目發起的公司所有

類名使用大駝峰命名形式,類命通常時名詞或名詞短語,接口名除了用名詞和名詞短語以外,還可以使用形容詞或形容詞短語,如 cloneable,callable 等,表示實作該接口的類有某種功能或能力。對于測試類則以它要測試的類開頭,以 test 結尾,如 hashmaptest。

對于一些特殊特有名詞縮寫也可以使用全大寫命名,比如xmlhttprequest,不過筆者認為縮寫三個字母以内都大寫,超過三個字母則按照要給單詞算。這個沒有标準如阿裡巴巴中fastjson用jsonobject作為類命,而google則使用jsonobjectrequest 命名,對于這種特殊的縮寫,原則是統一就好。

屬性

抽象類

abstract 或者 base 開頭

baseuserservice

枚舉類

enum 作為字尾

genderenum

工具類

utils作為字尾

stringutils

異常類

exception結尾

runtimeexception

接口實作類

接口名+ impl

userserviceimpl

領域模型相關

/do/dto/vo/dao

正例:userdao 反例: userdo, userdao

設計模式相關類

builder,factory等

當使用到設計模式時,需要使用對應的設計模式作為字尾,如threadfactory

處理特定功能的

handler,predicate, validator

表示處理器,校驗器,斷言,這些類工廠還有配套的方法名如handle,predicate,validate

測試類

test結尾

userservicetest, 表示用來測試userservice類的

mvc分層

controller,service,serviceimpl,dao字尾

usermanagecontroller,usermanagedao

方法命名采用小駝峰的形式,首字小寫,往後的每個單詞首字母都要大寫。 和類名不同的是,方法命名一般為動詞或動詞短語,與參數或參數名共同組成動賓短語,即動詞 + 名詞。一個好的函數名一般能通過名字直接獲知該函數實作什麼樣的功能。

注:prefix-字首,suffix-字尾,alone-單獨使用

位置

單詞

意義

prefix

is

對象是否符合期待的狀态

isvalid

can

對象能否執行所期待的動作

canremove

should

調用方執行某個指令或方法是好還是不好,應不應該,或者說推薦還是不推薦

shouldmigrate

has

對象是否持有所期待的資料和屬性

hasobservers

needs

調用方是否需要執行某個指令或方法

needsmigrate

ensure

檢查是否為期待的狀态,不是則抛出異常或傳回error code

ensurecapacity

validate

檢查是否為正确的狀态,不是則抛出異常或傳回error code

validateinputs

suffix

ifneeded

需要的時候執行,不需要的時候什麼都不做

drawifneeded

might

同上

mightcreate

try

嘗試執行,失敗時抛出異常或是傳回errorcode

trycreate

ordefault

嘗試執行,失敗時傳回預設值

getordefault

orelse

嘗試執行、失敗時傳回實際參數中指定的值

getorelse

force

強制嘗試執行。error抛出異常或是傳回值

forcecreate, forcestop

blocking

線程阻塞方法

blockinggetuser

inbackground

執行在背景的線程

doinbackground

async

異步方法

sendasync

sync

對應已有異步方法的同步方法

sendsync

prefix or alone

schedule

job和task放入隊列

schedule, schedulejob

post

postjob

execute

執行異步方法(注:我一般拿這個做同步方法名)

execute, executetask

start

start, startjob

cancel

停止異步方法

cancel, canceljob

stop

stop, stopjob

on

事件發生時執行

oncompleted

before

事件發生前執行

beforeupdate

pre

preupdate

will

willupdate

after

事件發生後執行

afterupdate

postupdate

did

didupdate

确認事件是否可以發生時執行

shouldupdate

initialize

初始化。也可作為延遲初始化使用

pause

暫停

onpause ,pause

停止

onstop,stop

abandon

銷毀的替代

destroy

dispose

contains

是否持有與指定對象相同的對象

add

添加

addjob

append

appendjob

insert

插入到下标n

insertjob

put

添加與key對應的元素

putjob

remove

移除元素

removejob

enqueue

添加到隊列的最末位

enqueuejob

dequeue

從隊列中頭部取出并移除

dequeuejob

push

添加到棧頭

pushjob

pop

從棧頭取出并移除

popjob

peek

從棧頭取出但不移除

peekjob

find

尋找符合條件的某物

findbyid

create

新建立

createaccount

new

newaccount

from

從既有的某物建立,或是從其他的資料建立

fromconfig

to

轉換

tostring

update

更新既有某物

updateaccount

load

讀取

loadaccount

fetch

遠端讀取

fetchaccount

delete

删除

deleteaccount

removeaccount

save

儲存

saveaccount

store

storeaccount

commit

commitchange

apply

儲存或應用

applychange

clear

清除資料或是恢複到初始狀态

clearall

reset

resetall

get擷取

set 設定

add 增加

remove 删除

create 建立

destory 移除

start 啟動

stop 停止

open 打開

close 關閉

read 讀取

write 寫入

load 載入

save 儲存

destroy 銷毀

begin 開始

end 結束

backup 備份

restore 恢複

import 導入

export 導出

split 分割

merge 合并

inject 注入

extract 提取

attach 附着

detach 脫離

bind 綁定

separate 分離

view 檢視

browse 浏覽

edit 編輯

modify 修改

select 選取

mark 标記

copy 複制

paste 粘貼

undo 撤銷

redo 重做

insert 插入

delete 移除

add 加入

append 添加

clean 清理

clear 清除

index 索引

sort 排序

find 查找

search 搜尋

increase 增加

decrease 減少

play 播放

pause 暫停

launch 啟動

run 運作

compile 編譯

execute 執行

debug 調試

trace 跟蹤

observe 觀察

listen 監聽

build 建構

publish 釋出

input 輸入

output 輸出

encode 編碼

decode 解碼

encrypt 加密

decrypt 解密

compress 壓縮

decompress 解壓縮

pack 打包

unpack 解包

parse 解析

emit 生成

connect 連接配接

disconnect 斷開

send 發送

receive 接收

download 下載下傳

upload 上傳

refresh 重新整理

synchronize 同步

update 更新

revert 複原

lock 鎖定

unlock 解鎖

check out 簽出

check in 簽入

submit 送出

commit 傳遞

push 推

pull 拉

expand 展開

collapse 折疊

begin 起始

start 開始

finish 完成

enter 進入

exit 退出

abort 放棄

quit 離開

obsolete 廢棄

depreciate 廢舊

collect 收集

aggregate 聚集

變量是指在程式運作中可以改變其值的量,包括成員變量和局部變量。變量名由多單詞組成時,第一個單詞的首字母小寫,其後單詞的首字母大寫,俗稱駱駝式命名法(也稱駝峰命名法),如 computedvalues,index、變量命名時,盡量簡短且能清楚的表達變量的作用,命名展現具體的業務含義即可。

變量名不應以下劃線或美元符号開頭,盡管這在文法上是允許的。變量名應簡短且富于描述。變量名的選用應該易于記憶,即,能夠指出其用途。盡量避免單個字元的變量名,除非是一次性的臨時變量。pojo中的布爾變量,都不要加is(資料庫中的布爾字段全都要加 is_ 字首)。

常量命名constant_case,一般采用全部大寫(作為方法參數時除外),單詞間用下劃線分割。那麼什麼是常量呢?

常量是在作用域内保持不變的值,一般使用final進行修飾。一般分為三種,全局常量(public static final修飾),類内常量(private static final 修飾)以及局部常量(方法内,或者參數中的常量),局部常量比較特殊,通常采用小駝峰命名即可。

常量一般都有自己的業務含義,不要害怕長度過長而進行省略或者縮寫。如,使用者消息緩存過期時間的表示,那種方式更佳清晰,交給你來評判。

盡量不要使用拼音;杜絕拼音和英文混用。對于一些通用的表示或者難以用英文描述的可以采用拼音,一旦采用拼音就堅決不能和英文混用。 正例: beijing, hangzhou 反例: validatecanshu

命名過程中盡量不要出現特殊的字元,常量除外。

盡量不要和jdk或者架構中已存在的類重名,也不能使用java中的關鍵字命名。

妙用介詞,如for(可以用同音的4代替), to(可用同音的2代替), from, with,of等。 如類名采用user4redisdo,方法名getuserinfofromredis,convertjson2map等。

好的命名增加代碼閱讀性,代碼的命名往往有嚴格的限制。而注解不同,程式員往往可以自由發揮,單并不意味着可以為所欲為之胡作非為。優雅的注解通常要滿足三要素。

nothing is strange 沒有注解的代碼對于閱讀者非常不友好,哪怕代碼寫的在清除,閱讀者至少從心理上會有抵觸,更何況代碼中往往有許多複雜的邏輯,是以一定要寫注解,不僅要記錄代碼的邏輯,還有說清楚修改的邏輯。

less is more 從代碼維護角度來講,代碼中的注解一定是精華中的精華。合理清晰的命名能讓代碼易于了解,對于邏輯簡單且命名規範,能夠清楚表達代碼功能的代碼不需要注解。濫用注解會增加額外的負擔,更何況大部分都是廢話。

advance with the time 注解應該随着代碼的變動而改變,注解表達的資訊要與代碼中完全一緻。通常情況下修改代碼後一定要修改注解。

注解大體上可以分為兩種,一種是javadoc注解,另一種是簡單注解。javadoc注解可以生成javaapi為外部使用者提供有效的支援javadoc注解通常在使用idea,或者eclipse等開發工具時都可以自動生成,也支援自定義的注解模闆,僅需要對對應的字段進行解釋。參與同一項目開發的同學,盡量設定成相同的注解模闆。

包注解在工作中往往比較特殊,通過包注解可以快速知悉目前包下代碼是用來實作哪些功能,強烈建議工作中加上,尤其是對于一些比較複雜的包,包注解一般在包的根目錄下,名稱統一為package-info.java。

javadoc注解中,每個類都必須有注解。

在每個屬性前面必須加上屬性注釋,通常有一下兩種形式,至于怎麼選擇,你高興就好,不過一個項目中要保持統一。

在每個方法前面必須加上方法注釋,對于方法中的每個參數,以及傳回值都要有說明。

在每個構造方法前面必須加上注釋,注釋模闆如下:

而簡單注解往往是需要工程師位元組定義,在使用注解時應該注意一下幾點:

枚舉類的各個屬性值都要使用注解,枚舉可以了解為是常量,通常不會發生改變,通常會被在多個地方引用,對枚舉的修改和添加屬性通常會帶來很大的影響。

保持排版整潔,不要使用行尾注釋;雙斜杠和星号之後要用1個空格分隔。

工程命名由三部分組成:字首-項目名稱-字尾。

工程根據功能分為:手機工程和一般性工程,手機工程主要給手機端及app提供頁面和接口,除手機之外的工程統一稱為一般性工程,由字首決定。

工程根據通路管道分為:外部工程和内部工程,外部工程的主要使用者為外部注冊使用者,對公網開放,内部工程的通路使用者為公司内部人員,隻能在公司内網通路,由字尾決定。

字首

說明

mobile

基于手機浏覽器的web項目,主要提供h5頁面

android

關于安卓手機的native app項目

ios

關于ios手機的native app項目

ins

公司的一般項目,非手機類項目都使用該字首

項目名稱需要和項目内容非常貼切,讓人一看就知道項目是幹什麼的,命名需要leader、部門總監,一起評審,通過後才能使用。

字尾

front

前端項目

web

外部工程,提供json請求,不能提供rpc接口,此類工程偏向于提供web頁面業務為主

proxy

外部工程,提供對外調用接口,不能提供rpc接口,此類工程偏向于提供外部接口為主

platform

内部工程,主要提供rpc接口服務,另:可以隻為技術人員提供一些監控管理的頁面,此類工程偏向于rpc接口為主且隻能内網通路

internal

内部工程,即可以提供rpc接口服務也可以提供json請求,但以json請求為主。此類工程偏向于提供背景頁面為主且隻能内網通路,如果此類工程的業務名跟platform工程的業務名同名,則在業務名後跟admin,以免他們的client重名沖突。比如:ins-xy-platform 和 ins-xy-internal 後者應該改為ins-xyadmin-internal.

task

以main函數存在的,通常是以jar包的形式,不需要容器,獨立運作

app

手機上安裝的軟體

client

提供sdk的用戶端

util

工具包(ins-utility應該改名為ins-common-util)

1、車路協同單體提供pc端通路的項目應該叫:ins-cvis-web,為車路協同提供手機端頁面通路的項目應該叫:mobile-cvis-web。

2、車路協同給其他端提供業務接口調用的項目應該叫:ins-cvis-platform,為公司内部業務人員提供頁面通路的項目應該叫:ins-cvis-internal。

3、給app提供外部接口支援的項目應該叫:ins-xxx-proxy。

4、像檔案系統(lpfs)即需要提供管理頁面,又需要提供rpc接口調用,還需要給外網提供接口和頁面的項目需要根據通路管道分成外部工程和内部工程兩個工程,

外部工程應該命名為:ins-lpfs-proxy,因為主要以提供外部接口為主是以字尾應該為proxy。

5、内部工程應該命名為:ins-lpfs-platform,因為主要以rpc接口為主,且提供的頁面隻為内部技術人員使用,是以字尾應該為platform,如果提供的頁面是給業務人員使用則應該為:ins-lpfs-internal。

com.hiacent.項目名稱.web/platform【.子產品名】。

如果隻有一個業務子產品,則業務子產品級可以省略。

例如 :

ins-biz-web: 工程結構包名:com.hiacent.biz.web【.子產品名】

ins-user-platform:工程結構包名:com.hiacent.user.platform【.子產品名】

工程字元集: 工程符集全部設定為utf-8格式

子產品名稱

子產品說明

示例

備注

entity層

實體類命名與表名相同,首字母大寫,如果表名存在_那麼将_這去掉後首字母大寫。

表名:like_log 實體名 likelog

實體類屬性必須與資料庫字段名保持一緻。

dao層

繼承com.baomidou.mybatisplus.core.mapper.basemapper&lt;t&gt; 要求實體泛型dao層下接口命名:實體名+mapper 。

likelogmapper

service層

要求:接口繼承com.baomidou.mybatisplus.extension.service.iservice&lt;t&gt;要求實體泛型

service.impl層類

繼承com.baomidou.mybatisplus.extension.service.impl.serviceimpl,service層下接口命名:業務名稱+service 。service.impl層命名: 業務名稱+serviceimpl 。

likelogservice;likelogserviceimpl

service層可以調用service層和dao層和其他項目。 service層下可再包一層bean層,用以存放資料結構的類,必須以bean結尾。 平台service層内部調用的方法可以傳回entity,但是被manage層調用的service方法隻能傳回dto或基本資料類型,不能傳回entity到manage。

manage層

調用其他服務的接口,通常使用feign來實作

ilikelogmange

manage層下接口命名:i+業務名稱+manage。

controller層

繼承: org.jeecg.common.system.base.controller.jeecgcontroller&lt;t, s extends iservice&lt;t&gt;&gt;controller層命名:以controller結尾。

likelogcontroller

web/proxy/internal可用;controller層不能出現dto

form層

web/proxy/internal可用;form下類命名:以form結尾。

likebaseinfoform

form可以引用其他form form中不可以包含dto

dto層

internal/platform 可用;dto層命名:以dto結尾,字首不一定是entity。

likelogdto

dto不能引用别人的dto

schedule類

schedule層命名: 以業務名稱開頭,以schedule結尾,字首不一定是entity。

sendemailschedule

idp類

idp層命名:以idphandler結尾。

resumeidphandler

util層

util層命名:以util或utils結尾。

moneyutil

consts層

靜态變量類consts層命名:以const結尾。

likelogconst

helper層

helper層命名:client名+helper結尾。

userplatformclienthelper

helper層主要放置調用其它端client的工具類; helper隻可以出現調平台的代碼和處理平台傳回錯誤的代碼; helper不允許調其他helper;

filter

filter命名:以filter結尾。

authfilter

隻能出現在common包下面的filter包中

resolver

包名隻能叫resolver且同一工程下隻能有一個resolve包,隻能出現在common包下的resolver包中,此包下隻能有一個類檔案且名稱為:mvcexceptionresolver。

dto,form,entity,bean四者間的轉換隻能通過手動get,set方式指派。

類的靜态變量、靜态區域塊、構造函數中,不允許出現資料庫的調用和rpc的調用。

同一工程下的受spring管理的類的類名不能相同,即使包名不同也不允許類名相同。

ajax方法裡不能聲明callback參數,因為此參數在使用跨域時做為系統占用參數。

所有可以通過網頁端通路的url命名統一全小寫,可以在單詞之間用“-”(減号)分隔,controller采用駱峰格式命名兩者除了大小寫之外其他盡量保持相同。

例:@requestmapping("/getassesseeandbranch")

所有rpc接口統一用駝峰形式。

傳回值是json格式url名必須是以.json結尾.

controller中url的requestmapping不能以"/"結尾 。

在前端頁面中書寫的url必須以“/”結尾。

例:&lt;a rel="nofollow" href="/getassesseeandbranch/"&gt;

所有非登入能通路的目錄型url(不是以.*結尾的url),如果通路時沒有“/”結尾,則需要自動加上“/”并作301跳轉。

例如:http://www.hiacent.com/login?name=xxx應該301跳轉到http://www.hiacent.com/login/?name=xxx。此條隻針對get請求。

所有非登入能通路的清單頁面,所有翻頁都需要修改成 http://www.hiacent.com/list/pnx/ (x為頁碼)的形式。

ajax翻頁的不用遵循這個規範。

ajax方法必須以.json結尾。

例:@requestmapping("/getuser.json")

header頭資訊裡包括x-requested-with=xmlhttprequest 或者 帶有callback參數。

app方法必須以.json結尾。

請求都是壓縮格式,header頭資訊裡包括accept-encoding=gzip,不能包含x-requested-with=xmlhttprequest頭資訊或callback參數。

ajax請求以.json結尾,header頭資訊裡包括x-requested-with=xmlhttprequest 或者 帶有callback參數請求并且是.json字尾的通路也屬于ajax請求。

ajax和web根據功能放在同一controller裡。

請求參數放在方法行參裡,不在使用reqeust擷取請求參數,扁平化參數或封裝form對象,controller方法參數扁平話後,大家寫對象時一定要定義成form,不要用弱對象map這些類型。

controller方法參數不再有httpservletrequest、httpservletresponse,統一在繼承的父類abstractcontroller提供方法操作,如cookie、檔案下載下傳等。

傳回結果使用方法直接傳回ajax方法并且,傳回值是json格式的方法的傳回值不需要自己轉換json。

在正常情況下,背景隻傳回 flag 和 data 兩個字段,異常情況下,傳回 flag / code 和 msg 三個字段。

對于複雜業務場景,傳回正常資料可能包含多種情況,以下面的方式來限制:

和前端約定:成功失敗的傳回值(成功flag=1,失敗flag=0)。

請求以.json結尾,請求都是壓縮格式,header頭資訊裡包括accept-encoding=gzip。

請求參數放在方法行參裡,不在使用reqeust擷取請求參數,扁平化參數或封裝form對象,請求參數放在方法行參裡,不在使用reqeust擷取請求參數,扁平化參

數或封裝form對象,controller方法參數扁平話後,大家寫對象時一定要定義成form,不要用弱對象map這些類型。

傳回結果使用方法直接傳回。

請求參數形式:http://domain.lietou.com/uri?mustkey1=v1&amp;mustkey2=v2&amp;data={}

相容版本 傳回的協定體:

最終版本和ajax傳回一樣。

關于緩存的使用規範

所有業務緩存、二級緩存緩存都用redis,不能用memcache。

redis隻用作不持久化的緩存

1、所有資料庫對象名稱必須使用小寫字母并用下劃線分割

2、所有資料庫對象名稱禁止使用mysql保留關鍵字(如果表名中包含關鍵字查詢時,需要将其用單引号括起來)

3、資料庫對象的命名要能做到見名識意,并且最後不要超過32個字元

4、臨時庫表必須以tmp_為字首并以日期為字尾,備份表必須以bak_為字首并以日期(時間戳)為字尾

5、所有存儲相同資料的列名和列類型必須一緻(一般作為關聯列,如果查詢時關聯列類型不一緻會自動進行資料類型隐式轉換,會造成列上的索引失效,導緻查詢效率降低)

采用小寫字母、數字(通常不需要)和下劃線組成。禁止使用’-’,命名簡潔、含義明确。

根據業務類型不同,采用不同的字首,小寫字母、下劃線組成

長度控制在30個字元以内

推薦的命名規則

業務表

tb_

關系表

tr_

曆史表

th_

統計表

ts_

日志表

tl_xx_log

系統表、字典表、碼表

sys_

臨時表

tmp_

禁止使用

備份表

bak_xx_ymd

視圖

view_

避免使用

沒有特殊要求(即innodb無法滿足的功能如:列存儲,存儲空間資料等)的情況下,所有表必須使用innodb存儲引擎(mysql5.5之前預設使用myisam,5.6以後預設的為innodb)innodb 支援事務,支援行級鎖,更好的恢複性,高并發下性能更好。

相容性更好,統一字元集可以避免由于字元集轉換産生的亂碼,不同的字元集進行比較前需要進行轉換會造成索引失效。

解讀:在mysql中的utf-8并非“真正的utf-8”,而utf8mb4”才是真正的“utf-8”。

使用comment從句添加表和列的備注 從一開始就進行資料字典的維護

500萬并不是mysql資料庫的限制,過大會造成修改表結構,備份,恢複都會有很大的問題

可以用曆史資料歸檔(應用于日志資料),分庫分表(應用于業務資料)等手段來控制資料量大小。

分區表在實體上表現為多個檔案,在邏輯上表現為一個表 謹慎選擇分區鍵,跨分區查詢效率可能更低 建議采用實體分表的方式管理大資料

mysql限制每個表最多存儲4096列,并且每一行資料的大小不能超過65535位元組 減少磁盤io,保證熱資料的記憶體緩存命中率(表越寬,把表裝載進記憶體緩沖池時所占用的記憶體也就越大,也會消耗更多的io) 更有效的利用緩存,避免讀入無用的冷資料 經常一起使用的列放到一個表中(避免更多的關聯操作)

預留字段的命名很難做到見名識義 預留字段無法确認存儲的資料類型,是以無法選擇合适的類型 對預留字段類型的修改,會對表進行鎖定

通常檔案很大,會短時間内造成資料量快速增長,資料庫進行資料庫讀取時,通常會進行大量的随機io操作,檔案很大時,io操作很耗時 通常存儲于檔案伺服器,資料庫隻存儲檔案位址資訊

解讀:由于innodb組織資料的方式決定了需要有一個主鍵,而且若是這個主鍵id是單調遞增的可以有效提高插入的性能,避免過多的頁分裂、減少表碎片提高空間的使用率。 而在分庫分表環境下,則需要統一來配置設定各個表中的主鍵值,進而避免整個邏輯表中主鍵重複。

解讀:外鍵會導緻表與表之間耦合,update與delete操作都會涉及相關聯的表,十分影響sql的性能,甚至會造成死鎖。

解讀:單表列數太多使得mysql伺服器處理innodb傳回資料之間的映射成本太高。

&lt;font color='red'&gt;原因&lt;/font&gt;

列的字段越大,建立索引時所需要的空間也就越大,這樣一頁中所能存儲的索引節點的數量也就越少也越少,在周遊時所需要的io次數也就越多, 索引的性能也就越差

&lt;font color='blue'&gt;方法&lt;/font&gt;

1)将字元串轉換成數字類型存儲,如:将ip位址轉換成整形資料。

mysql提供了兩個方法來處理ip位址:

插入資料前,先用inet_aton把ip位址轉為整型,可以節省空間。顯示資料時,使用inet_ntoa把整型的ip位址轉為位址顯示即可。

2)對于非負型的資料(如自增id、整型ip)來說,要優先使用無符号整型來存儲

因為:無符号相對于有符号可以多出一倍的存儲空間

varchar(n)中的n代表的是字元數,而不是位元組數

使用utf8存儲255個漢字 varchar(255)=765個位元組。過大的長度會消耗更多的記憶體

&lt;font color='red'&gt;建議把blob或是text列分離到單獨的擴充表中&lt;/font&gt;

mysql記憶體臨時表不支援text、blob這樣的大資料類型,如果查詢中包含這樣的資料,在排序等操作時,就不能使用記憶體臨時表,必須使用磁盤臨時表進行。

而且對于這種資料,mysql還是要進行二次查詢,會使sql性能變得很差,但是不是說一定不能使用這樣的資料類型。

如果一定要使用,建議把blob或是text列分離到單獨的擴充表中,查詢時一定不要使用select * 而隻需要取出必要的列,不需要text列的資料時不要對該列進行查詢。

&lt;font color='red'&gt;text或blob類型隻能使用字首索引&lt;/font&gt;

因為mysql對索引字段長度是有限制的,是以text類型隻能使用字首索引,并且text列上是不能有預設值的。

1、修改enum值需要使用alter語句

2、enum類型的order by操作效率低,需要額外操作

3、禁止使用數值作為enum的枚舉值

&lt;font color='red'&gt;原因:&lt;/font&gt;

1、索引null列需要額外的空間來儲存,是以要占用更多的空間;

2、進行比較和計算時要對null值做特别的處理

解讀:

null的列使索引/索引統計/值比較都更加複雜,對mysql來說更難優化;

null這種類型msql内部需要進行特殊處理,增加資料庫處理記錄的複雜性;同等條件下,表中有較多空字段的時候,資料庫的處理性能會降低很多;

null值需要更多的存儲空,無論是表還是索引中每行中的null的列都需要額外的空間來辨別。

timestamp 存儲的時間範圍 1970-01-01 00:00:01 ~ 2038-01-19-03:14:07。

timestamp 占用4位元組和int相同,但比int可讀性高

超出timestamp取值範圍的使用datetime類型存儲。

&lt;font color='red'&gt;經常會有人用字元串存儲日期型的資料(不正确的做法):&lt;/font&gt;

缺點1:無法用日期函數進行計算和比較

缺點2:用字元串存儲日期要占用更多的空間

1、非精準浮點:float,double

2、精準浮點:decimal

decimal類型為精準浮點數,在計算時不會丢失精度。占用空間由定義的寬度決定,每4個位元組可以存儲9位數字,并且小數點要占用一個位元組。可用于存儲比bigint更大的整型資料。

解讀:能夠減少空間碎片,節省存儲空間。

索引并不是越多越好!索引可以提高效率同樣可以降低效率。

索引可以增加查詢效率,但同樣也會降低插入和更新的效率,甚至有些情況下會降低查詢效率。

因為mysql優化器在選擇如何優化查詢時,會根據統一資訊,對每一個可以用到的索引來進行評估,以生成出一個最好的執行計劃,如果同時有很多個索引都可以用于查詢,就會增加mysql優化器生成執行計劃的時間,同樣會降低查詢性能。

5.6版本之前,一個sql隻能使用到一個表中的一個索引,5.6以後,雖然有了合并索引的優化方式,但是還是遠遠沒有使用一個聯合索引的查詢方式好

innodb是一種索引組織表:資料的存儲的邏輯順序和索引的順序是相同的。

每個表都可以有多個索引,但是表的存儲順序隻能有一種 innodb是按照主鍵索引的順序來組織表的。

不要使用更新頻繁的列作為主鍵,不适用多列主鍵(相當于聯合索引) 不要使用uuid、md5、hash、字元串列作為主鍵(無法保證資料的順序增長)。

主鍵建議使用自增id值。

【建議】(1)避免在更新比較頻繁、區分度不高的列上單獨建立索引

解讀:區分度不高的列單獨建立索引的優化效果很小,但是較為頻繁的更新則會讓索引的維護成本更高。

【強制】(2) join的表不允許超過五個。需要join的字段,資料類型必須絕對一緻; 多表關聯查詢時,保證被關聯的字段需要有索引

解讀:太多表的join會讓mysql的優化器更難權衡出一個“最佳”的執行計劃(可能性為表數量的階乘),同時要注意關聯字段的類型、長度、字元編碼等等是否一緻。

【強制】(3)在一個聯合索引中,若第一列索引區分度等于1,那麼則不需要建立聯合索引

解讀:索引通過第一列就能夠完全定位的資料,是以聯合索引的後邊部分是不需要的。

【強制】(4)建立聯合索引時,必須将區分度更高的字段放在左

解讀:區分度更高的列放在左邊,能夠在一開始就有效的過濾掉無用資料。提高索引的效率,相應我們在mapper中編寫sql的where條件中有多個條件時,需要先看看目前表是否有現成的聯合索引直接使用,注意各個條件的順序盡量和索引的順序一緻。

【建議】(5)利用覆寫索引來進行查詢操作,避免回表

解讀:覆寫查詢即是查詢隻需要通過索引即可拿到所需data,而不再需要再次回表查詢,是以效率相對很高。我們在使用explain的結果,extra列會出現:"using index"。這裡也要強調一下不要使用“select * ”,否則幾乎不可能使用到覆寫索引。

【建議】(6)在較長varchar字段,例如varchar(100)上建立索引時,應指定索引長度,沒必要對全字段建立索引,根據實際文本區分度決定索引長度即可

解讀:索引的長度與區分度是一對沖突體,一般對字元串類型資料,若長度為20的索引,區分度會高達90%以上,則可以考慮建立長度例為20的索引,而非全字段索引。例如可以使用select count(distinct left(lesson_code, 20)) / count(*) from lesson;來确定lesson_code字段字元長度為20時文本區分度。

【建議】(7)如果有order by的場景,請注意利用索引的有序性。order by最後的字段是聯合索引的一部分,并且放在索引組合順序的最後,避免出現file_sort的情況,影響查詢性能。

假設有查詢條件為where a=? and b=? order by c;存在索引:a_b_c,則此時可以利用索引排序;

反例:在查詢條件中包含了範圍查詢,那麼索引有序性無法利用,如:where a&gt;10 order by b; 索引a_b無法排序。

【建議】(8)在where中索引的列不能某個表達式的一部分,也不能是函數的參數

解讀:即是某列上已經添加了索引,但是若此列成為表達式的一部分、或者是函數的參數,mysql無法将此列單獨解析出來,索引也不會生效。

【建議】 (9)我們在where條件中使用範圍查詢時,索引最多用于一個範圍條件,超過一個則後邊的不走索引

解讀:mysql能夠使用多個範圍條件裡邊的最左邊的第一個範圍查詢,但是後邊的範圍查詢則無法使用。

【建議】 (10)在多個表進行外連接配接時,表之間的關聯字段類型必須完全一緻

解讀:當兩個表進行join時,字段類型若沒有完全一緻,則加索引也不會生效,這裡的完全一緻包括但不限于字段類型、字段長度、字元集、collection等等。

1、出現在select、update、delete語句的where從句中的列

2、包含在order by、group by、distinct中的字段

并不要将符合1和2中的字段的列都建立一個索引,通常将1、2中的字段建立聯合索引效果更好

3、多表join的關聯列

建立索引的目的是:希望通過索引進行資料查找,減少随機io,增加查詢性能 ,索引能過濾出越少的資料,則從磁盤中讀入的資料也就越少。

1、區分度最高的放在聯合索引的最左側(區分度=列中不同值的數量/列的總行數);

2、盡量把字段長度小的列放在聯合索引的最左側(因為字段長度越小,一頁能存儲的資料量越大,io性能也就越好);

3、使用最頻繁的列放到聯合索引的左側(這樣可以比較少的建立一些索引)。

因為這樣會增加查詢優化器生成執行計劃的時間。

重複索引示例:primary key(id)、index(id)、unique index(id)

備援索引示例:index(a,b,c)、index(a,b)、index(a)

對于頻繁的查詢優先考慮使用覆寫索引。

&lt;font color='red'&gt;覆寫索引:就是包含了所有查詢字段(where,select,ordery by,group by包含的字段)的索引&lt;/font&gt;

覆寫索引的好處:

避免innodb表進行索引的二次查詢

innodb是以聚集索引的順序來存儲的,對于innodb來說,二級索引在葉子節點中所儲存的是行的主鍵資訊,如果是用二級索引查詢資料的話,在查找到相應的鍵值後,還要通過主鍵進行二次查詢才能擷取我們真實所需要的資料。而在覆寫索引中,二級索引的鍵值中可以擷取所有的資料,避免了對主鍵的二次查詢 ,減少了io操作,提升了查詢效率。

&lt;font color='red'&gt;可以把随機io變成順序io加快查詢效率&lt;/font&gt;

由于覆寫索引是按鍵值的順序存儲的,對于io密集型的範圍查找來說,對比随機從磁盤讀取每一行的資料io要少的多,是以利用覆寫索引在通路時也可以把磁盤的随機讀取的io轉變成索引查找的順序io。

盡量避免使用外鍵限制

1、不建議使用外鍵限制(foreign key),但一定要在表與表之間的關聯鍵上建立索引;

2、外鍵可用于保證資料的參照完整性,但建議在業務端實作;

3、外鍵會影響父表和子表的寫操作進而降低性能。

預編譯語句可以重複使用這些計劃,減少sql編譯所需要的時間,還可以解決動态sql所帶來的sql注入的問題 隻傳參數,比傳遞sql語句更高效 相同語句可以一次解析,多次使用,提高處理效率。

隐式轉換會導緻索引失效。如:select name,phone from customer where id = '111';

解讀:假設我們在手機号列上添加了索引,然後執行下面的sql會發生什麼?explain select user_name from parent where phone=13812345678; 很明顯就是索引不生效,會全表掃描。

&lt;font color='red'&gt;避免使用雙%号的查詢條件。&lt;/font&gt;

如a like '%123%',(如果無前置%,隻有後置%,是可以用到列上的索引的)

解讀:根據索引的最左字首原理,%開頭的模糊查詢無法使用索引,可以使用es來做檢索。

&lt;font color='red'&gt;一個sql隻能利用到複合索引中的一列進行範圍查詢&lt;/font&gt;

如:有 a,b,c列的聯合索引,在查詢條件中有a列的範圍查詢,則在b,c列上的索引将不會被用到,在定義聯合索引時,如果a列要用到範圍查找的話,就要把a列放到聯合索引的右側。

&lt;font color='red'&gt;使用left join或 not exists來優化not in操作&lt;/font&gt;

因為not in 也通常會使用索引失效。

1、為資料庫遷移和分庫分表留出餘地

2、降低業務耦合度

3、避免權限過大而産生的安全風險

消耗更多的cpu和io以網絡帶寬資源

無法使用覆寫索引

可減少表結構變更帶來的影響

讀取不需要的列會增加cpu、io、net消耗;

如:insert into values ('a','b','c');

應使用insert into t(c1,c2,c3) values ('a','b','c');

通常子查詢在in子句中,且子查詢中為簡單sql(不包含union、group by、order by、limit從句)時,才可以把子查詢轉化為關聯查詢進行優化。

&lt;font color='red'&gt;子查詢性能差的原因:&lt;/font&gt;

1、子查詢的結果集無法使用索引,通常子查詢的結果集會被存儲到臨時表中,不論是記憶體臨時表還是磁盤臨時表都不會存在索引,是以查詢性能會受到一定的影響;

3、特别是對于傳回結果集比較大的子查詢,其對查詢性能的影響也就越大;

3、由于子查詢會産生大量的臨時表也沒有索引,是以會消耗過多的cpu和io資源,産生大量的慢查詢。

對于mysql來說,是存在關聯緩存的,緩存的大小可以由join_buffer_size參數進行設定。

在mysql中,對于同一個sql多關聯(join)一個表,就會多配置設定一個關聯緩存,如果在一個sql中關聯的表越多,所占用的記憶體也就越大。

如果程式中大量的使用了多表關聯的操作,同時join_buffer_size設定的也不合理的情況下,就容易造成伺服器記憶體溢出的情況,就會影響到伺服器資料庫性能的穩定性。

同時對于關聯操作來說,會産生臨時表操作,影響查詢效率mysql最多允許關聯61個表,建議不超過5個。

資料庫更适合處理批量操作 合并多個相同的操作到一起,可以提高處理效率

&lt;font color='red'&gt;應盡量避免在where子句中使用or作為連接配接條件&lt;/font&gt;

in的值不要超過500個in操作可以更有效的利用索引,or大多數情況下很少能利用到索引。

解讀:根據情況可以選擇使用union all來代替or。

會把表中所有符合條件的資料裝載到記憶體中,然後在記憶體中對所有資料根據随機生成的值進行排序,并且可能會對每一行都生成一個随機值,如果滿足條件的資料集非常大,就會消耗大量的cpu和io及記憶體資源。

推薦在程式中擷取一個随機值,然後從資料庫中擷取資料的方式

對列進行函數轉換或計算時會導緻無法使用索引。

不推薦:

推薦:

1、union會把兩個結果集的所有資料放到臨時表中後再進行去重操作

2、union all不會再對結果集進行去重操作

1、大sql:邏輯上比較複雜,需要占用大量cpu進行計算的sql

2、mysql:一個sql隻能使用一個cpu進行計算

3、sql拆分後可以通過并行執行來提高處理效率

解讀:外鍵與級聯更新适用于單機低并發,不适合分布式、高并發叢集;級聯更新是強阻塞,存在資料庫更新風暴的風險;外鍵影響資料庫的插入速度。

&lt;font color='red'&gt; 大批量操作可能會造成嚴重的主從延遲&lt;/font&gt;

主從環境中,大批量操作可能會造成嚴重的主從延遲,大批量的寫操作一般都需要執行一定長的時間,而隻有當主庫上執行完成後,才會在其他從庫上執行,是以會造成主庫與從庫長時間的延遲情況

&lt;font color='red'&gt; binlog日志為row格式時會産生大量的日志&lt;/font&gt;

大批量寫操作會産生大量日志,特别是對于row格式二進制資料而言,由于在row格式中會記錄每一行資料的修改,我們一次修改的資料越多,産生的日志量也就會越多,日志的傳輸和恢複所需要的時間也就越長,這也是造成主從延遲的一個原因。

&lt;font color='red'&gt;避免産生大事務操作&lt;/font&gt;

大批量修改資料,一定是在一個事務中進行的,這就會造成表中大批量資料進行鎖定,進而導緻大量的阻塞,阻塞會對mysql的性能産生非常大的影響。

特别是長時間的阻塞會占滿所有資料庫的可用連接配接,這會使生産環境中的其他應用無法連接配接到資料庫,是以一定要注意大批量寫操作要進行分批。

1、避免大表修改産生的主從延遲

2、避免在對表字段進行修改時進行鎖表

對大表資料結構的修改一定要謹慎,會造成嚴重的鎖表操作,尤其是生産環境,是不能容忍的。

pt-online-schema-change它會首先建立一個與原表結構相同的新表,并且在新表上進行表結構的修改,然後再把原表中的資料複制到新表中,并在原表中增加一些觸發器。

把原表中新增的資料也複制到新表中,在行所有資料複制完成之後,把新表命名成原表,并把原來的表删除掉。

把原來一個ddl操作,分解成多個小的批次進行。

當達到最大連接配接數限制時,還運作1個有super權限的使用者連接配接super權限隻能留給dba處理問題的賬号使用。

程式使用資料庫賬号隻能在一個db下使用,不準跨庫 程式使用的賬号原則上不準有drop權限。

公共參數是每個接口都要攜帶的參數,描述每個接口的基本資訊,用于統計或其他用途,放在header或url參數中。例如:

字段名稱

version

用戶端版本。1.0.0

token

登入令牌

os

手機系統版本。12

請求來源。android/ios/h5

screen

手機尺寸。1080*1920

model

機型。iphone7

net

網絡狀态。wifi

為了友善給用戶端響應,響應資料會包含三個屬性,狀态碼(code),資訊描述(message),響應資料(data)。用戶端根據狀态碼及資訊描述可快速知道接口,如果狀态碼傳回成功,再開始處理資料。

array類型資料。通過list字段,保證data的object結構。

分頁類型資料。傳回總條數,用于判斷是否可以加載更多。

清單類資料接口,無論是否要求分頁,最好支援分頁,pagesize=integer.max即可。

響應結果定義及常用方法:

統一使用string類型。某些情況,統一使用string可以防止解析失敗,減少類型轉化操作。

boolean類型,1是0否。用戶端處理時,非1都是false。

status類型字段,從1+開始,差別boolean的0和1。“0”有兩種含義,(1)boolean類型的false,(2)預設的status

上傳/下載下傳,參數增加檔案md5,用于完整性校驗(傳輸過程可能丢失資料)。

縮小機關儲存資料,如:錢以分為機關、距離以米為機關。

擷取token一般會涉及到幾個參數<code>appid</code>,<code>appkey</code>,<code>timestamp</code>,<code>nonce</code>,<code>sign</code>。我們通過以上幾個參數來擷取調用系統的憑證。

<code>appid</code>和<code>appkey</code>可以直接通過平台線上申請,也可以線下直接頒發。<code>appid</code>是全局唯一的,每個<code>appid</code>将對應一個客戶,<code>appkey</code>需要高度保密。

<code>timestamp</code>是時間戳,使用系統目前的unix時間戳。時間戳的目的就是為了減輕dos攻擊。防止請求被攔截後一直嘗試請求接口。伺服器端設定時間戳閥值,如果請求時間戳和伺服器時間超過閥值,則響應失敗。

<code>nonce</code>是随機值。随機值主要是為了增加<code>sign</code>的多變性,也可以保護接口的幂等性,相鄰的兩次請求<code>nonce</code>不允許重複,如果重複則認為是重複送出,響應失敗。

<code>sign</code>是參數簽名,将<code>appkey</code>,<code>timestamp</code>,<code>nonce</code>拼接起來進行md5加密(當然使用其他方式進行不可逆加密也沒問題)。

<code>token</code>,使用參數<code>appid</code>,<code>timestamp</code>,<code>nonce</code>,<code>sign</code>來擷取token,作為系統調用的唯一憑證。<code>token</code>可以設定一次有效(這樣安全性更高),也可以設定時效性,這裡推薦設定時效性。如果一次有效的話這個接口的請求頻率可能會很高。<code>token</code>推薦加到請求頭上,這樣可以跟業務參數完全區分開來。

一般調用接口最常用的兩種方式就是get和post。兩者的差別也很明顯,get請求會将參數暴露在浏覽器url中,而且對長度也有限制。為了更高的安全性,所有接口都采用post方式請求。

安全且幂等

擷取表示

變更時擷取表示(緩存)

==适合查詢類的接口使用==

不安全且不幂等

使用服務端管理的(自動産生)的執行個體号建立資源

建立子資源

部分更新資源

如果沒有被修改,則不過更新資源(樂觀鎖)

==适合資料送出類的接口使用==

不安全但幂等

用用戶端管理的執行個體号建立一個資源

通過替換的方式更新資源

如果未被修改,則更新資源(樂觀鎖)

==适合更新資料的接口使用==

删除資源

==适合删除資料的接口使用==

ip白名單是指将接口的通路權限對部分ip進行開放。這樣就能避免其他ip進行通路攻擊,設定ip白名單比較麻煩的一點就是當你的用戶端進行遷移後,就需要重新聯系服務提供者添加新的ip白名單。設定ip白名單的方式很多,除了傳統的防火牆之外,spring cloud alibaba提供的元件sentinel也支援白名單設定。為了降低api的複雜度,推薦使用防火牆規則進行白名單設定。

限流是為了更好的維護系統穩定性。使用redis進行接口調用次數統計,ip+接口位址作為key,通路次數作為value,每次請求value+1,設定過期時長來限制接口的調用頻率。

使用aop全局記錄請求日志,快速定位異常請求位置,排查問題原因。

在接口調用過程中,可能會涉及到訂單号等敏感資料,這類資料通常需要脫敏處理,最常用的方式就是加密。加密方式使用安全性比較高的<code>rsa</code>非對稱加密。非對稱加密算法有兩個密鑰,這兩個密鑰完全不同但又完全比對。隻有使用比對的一對公鑰和私鑰,才能完成對明文的加密和解密過程。

用戶端盡量不處理邏輯

用戶端不處理金額

用戶端參數校驗規則可以通過接口傳回,同時提供預設規則,接口不通則使用預設規則。

圖檔文案等,與校驗規則類似,通過接口傳回,并提供預設。

清單界面

多個boolean可以flag替換

采用http的狀态碼進行資料封裝,例如200表示請求成功,4xx表示用戶端錯誤,5xx表示伺服器内部發生錯誤。狀态碼設計參考如下:

分類

描述

1xx

資訊,伺服器收到請求,需要請求者繼續執行操作

2xx

成功

3xx

重定向,需要進一步的操作以完成請求

4xx

用戶端錯誤,請求包含文法錯誤或無法完成請求

5xx

服務端錯誤

狀态碼枚舉類:

響應狀态碼2xx

200:正常請求

201:建立成功

響應狀态碼3xx

301:永久重定向

302:暫時重定向

響應狀态碼4xx

403:請求無權限

404:請求路徑不存在

405:請求方法不存在

響應狀态碼5xx

500:伺服器異常

告别編碼5分鐘,命名2小時!史上最全的java命名規範參考!

java編碼命名規範

git分支管理辦法

繼續閱讀