1. 程式人生 > >Touch 方法&屬性 對映工具

Touch 方法&屬性 對映工具

Touch 方法&屬性 對映工具(0.5 版本)

標籤 : github

線上後門與介面除錯:
原先需要測試一個介面(如Dubbo、DAO), 或為線上留後門, 需要寫大量的Web層(Api、Servlet或Controller)程式碼並在瀏覽器觸發, 進而呼叫到實際想要執行的方法或想檢視的屬性, 而有了Touch後, 你可以專注於業務功能的實現, 而不需要再書寫這些跟業務無關的觸發程式碼.

版本歷史

0.0 版本

  • Touch的第一個釋出版本
    • 介面對映最核心功能
    • 基於Web.xml的配置: 類掃描Touch
    • @TouchtouchPattern
      屬性提供Touch別名
    • 第一版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做一層包裝.

參考