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做一層包裝.


參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章