Touch 方法&屬性 對映工具
Touch 方法&屬性 對映工具(0.5 版本)
標籤 : github
線上後門與介面除錯:
原先需要測試一個介面(如Dubbo、DAO), 或為線上留後門, 需要寫大量的Web層(Api、Servlet或Controller)程式碼並在瀏覽器觸發, 進而呼叫到實際想要執行的方法或想檢視的屬性, 而有了Touch後, 你可以專注於業務功能的實現, 而不需要再書寫這些跟業務無關的觸發程式碼.
版本歷史
0.0 版本
- Touch的第一個釋出版本
- 介面對映最核心功能
- 基於Web.xml的配置: 類掃描Touch
@Touch
的touchPattern
- 第一版
com.vdian.touch.converter.Converter
@TouchArg
註解獲取引數泛型型別
0.1版本
- 增加Switcher介面, 增加線上環境安全校驗
- Converter 新增@TouchArg引數
- 增加Converter與Switcher的預設繫結
- fix 空QueryString bug
- fix 過載函式定位不準 bug
0.2版本
- 增加包掃描功能, 精簡web.xml內關於Touch的配置
- 增加ZookeeperSwitcher實現, 提供基於ZK叢集的Touch安全控制
- 增加
lists.do
介面提供獲取touch context內容 - fix fastjson迴圈引用 bug
0.3版本
- 0.3.0
刪除@TouchArg
註解, 動態獲取泛型引數型別 - 0.3.1 版本: 提高響應速度的同時降低記憶體佔用
- init時快取方法引數名、引數型別、引數泛型型別, 加速引數對映速度
- 使用WeakHashMap替換HashMap儲存TouchContext, 佔用的記憶體隨GC而釋放, 再次呼叫時重新init.
- 3.2 版本
更新Converter<T>
介面, 新增Type[] actualTypes
引數代表泛型真實型別, 非泛型引數為null
;
0.4版本
- 0.4.0
- 將
@Touch
從annotation包內移出, 直接放在com.vdian.touch
- 棄用web.xml配置, 使用Servlet 3.0 api實現
OnTouchServlet
自動註冊(預設攔截/touch/*
目錄URL). - 將配置集中放入touch.xml(classpath下)中, 並新增touch.xsd約束(已經放如touch.jar包內), 書寫touch.xml可實現程式碼提示.
- 更新
TouchSwitcher
介面, 新增init(Map<String, String> config)
方法, 建立TouchSwitcher
例項時呼叫(且只調用一次), 將在touch.xml<switch> <config .../> <switch>
標籤內容傳入init()
. - 更新
ZookeeperSwitcher
實現, 支援自定義指定ZK叢集. - fix Bean被AOP代理後找不到的Bug(但目前還不能支援Bean被JDK的同時對Bean Alias的情況).
- fix jaxp-dom讀取註釋的bug
- 將
- 0.4.1
- 使用GuavaCache替換WeakHashMap, 使key在不活躍1小時後失效, 解決頻繁訪問&頻繁GC的問題.
- fix json字串無法反序列化為String的問題
- fix 應用佔用lists.do(列印所有touchPattern)的問題
0.5 版本
- 0.5.0
- 去掉
loadOnStartup
, Touch不再隨應用啟動而初始化, 改為第一次訪問時初始化; - 將
@Touch
移植到filed
上, 支援成員變數對映(預計12月中旬釋出); - fix 同名
touchPattern
bug;
- 去掉
接下來到2017年不會再有大版本的更新, 而致力於使Touch更加穩定, 提供更高效能, 適用更多專案型別.
入門
1. pom
<dependency>
<groupId>com.vdian.touch</groupId>
<artifactId>touch</artifactId>
<version>0.5.0-SNAPSHOT</version>
</dependency>
2. touch.xml(maven專案需要放在resource目錄下)
<?xml version="1.0" encoding="utf-8"?>
<touch xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.vdian.net/touch"
xsi:schemaLocation="http://www.vdian.net/touch
http://www.vdian.net/touch.xsd">
<packages>
<!-- package最少有一個(可以多個), 否則touch.xsd驗證不通過, 且啟動時會拋異常 -->
<package>com.vdian.demo</package>
</packages>
<converters>
<!-- 預設已經註冊了下面三個Converter, 如果沒有自定義的Converter可以去掉這整個 converters 的配置 -->
<converter>com.vdian.touch.converter.CalendarConverter</converter>
<converter>com.vdian.touch.converter.DateConverter</converter>
<converter>com.vdian.touch.converter.SetConverter</converter>
</converters>
<switchers>
<!-- 預設沒有註冊任何Switcher, 如果需要使用ZookeeperSwitcher, 需要在專案pom中新增curator-recipes的依賴, 該依賴預設在Touch中是optional的 -->
<switcher class="com.vdian.touch.switcher.ZookeeperSwitcher">
<config key="zookeeper" value="zookeeper.address:2181"/>
<config key="touchPath" value="/touch/touch-switcher"/>
<config key="touchKey" value="touch_open"/>
</switcher>
</switchers>
</touch>
注意: touch.xml只需放在專案classpath下即可, Touch會自動去到classpath目錄下掃描該檔案, 不必被Spring託管.
3. @Touch
為想要touch的方法打上@Touch
註解, 馬上她就屬於你啦:
4. 瀏覽器輸入
http://localhost:8080/touch/
constumObject? // 方法名
{
"user": { // 方法引數名
"name": "feiqing", // 方法引數值
"age": 18
},
"date": "1992-03-20 01:01:01",
"users": [{
"name": "feiqing",
"age": 18
},
{
"name": "feiqing2",
"age": 98
}]
}
這樣, 你就可以愉快的touch一把:
注:
- 從0.4版本開始棄用web.xml配置, 啟用Servlet 3.0 api, OnTouchServlet自動註冊到Servlet容器內.
- 從0.2版本開始Touch不再支援on_touch_class配置, 全面換成包掃描packages .
- 使用Touch的Servlet自動註冊需要在專案中啟用Servlet 3.0(web.xml頭更新成如下即可, 否則還是需要像以前一樣手動註冊, 見註釋), 且保證專案內Servlet-api已達到3.0及以上版本(Touch的pom已經引入, 但要防止被其他配置沖掉).
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
metadata-complete="false">
<!-- Servlet 2.0 配置
<servlet>
<servlet-name>OnTouchServlet</servlet-name>
<servlet-class>com.vdian.touch.server.OnTouchServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>OnTouchServlet</servlet-name>
<url-pattern>/touch/*</url-pattern>
</servlet-mapping>
-->
</web-app>
進階
1. 同名方法
@Touch
註解內提供了touchPattern
引數用於區分過載方法, 但要注意touchPattern
要和瀏覽器內的URI(如前面的constumObject
)對應起來.
2. Converter與引數對映
引數對映
我們預設使用json與方法引數一一對映, 外層json的key為方法引數名.自定義Converter
Converter
大部分情況下是不用配的, Touch預設為我們綁定了很多型別:- String -> 八種Java基礎及包裝型別
- String -> String
- String -> Date(“yyyy-MM-DD HH:MM:SS”)
- String -> List
- String -> Set
- String -> Map
3. Switcher與安全性
Touch開放了TouchSwitcher
介面來提高touch介面的安全性:
public interface TouchSwitcher {
/**
* init when new TouchSwitcher instance.
*
* @param config in touch.xml <switcher><config ... /> ...</switcher>
*/
void init(Map<String, String> config);
boolean isSwitchOn(String touchPattern, String queryString);
}
如果想實現自己的安全過濾規則, 可參考ZookeeperSwitcher
(基於Zookeeper).
屬性對映(0.5 版本新功能)
@Component
public class TouchTestCaseImpl implements TouchTestCase {
@Touch
private String p1;
@Touch
private Date p2;
@Touch
private Map<String, Object> p3;
@Touch
private Set<String> p4;
@Touch
private int p5;
@Touch
private char p6;
@Touch
private User user;
@Touch
private List<User> users;
// ...
}
在瀏覽器訪問:
http://localhost:8080/touch/p1?string
http://localhost:8080/touch/p2?2012-01-05 12:30:30
http://localhost:8080/touch/p3?{"key1":"value1", "key2", 2}
http://localhost:8080/touch/p4?["set1", "set2"]
http://localhost:8080/touch/p5?88
http://localhost:8080/touch/p6?A
http://localhost:8080/touch/user?{"name":"jifang", "age":8}
http://localhost:8080/touch/users?[{"name":"jifang", "age":8},{"name":"jifang2", "age":18}]
即可對映&修改&獲取屬性值.
未來規劃
1. 方法引數名
Touch當前版本獲取方法引數名是從JVM的MethodArea用javassist獲取, 其效能很難估計, 如果將來我們需要提升效能, 可以新增類似MyBatis的@Param
註解, 但這種方式會增加使用者使用的負擔(畢竟需要多新增一個註解…).
2. 方法引數對映功能增強
在有了@Param
註解後, 就可以可以參考Spring MVC的@RequestParam
:
作出更強大的功能(如引數預設值、引數別名、型別校驗等).
3. RPC(如Dubbo)轉HTTP
我們的目標是將Touch做到完善、簡潔且高效能, 這樣就可以用作一個通用的RPC轉HTTP的工具, 我們只需編寫業務程式碼, 把想要開放http呼叫的方法前新增@Touch
註解, 不需再使用Web層程式碼對Service做一層包裝.