<?xml version="1.0" encoding="UTF-8"?>
<configs>
<config key="default">
<property key="APP_ID">wx67b***b345f</property>
<property key="PAY_API_SECRET">jE74f***wvZj2</property>
<property key="PAY_MCH_ID">138***02</property>
<property key="SIGN_TYPE">MD5</property>
<property key="PAY_NOTIFY_URL">http://***</property>
</config>
</configs>
參考每個模塊下相應(yīng)的配置文件示例
配置文件一般以configs作根節(jié)點
其下有多個config
在代碼中可以根據(jù)config.key來確定調(diào)用哪個配置
<configs>
<config key="default">
<property key="KEY">VALUE</property>
</config>
</configs>
anyline-nacos集成了nacos配置中心用來配置文件集中管理與實時同步,
需要在classpath下添加配置文件anyline-nacos.xml
在nacos上創(chuàng)建配置文件時,需要與配置類的CONFIG_NAME值保持一致,如PageNavi.CONFIG_NAME = "anyline-navi.xml"
<?xml version="1.0" encoding="UTF-8"?>
<configs>
<config key="default">
<!-- 服務(wù)器地址 -->
<property key="ADDRESS">192.168.9.10</property>
<!-- 端口 默認8848 -->
<property key="PORT">8848</property>
<!-- namespace 默認public -->
<property key="NAMESPACE">public</property>
<!-- group 默認 DEFAULT_GROUP -->
<property key="GROUP">DEFAULT_GROUP</property>
<!-- 是否自動掃描配置類 默認true -->
<property key="AUTO_SCAN">true</property>
</config>
</configs>
對于多個環(huán)境配置不同的情況 如生產(chǎn)環(huán)境與測試環(huán)境與開發(fā)環(huán)境
開發(fā)環(huán)境多變,生產(chǎn)與測試相對固定
為避免開發(fā)環(huán)境提交的配置誤覆蓋生產(chǎn)環(huán)境.需要在生產(chǎn)環(huán)境中創(chuàng)建一份以anyline-config-*.xml配置文件
配置文件在開發(fā)環(huán)境一般只有一個完整配置
在測試和生產(chǎn)環(huán)境會有其他的配置文件anyline-config-*.xml
系統(tǒng)加載配置文件時首先加載anyline-config.xml 后加載anyline-config-*.xml
如果有重復(fù)key,anyline-config.xml中的重復(fù)數(shù)據(jù)將會被覆蓋.
是為了避免項目發(fā)布時,因修改生產(chǎn)環(huán)境配置文件失誤造成的問題.
常見如多個境調(diào)用接口的IP不同,多個數(shù)據(jù)庫中的主鍵值不一致
其中在核心配置文件anyline-config.xml中的RELOAD用來設(shè)置系統(tǒng)多長時間重新加載一次配置文件(包括所有配置文件)
//DataRow的key大小寫(默認大寫)
DataRow.DEFAULT_KEY_KASE = KeyAdapter.KEY_CASE.LOWER;
//http分頁參數(shù)-當(dāng)前當(dāng)前第幾頁(默認page)
PageNaviConfig.DEFAULT_KEY_PAGE_NO = "pageNum";
//http分頁參數(shù)-每頁多少條(默認vol)
PageNaviConfig.DEFAULT_KEY_PAGE_ROWS = "pageSize";
//是否允許前端設(shè)置每頁多少條(默認false)
PageNaviConfig.DEFAULT_VAR_CLIENT_SET_VOL_ENABLE = true;
以anyline-aliyun-sms為例,每個工具類都會對應(yīng)一個配置類與默認實例化類
如SMSUtil對應(yīng)SMSConfig與SMSBeanSMSConfig用來配置帳號密碼等
SMSBean用來在系統(tǒng)啟動中往Spring上下文中注入一個默認的SMSUtil實例
SMSUtil就是開發(fā)中常用的工具了,如發(fā)送短信、查詢短信接收狀態(tài)、創(chuàng)建短信模板等
其中SMSConfig中的變量可以通過多種方式設(shè)置
1.配置文件anyline-aliyun-sms.xml(根據(jù)SMSConfig中的靜態(tài)變量CONFIG_NAME = "anyline-aliyun-sms.xml";)
這個配置文件中可以配置多組帳號密碼,開發(fā)過程中根據(jù)需要生成針對不同帳號的util
一般這樣配置
<configs><config key="default">帳號、密碼等</config><config key="instance-oa">帳號、密碼等</config><config key="instance-crm">帳號、密碼等</config></configs>SMSUtil.getInstance("instance-crm")的方式獲取不同的util
2.如果帳號無限多、如開發(fā)一個SAAS平臺,這時的帳號密碼會由不同的租戶或用戶自己設(shè)置,數(shù)據(jù)通常要保存在數(shù)據(jù)中。在運行過程中根據(jù)用戶環(huán)境來調(diào)用不同的util
在實例化util前可以通過
SMSConfig.register("用戶編號", DataRow)的方式先注冊,其中DataRow中的KEY與配置文件中的KEY相對應(yīng)
SMSConfig中一般會提供多個register的重載
再通過SMSUtil.getInstance("用戶編號")的方式獲取util
3.對于一些簡單的項目,不想使用配置文件的可以通過2的方式直接register方式注冊一個
也可以設(shè)置SMSConfig中的靜態(tài)變更 DEFAULT_配置文件中的KEY
如DEFAULT_ACCOUNT(對應(yīng)配置文件中的ACCOUNT)、DEFAULT_PASSWORD(對應(yīng)配置文件中的PASSWORD)
這樣在系統(tǒng)啟動后會在Spring上下文中默認注入一個SMSUtil實例
4.現(xiàn)有的項目配置文件中設(shè)置,參考SMSBean中的屬性
@Value("${anyline.aliyun.sms.key:}") private String ACCESS_KEY;
這樣在系統(tǒng)啟動后會在Spring上下文中默認注入一個SMSUtil實例
5.nacos配置中心
需要添加依賴anyline-nacos
anyline-nacos本身也有配置文件用來指定NACOS配置中心地址以及namespace/group
可以通過anyline-nacos.xml配置文件設(shè)置
如果是spring boot項目則按spring boot方式來配置如 nacos.config.server-addr
如果是spring cloud項目則按spring cloud方式來配置如 spring.cloud.nacos.config.server-addr
配置好nacos后在nacos中根據(jù) 根據(jù)SMSConfig中的靜態(tài)變量CONFIG_NAME = "anyline-aliyun-sms.xml" 命名nacos中的dataId
所有org.anyline包下的配置文件都統(tǒng)一實現(xiàn)了nacos的讀取,實際是由父類AnylineConfig實現(xiàn)
如org.anyline.aliyun.oss.util.OSSConfig
public class OSSConfig extends AnylineConfig
每個類中有一個CONFIG_NAME 屬性用來指定配置文件名稱
public static String CONFIG_NAME = "anyline-aliyun-oss.xml";
接入過程:
1.依賴anyline-nacos
<dependency>
<groupId>org.anyline</groupId>
<artifactId>anyline-nacos</artifactId>
</dependency>
2.在項目中創(chuàng)建anyline-nacos.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configs>
<config key="default">
<!-- 服務(wù)器地址,一般使用內(nèi)網(wǎng)IP,如果對外開放注意訪問控制,如利用nginx設(shè)置IP白名單 -->
<property key="ADDRESS">IP或域名</property>
<!-- 端口 默認8848 -->
<property key="PORT">80</property>
<!-- 沒有特別需要,以下5個不需要配置 -->
<!-- namespace 默認為空,會讀取public空間下的配置文件,默認namespace是空不需要配置這項,而不是配置成public -->
<property key="NAMESPACE">2c9cbc2f-9ad0-4050-848f-70765b3ddd12</property>
<!-- group 默認 DEFAULT_GROUP -->
<property key="GROUP">DEFAULT_GROUP</property>
<!-- 是否自動掃描配置類 默認true -->
<property key="AUTO_SCAN">true</property>
<!-- 需要掃描的包,多個包以逗號分隔,默認只掃描org.anyline和org.anyboot兩個包 -->
<property key="SCAN_PACKAGE">org.anyline</property>
<!-- 需要掃描的類,多個類以逗號分隔 -->
<property key="SCAN_CLASS">org.anyline.entity.PageNaviConfig</property>
</config>
</configs>
注意以上的NAMESPACE不是命名空間的名稱而是一個8-4-4-4-12格式的ID號
由于微信API中有一部分接口僅對白名單IP開放,在測試機上經(jīng)常會遇到調(diào)用接口失敗的情況。
所以增加了配置項SERVER_WHITELIST,設(shè)置成與微信公眾平臺白名稱一致,多個IP以","分開,一般在生產(chǎn)環(huán)境不需要設(shè)置,主要是針對測試環(huán)境,系統(tǒng)運行時如果檢測到配置文件中設(shè)置了白名單并且本機IP不在白名單內(nèi),則遇到僅對白名單開發(fā)的API時直接跳過,不再嘗試調(diào)用,如獲取access token
微信公眾平臺白名單IP設(shè)置:
進入微信公眾平臺,點擊開發(fā)——>基本配置 ,開啟微信公眾平臺的開發(fā)者密碼(AppSecret),記住密碼,并保存;(如果沒有開啟,先開啟)開啟之后,在開發(fā)者密碼(AppSecret)的下方會出現(xiàn)IP白名單;
添加ip白名單,添加調(diào)用微信接口的服務(wù)器的ip地址
<?xml version="1.0" encoding="UTF-8"?>
<configs>
<config key="default">
<property key="APP_ID">wx16***21a57</property>
<property key="SIGN_TYPE">RSA</property>
<property key="SERVER_TOKEN">***</property>
<!-- 暫時與公眾號回調(diào)一致 -->
<property key="WEB_SERVER">http://***</property>
<property key="OAUTH_REDIRECT_URL">http://***</property>
<property key="PAY_API_SECRET">oaonhd**********ohvottvq</property>
<property key="PAY_MCH_ID">143*****402</property>
<property key="PAY_NOTIFY_URL">http://****/js/hm/pay/ntf/wx_mp</property>
<property key="PAY_CALLBACK_URL"></property>
<property key="PAY_KEY_STORE_FILE">D:\\apiclient_cert.p12</property>
<property key="PAY_KEY_STORE_PASSWORD">111111</property>
</config>
</configs>
<?xml version="1.0" encoding="UTF-8"?>
<configs>
<config key="default">
<property key="APP_ID">wx67***45f</property>
<property key="APP_SECRET">f013***5473a877</property>
<property key="SIGN_TYPE">MD5</property>
<property key="SERVER_TOKEN">any***rg</property>
<property key="PAY_API_SECRET">oaonhd**********ohvpvbozqqayottvq</property>
<property key="PAY_MCH_ID">143*****402</property>
<property key="PAY_NOTIFY_URL">http://****/js/hm/pay/ntf/wx_mp</property>
<property key="PAY_CALLBACK_URL"></property>
<property key="PAY_KEY_STORE_FILE">D:\\apiclient_cert.p12</property>
<property key="PAY_KEY_STORE_PASSWORD">111111</property>
</config>
</configs>
<?xml version="1.0" encoding="UTF-8"?>
<configs>
<config key="default">
<property key="APP_ID">wxc403*******b5f06</property>
<property key="APP_SECRET">2ede1c*********c915f440745df8</property>
<property key="SIGN_TYPE">RSA</property>
<property key="SERVER_TOKEN">haofresh</property>
<property key="WEB_SERVER">http://******</property>
<property key="OAUTH_REDIRECT_URL">http://*******/wap/hm/lg/cb_wx_mp</property>
<property key="PAY_API_SECRET">oaonhd**********ohvpvbozqqayottvq</property>
<property key="PAY_MCH_ID">143*****402</property>
<property key="PAY_NOTIFY_URL">http://****/js/hm/pay/ntf/wx_mp</property>
<property key="PAY_CALLBACK_URL"></property>
<property key="PAY_KEY_STORE_FILE">D:\\apiclient_cert.p12</property>
<property key="PAY_KEY_STORE_PASSWORD">111111</property>
<!-- 支付到銀行卡公鑰文件 -->
<property key="PAY_BANK_RSA_PUBLIC_KEY_FILE"></property>
<property key="SERVER_WHITELIST"></property>
</config>
</configs>
<!-- 多長時間加載一次配置文件 (秒),包括核心配置文件與其他配置文件-->
<property key="RELOAD">120</property>
<!-- 存放在servlet context中的key(配置文件熱重載時不覆蓋當(dāng)前key)(如el表達式中引用${al.RELOAD})-->
<property key="SERVLET_ATTRIBUTE_KEY">al</property>
<property key="DEBUG">true</property>
<!-- sql 存放根目錄 -->
<property key="SQL_STORE_DIR">/WEB-INF/classes/sql</property>
<!-- 密鑰 文件路徑 -->
<property key="DES_KEY_FILE">/WEB-INF/classes/key.xml</property>
<!-- 國際化文本存放目錄 -->
<property key="I18N_MESSAGE_DIR">/WEB-INF/classes/message</property>
<!-- 國際化消息SESSION存放KEY -->
<property key="I18N_MESSAGE_SESSION_KEY">I18N_MESSAGE_SESSION_KEY</property>
<!-- 國際化消息默認語言 -->
<property key="I18N_MESSAGE_DEFAULT_LANG">cn</property>
<!-- 默認主鍵 -->
<property key="DEFAULT_PRIMARY_KEY">ID</property>
<!-- 自動添加主鍵 -->
<property key="AUTO_CREATE_PRIMARY_KEY">true</property>
<!-- 是否顯示執(zhí)行的SQL -->
<property key="SHOW_SQL">true</property>
<property key="SHOW_SQL_PARAM">true</property>
<property key="SHOW_SQL_WHEN_ERROR">false</property>
<property key="SHOW_SQL_PARAM_WHEN_ERROR">false</property>
<!-- 是否更新NULL列 -->
<property key="IS_UPDATE_NULL_COLUMN">false</property>
<!-- 是否更新空列 -->
<property key="IS_UPDATE_EMPTY_COLUMN">false</property>
<!-- 生成主鍵的存儲過程 按3個輸入?yún)?shù)的格式:表,列,其他-->
<property key="AUTO_CREATE_PRIMARY_KEY">true</property>
<property key="CREATE_PRIMARY_KEY_PROCEDURE">PROC_CREATE_PRIMARY</property>
<!-- 模板文件目錄 -->
<property key="TEMPLET_FILE_PATH_WEB">/WEB-INF/web/home/template/default.jsp</property>
<property key="TEMPLET_FILE_PATH_WAP">/WEB-INF/def/wap/common/templet.jsp</property>
<!-- fail文件路徑 -->
<property key="FAIL_FILE_PATH">/WEB-INF/def/web/common/error/fail.jsp</property>
<!-- error文件路徑 -->
<property key="ERROR_FILE_PATH">/WEB-INF/def/web/common/error/error.jsp</property>
<!-- 是否啟用(一級)緩存 -->
<property key="IS_USE_CACHE">true</property>
?key.xml設(shè)置加密解密密鑰,第1個為項目正在使用的默認密鑰,
其他的為歷史密鑰,主要解密搜索引擎快照中或收藏中的的密文.
(通過第1組密鑰解密失敗后,會依次嘗試其他密鑰)
key.xml中 密鑰文件一般不修改,應(yīng)該新添加一組配置,把原來默認的密鑰放在后面的位置.
version長度不可多于3位
如果刪除或修改密鑰,有可能造成通過搜索引擎快照連接過來的訪問解密失敗.
在新添加了默認密鑰一段時間后,如果確定引擎中已更新至最新版本可以刪除歷史密鑰,以提高解密速度.?
<!--?xml version="1.0" encoding="UTF-8"?-->
<keys>
<!-- 第一個為默認密鑰,之后為歷史密鑰(主要解密搜索引擎快照) -->
<!-- 密鑰版本號長度<=3 -->
<key version="v01">
<!-- 默認密鑰 -->
<des-key>5****6d9</des-key>
<!-- URL參數(shù)密鑰 -->
<des-key-param>@#CF***(*7#</des-key-param>
<!-- URL參數(shù)名密鑰 -->
<des-key-param-name>@***$%#</des-key-param-name>
<!-- URL參數(shù)值密鑰 -->
<des-key-param-value>@#)_UI%097#</des-key-param-value>
<!-- 默認前綴 -->
<des-prefix></des-prefix>
<!-- URL參數(shù)前綴 -->
<des-prefix-param>p</des-prefix-param>
<!-- URL參數(shù)名前綴 -->
<des-prefix-param-name>k</des-prefix-param-name>
<!-- URL參數(shù)值前綴 -->
<des-prefix-param-value>v</des-prefix-param-value>
</key>
</keys>
<?xml version="1.0" encoding="UTF-8"?>
<configs>
<config key="default">
<property key="ACCOUNT">server@anyline.org</property>
<property key="USERNAME">anyline</property>
<property key="PASSWORD">tySb6ZK******5SXXPNZhg</property>
<property key="PROTOCOL">smtp</property>
<property key="HOST">smtp.anyline.org</property>
<property key="PORT">25</property>
</config>
</configs>
<?xml version="1.0" encoding="UTF-8"?>
<configs>
<config key="default">
<property key="APP_ID">101***22</property>
<property key="API_KEY">bd7f56f0***822566</property>
<!-- 登錄成功回調(diào)url 保持與QQ互聯(lián)(https://connect.qq.com/manage.html)對應(yīng)的APP網(wǎng)站回調(diào)域一致 -->
<property key="OAUTH_REDIRECT_URL">http://***</property>
</config>
</configs>
<?xml version="1.0" encoding="UTF-8"?>
<configs>
<config key="default">
<property key="APP_ID">wx67b***b345f</property>
<property key="PAY_API_SECRET">jE74f***wvZj2</property>
<property key="PAY_MCH_ID">138***02</property>
<property key="SIGN_TYPE">MD5</property>
<property key="PAY_NOTIFY_URL">http://***</property>
</config>
</configs>
<?xml version="1.0" encoding="UTF-8"?>
<configs>
<config key="default">
<property key="APP_KEY"></property>
<property key="MASTER_SECRET"></property>
</config>
</configs>
<?xml version="1.0" encoding="UTF-8"?>
<configs>
<config>
<property key="HOST">https://a1.easemob.com</property>
<property key="APP_KEY">1118***uo</property>
<property key="ORG_NAME">111***5170</property>
<property key="APP_NAME">***</property>
<property key="CLIENT_ID">YXA***5LujQ</property>
<property key="CLIENT_SECRET">YXA6*****CilUFKxP2jl-wE</property>
</config>
</configs>
<?xml version="1.0" encoding="UTF-8"?>
<configs>
<config key="default">
<property key="KEY">3b9371b483******c219522fdc</property>
<property key="TABLE_ID">5937******ab517b6a</property>
<property key="PRIVATE_KEY">72c5c*****4144682</property>
</config>
</configs>
<?xml version="1.0" encoding="UTF-8"?>
<configs>
<config key="default">
<!-- 申請地址:https://ak-console.aliyun.com -->
<property key="ACCESS_KEY"></property>
<property key="ACCESS_SECRET"></property>
<property key="SMS_SIGN"></property>
</config>
</configs>
<?xml version="1.0" encoding="UTF-8"?>
<configs>
<config key="default">
<property key="ACCESS_ID"></property>
<property key="ACCESS_SECRET"></property>
<property key="ENDPOINT">oss-cn-shanghai.aliyuncs.com</property>
<property key="BUCKET">alcdn</property>
<!-- 生成的密鑰多長時間有效 -->
<property key="EXPIRE_SECOND">300</property>
<!-- 默認文件目錄 -->
<property key="DIR"></property>
</config>
</configs>
<?xml version="1.0" encoding="UTF-8"?>
<configs>
<config key="default">
<property key="APP_ID">wx16***21a57</property>
<property key="SIGN_TYPE">RSA</property>
<property key="SERVER_TOKEN">***</property>
<!-- 暫時與公眾號回調(diào)一致 -->
<property key="WEB_SERVER">http://***</property>
<property key="OAUTH_REDIRECT_URL">http://***</property>
<property key="PAY_API_SECRET">oaonhd**********ohvottvq</property>
<property key="PAY_MCH_ID">143*****402</property>
<property key="PAY_NOTIFY_URL">http://****/js/hm/pay/ntf/wx_mp</property>
<property key="PAY_CALLBACK_URL"></property>
<property key="PAY_KEY_STORE_FILE">D:\\apiclient_cert.p12</property>
<property key="PAY_KEY_STORE_PASSWORD">111111</property>
</config>
</configs>
<?xml version="1.0" encoding="UTF-8"?>
<configs>
<config key="default">
<!-- 第一頁 -->
<property key="STYLE_BUTTON_FIRST">第一頁</property>
<!-- 上一頁 -->
<property key="STYLE_BUTTON_PREV">上一頁</property>
<!-- 下一頁 -->
<property key="STYLE_BUTTON_NEXT">下一頁</property>
<!-- 最后頁 -->
<property key="STYLE_BUTTON_LAST">最后頁</property>
<!-- 數(shù)據(jù)統(tǒng)計格式 -->
<property key="STYLE_STAT_FORMAT"></property>
<!-- 查詢無內(nèi)容提示 -->
<property key="STYLE_DATA_EMPTY"></property>
<!-- 最后一頁提示 -->
<property key="STYLE_PAGE_OVER"></property>
<!-- 下標數(shù)量 -->
<property key="VAR_PAGE_RANGE">5</property>
<!-- 顯示上一頁下一頁 -->
<property key="VAR_SHOW_BUTTON">true</property>
<!-- 顯示下標 -->
<property key="VAR_SHOW_INDEX">true</property>
<!-- 顯示下標省略符 1...5,6,7,8,9...20 -->
<property key="VAR_SHOW_INDEX_ELLIPSIS">true</property>
<property key="STYLE_INDEX_ELLIPSIS">...</property>
<!-- 顯示數(shù)據(jù)統(tǒng)計 -->
<property key="VAR_SHOW_STAT">true</property>
<!-- 跳轉(zhuǎn)到 -->
<property key="VAR_SHOW_JUMP">false</property>
<!-- 加載更多格式 -->
<property key="STYLE_LOAD_MORE_FORMAT">加載更多</property>
<property key="STYLE_FILE_PATH">//www.anyline.org/plugin/navi/navi.css</property>
<property key="SCRIPT_FILE_PATH">//www.anyline.org/plugin/navi/navi.js</property>
<!-- 每頁多少條 -->
<property key="VAR_PAGE_DEFAULT_VOL">10</property>
<!-- 每頁最多可設(shè)置顯示多少條 -->
<property key="VAR_PAGE_MAX_VOL">100</property>
<!-- 是否允許前端設(shè)置每頁多少條 -->
<property key="VAR_CLIENT_SET_VOL_ENABLE">true</property>
<!-- 用戶選擇每頁多少條 -->
<!-- STYLE_PAGE_VOL與STYLE_PAGE_VOL_NUMBERS 會相互覆蓋 (以配置文件后設(shè)置的為準) -->
<property key="STYLE_PAGE_VOL"><select onchange=''_navi_change_vol({navi-conf})'' id=''navi_vol_set_{navi-conf-key}'' class=''navi-vol-set''><option value=''10''>10 條/頁</option><option value=''20''>20 條/頁</option><option value=''30''>30 條/頁</option><option value=''50''>50 條/頁</option><option value=''100''>100 條/頁</option></select></property>
<!-- 生成的select.class -->
<property key="VAR_PAGE_VOL_CLASS">navi-vol-set</property>
<!-- 顯示位置 last:最后,page:頁標之后-->
<property key="VAR_PAGE_VOL_INDEX">last</property>
<!-- 生成select的option -->
<property key="VAR_PAGE_VOL_NUMBERS">10,20,30,50,100</property>
<!-- 統(tǒng)計樣式 -->
<property key="STYLE_STAT_FORMAT"><div class=''navi-summary''>共<span class=''navi-total-row''>{totalRow}</span>條 第<span class=''navi-cur-page''>{curPage}</span>/<span class=''navi-total-page''>{totalPage}</span>頁</div></property>
</config>
</configs>
更多建議: