spring cloud微服務自定義資料來源《一》——mysql資料庫
阿新 • • 發佈:2021-06-27
場景說明
專案整體是使用的是spring cloud架構,配置中心為spring cloud config元件。
最近專案中有個需求是上線的時候需要新舊服務同時執行,但資料庫表結構在本期變更中發生了很大的變化,所以這裡考慮的使用自定義資料來源來實現新舊服務訪問不同的資料來源。
新服務訪問線上的正式資料庫,舊的服務訪問當前線上資料庫的備份庫。新的部署規劃如下:
備註:這裡熟悉spring boot的同學會說,這很好辦,可以通過spring boot配置檔案的優先順序順序,直接在當前服務根路徑下定義config/application.yml檔案,然後直接配置spring.datasource
來覆蓋全域性的配置即可。大家都知道spring boot工程目錄下config/application.yml配置優先順序是最高的,這在單體專案下,確實是成立的,但是如果使用的spring cloud config配置中心,則配置
中心的配置優先順序才是最高的。
實現方案
專案環境:spring boot 1.5.9 + spring cloud 1.3.6
1.在當前專案配置檔案新增新資料來源配置,這裡增加資料來源為dbBak,使用的是druid連線池
spring: #資料來源 datasource: dbBak: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/test?useSSL=false&characterEncoding=utf8&allowMultiQueries=true username: root password: 123456 type: com.alibaba.druid.pool.DruidDataSource druid: # 初始化連線池個數 initial-size: 5 # 最大連線池個數 max-active: 20 # 最小連線池個數 min-idle: 5 # 配置獲取連線等待超時的時間,單位毫秒,預設啟用公平鎖,併發效率會有所下降 max-wait: 60000 # 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒 time-between-eviction-runs-millis: 60000 # 配置一個連線在池中最小生存的時間,單位是毫秒 min-evictable-idle-time-millis: 300000 # 如果validationQuery為null,testOnBorrow、testOnReturn、testWhileIdle都不會起作用 validation-query: SELECT 1 FROM DUAL # 建議配置為true,不影響效能,並且保證安全性。 # 申請連線的時候檢測,如果空閒時間大於timeBetweenEvictionRunsMillis,執行validationQuery檢測連線是否有效。 test-while-idle: true # 申請連線時執行validationQuery檢測連線是否有效,做了這個配置會降低效能 test-on-borrow: false # 歸還連線時執行validationQuery檢測連線是否有效,做了這個配置會降低效能 test-on-return: false # 開啟PSCache,並且指定每個連線上PSCache的大小 pool-prepared-statements: true
2.增加config配置檔案,新建配置檔案DuridDataSourceConfig配置類
@Configuration public class DruidDatasourceConfig { /** * 新增 DruidDataSource 元件到容器中,並繫結屬性: * 將自定義的 Druid 資料來源新增到容器中,不再讓 Spring Boot 自動建立 * 這樣做的目的是:繫結全域性配置檔案中的 druid 資料來源屬性到 com.alibaba.druid.pool.DruidDataSource * 從而讓它們生效 * * @ConfigurationProperties(prefix = "spring.datasource"):作用就是將 全域性配置檔案中 字首為 spring.datasource * 的屬性值注入到 com.alibaba.druid.pool.DruidDataSource 的同名引數中 */ @ConfigurationProperties(prefix = "spring.datasource.dbBak") @Bean public DataSource druidDataSource() { return new DruidDataSource(); } /** * 註冊 Druid 監控之管理後臺的 Servlet */ @Bean public ServletRegistrationBean servletRegistrationBean() { ServletRegistrationBean bean = new ServletRegistrationBean( new StatViewServlet(), "/druid/*"); /** * 這些引數可以在 com.alibaba.druid.support.http.StatViewServlet 的父類 com.alibaba.druid.support.http.ResourceServlet 中找到 * loginUsername:Druid 後臺管理介面的登入賬號 * loginPassword:Druid 後臺管理介面的登入密碼 * allow:Druid 白名單,後臺允許誰可以訪問,多個用逗號分割, 如果allow沒有配置或者為空,則允許所有訪問 * initParams.put("allow", "localhost"):表示只有本機可以訪問 * initParams.put("allow", ""):為空或者為null時,表示允許所有訪問 * deny:Druid 黑名單,後臺拒絕誰訪問,多個用逗號分割 (共同存在時,deny優先於allow) * initParams.put("deny", "192.168.1.20");表示禁止此ip訪問 */ Map<String, String> initParams = new HashMap<>(); initParams.put("loginUsername", "admin"); initParams.put("loginPassword", "88888"); initParams.put("allow", ""); initParams.put("allow", "localhost"); /** 設定初始化引數*/ bean.setInitParameters(initParams); return bean; } /** * 配置 Druid 監控之 web 監控的 filter * 這個過濾器的作用就是統計 web 應用請求中所有的資料庫資訊, * 比如 發出的 sql 語句,sql 執行的時間、請求次數、請求的 url 地址、以及seesion 監控、資料庫表的訪問次數 等等。 */ @Bean public FilterRegistrationBean filterRegistrationBean() { FilterRegistrationBean bean = new FilterRegistrationBean(); bean.setFilter(new WebStatFilter()); /** exclusions:設定哪些請求進行過濾排除掉,從而不進行統計*/ Map<String, String> initParams = new HashMap<>(); initParams.put("exclusions", "*.js,*.gif,*.jpg,*,png,*.css,/druid/*"); bean.setInitParameters(initParams); /** "/*" 表示過濾所有請求*/ bean.setUrlPatterns(Arrays.asList("/*")); return bean; } }
3.正常啟動專案後,訪問http://localhost:8080/druid/ ,會開啟durid控制檯頁面,切換到【資料來源】頁面,就會看到連線已經更新