2021年1月16日 星期六

SpringBoot 整合 Flyway

 maven:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>


yml:

spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/flyway_db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 123456
jpa:
show-sql: true
flyway:
enabled: true # flyway 的開關,一關就等同沒有 flyway
url: ${spring.datasource.url}
user: ${spring.datasource.username}
password: ${spring.datasource.password}
locations: classpath:db/migration # 預設會在這個路徑找 sql 檔,多個可用逗號隔開
check-location: true
encoding: utf-8 # 預設就是 utf-8
table: flyway_schema_history #預設就是這張表,可以改

baseline-on-migrate: true # 如果 table 的表已有,又改了表,在資料庫就會有兩張表,這時就要為 true
baseline-version: 62 # baseline-on-migrate true ,且真的有執行才有用,預設是 1
#table version 欄位,會從這個版本開始往上增加,<=這個版本的sql不會執行


預設在 class 下(src/main/resources) 要有 db/migration,想改照上面的圖改就可以了,裡面的檔案要照一定的格式才可以使用 flyway,不照做在啟動時就會報錯


flyway有兩個版本,commity 和 teams,teams 要付錢

分成 V、U、R,但 U 要付錢的版本才能用,V 和 U 後接版本號,然後再接兩個底線,內容放資料庫的操作

springboot 啟動後就會執行裡面的東西,預設會先創建 flyway_schema_history,想改照上面的 yml 改就行

※以 V 來說會執行數字最小的,然後一直往數字大的執行,可以跳號

※執行到錯誤就停止或執行到最新的一筆

※flyway_schema_history 裡的東西不能改,一啟會報錯,而且還不好抓錯誤

※db/migration 的檔名一執行過就不要改了,一啟動也會報錯,但可以用 flyway repair 後再執行可以解決,下面會說明怎麼安裝

※但 db/migration 檔案裡的內容不在 flyway 的控管範圍,假設用 flyway 創建了一張表,然後自己去資料庫改了欄位名稱,只要在新的內容裡對應好就不會報錯,只是失去了版本控管的意義而已


flyway 指令

官網下載好後解壓,以 windows 為例

conf 可以設定資料庫連線,設定四個就可以玩了,flyway.url   flyway.driver  flyway.user  flyway.password,前面的 # 是註解,要拿掉

在這個資料夾的同一層有 flyway 用在linux    flyway.cmd 用在windows,linux 要在前面加「./」就可以用這個指令了,想在認何地方用這個指令,要自己加環境變數


clean 會將 flyway_schema_history 所在的所有 table,不管是不是版控裡建的,都會drop 掉,可怕的指令

info 會將 flyway_schema_history 表列出來

baseline 和上面的 yml 的作用一樣

repair 最常用的一個指令,如有錯時,大部分都用這個指令,然後再執行就可以解決大部分的事

github 連結


2021年1月11日 星期一

Springboot 整合 XXL Job

文檔連結
下載連結(2.2版)
重大提示:
v2.1.0 移除 quartz 依賴   
v2.2.0 移除 JobHanler,用 @XxlJob 替代
下載後,執行 doc\db 裡的 SQL
xxl-job-admin 的 application.properties,資料庫連線相關的設定一下

doc/db/tables_xxl_job.sql 裡的腳本要先執行

以下為官網說明截取的:
xxl-job-admin:调度中心
xxl-job-core:公共依赖
xxl-job-executor-samples:执行器Sample示例(选择合适的版本执行器,可直接使用,也可以参考其并将现有项目改造成执行器)
    :xxl-job-executor-sample-springboot:Springboot版本,通过Springboot管理执行器,推荐这种方式;
    :xxl-job-executor-sample-spring:Spring版本,通过Spring容器管理执行器,比较通用;
    :xxl-job-executor-sample-frameless:无框架版本;

先啟動 xxl-job-admin 調度中心,再啟動 executor-samples,如用 sprinboot 就啟動 springboot
http://localhost:8080/xxl-job-admin 預設帳密 admin/123456



至少要有一個執行器,在任務管理新增的時候會用到,綠框有很多功能,舊版的左邊有分執行一次和 cron 的,新版的全部都用 cron 了,且 cron 也有工具,點一點就生成了

2021年1月9日 星期六

反向代理、負載均衡、動靜分離 (nginx 三)

 http {

#負載均衡

upstream clusterNacos {

#負載策略

預設什麼都不寫是輪詢,按時間順序逐一分配,如果伺服器當機,也能自動跳過

weight; #預設為1,數字越大分配的越多

ip_hash; #一個ip固定一個後端伺服器

fair; #後端回應短的優先分配

server 127.0.0.1:9000;

server 127.0.0.1:9001;

server 127.0.0.1:9002;

}


server {

listen 9003;

server_name localhost;

location / {

proxy_pass http://clusterNacos;

}

}

#反向代理

server {

listen 9004;

server_name localhost;

location ~ /xxx/ {

proxy_pass http://127.0.0.1:9003;

}

location ~ /ooo/ {

proxy_pass http://127.0.0.1:9004;

}

}

#動靜分離

server {

listen 9005;

server_name localhost;

location /www/ {

index.html;

}

location /image/ {

root /jpg;

autoindex on;

}

}

}

Sentinel ( SpringCloud 2.x 九)

和 Nacos 一樣,要先下載 sentinel 並啟動,以 1.8 為例

下載連結

下載 sentinel-dashboard-1.8.0.jar 之後,是個 jar 檔,用以下指令啟動:

java -jar -Dserver.port=8080 sentinel-dashboard-1.8.0.jar #-Dserver.port 預設就是8080

登入 localhost:8080,帳密預設都是 sentinel,想改可再加 -D

-Dsentinel.dashboard.auth.username=sentinel

-Dsentinel.dashboard.auth.password=123456

文檔連結


然後在瀏覽器打 localhost:port 加上帳密就可以進去了,但要先有請求,左邊才會長出來讓你設定
所以要在專案增加 maven 和設定

pom.xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

application.yml
server:
port: 8056
spring:
cloud:
sentinel:
transport:
port: 8719
dashboard: localhost:9090 #對應 sentinel port

寫個 controller 並請求,sentinel 的左邊就長出來了;如果没有請求,預設是懶加載,如下的圖,綠框不會出現
如果不想懶加載,可用 spring.cloud.sentinel.eager=true,這時綠框出來了,但最後是(0/1),但只有欄位名而已,如 資源名、通過 QPS…等,如下圖,所以還是要有請求才能做限流







※綠框是長出來的樣子,點擊簇鏈路會出現如上的樣子,四個按鈕對應左邊的選項,是一樣的功能


※流控規則



資源名:如 GetMapping 裡的路徑,包括「/」
針對來源:可針對微服務做限流,寫微服務名,全部都限流就寫 default
閾值類型:QPS 才有最下面的流控效果;線程數只有快速失敗
單機閾值:數字,如 QPS 又寫了2,表示一秒超過兩個請求就會限流,至於哪種限流,要看流控效果,被限流時,網頁會顯示「Blocked by Sentinel (flow limiting)」
線程數+單機閾值為 1 表示線程只有 1 個,如果線程第 1 個還沒處理完又來一個請求,就會限流,可以在方法加 sleep 來試


※關聯


※如上圖,/testRelated 如果每秒超過1個請求,那 /testSentinel 就不能訪問


※鏈路

※如上圖,/testChain1 如果呼叫資源 abcdef,那每秒超過1個請求就會限流
abcdef 是寫在註解上的,這個註解只能放在方法上,blockHandler 是失敗時呼叫的方法
@SentinelResource(value = "abcdef", blockHandler = "chainHandler")

※但使用鏈路時還得抓 maven 和設定,版本用自己下載 sentinel 的版本
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-web-servlet</artifactId>
<version>1.8.0</version>
</dependency>
https://github.com/alibaba/Sentinel/issues/1213
官網說可以用 spring.cloud.sentinel.web-context-unify=false,但我一開始試沒有用,只有用這個網址 main 方法裡的 sentinelFilterRegistration方法才可以
後來發現父 POM 的 spring-cloud-alibaba-dependencies 版本是 2.2.1.RELEASE,下載的 sentinel 是 1.7.1 的,但我用的是 1.8,我改成 2.2.2.RELEASE,會變成 1.8 版本的,這時候就好使了




※預熱


原碼找 WarmUpController,codeFactor 是寫死的3

以此例來說,官網說一開始是 6/3,每秒超過2個請求就會限流,經過5秒後,每秒超過6個請求才會限流,但我沒試出來


※排隊等待


排隊等待會用平均的速度對待每個 request
1000(毫秒數) / 單機閾值,如果寫 1 就是每秒;寫 2 就是每 500 毫秒,依此類推
此例就是平均每秒 1 個 request,超過 5 秒就放棄
單機閾值不能 > 1000