前言
這是一個解決服務端發起http請求服務的架構。
由于開發人員的使用習慣不一樣,每個人都有可能寫出一套不同的HTTP請求util出來,而且使用的方式各不相同,還不能複用,
在用過Feign後,Feign支援比較好的是spring cloud,在不想用spring cloud的情況下,不如自己封裝一套Http請求的架構,即可解決代碼混亂的問題,又能優雅的開發。
架構的基本要求
1.注解Interface(@RestClient),能用Spring依賴注入的方式來調用
2.支援SpringMvc的注解如(@RequestMapping和@ResponseBody等)
3.支援動态URL和參數傳入
4.斷路保護
解決思路
1.Spring啟動時,掃描@RestClient注解的Interface,生成代理的javabean
2.使用RestTemplate來發送請求,減少架構的代碼量
3.緩存執行過程的相關方法,避免多次建立javabean,提高請求效率
4.提供請求的過濾器
寫了這些,還是上菜吧
maven注入(由于沒有上傳到maven倉庫,是以使用的小夥伴需要自己打包上傳到私服。可以想看cgcg-http-spring-boot-starter的簡單測試代碼)
<dependency>
<groupId>com.cgcg</groupId>
<artifactId>cgcg-http-spring-boot-starter</artifactId>
<version>對應的版本号</version>
</dependency>
@RestClient的寫法
@RestClient(url = "https://your.domain/userCenter", fallback = TestClientImpl.class) //fallback 如果抛異常了會執行這個實作類的方法,且預設60秒内不再發起調用,避免頻繁抱錯,可以不配置
@MappingFilter(name = RequestFilter.class) //給這個類下面的全部請求添加過濾器,處理相關資料,可以自定義,也可以不寫
public interface TestClient {
@PostMapping(value = "user")
Map<String, Object> post(@RequestBody Map<String, Object> param,
@RequestParam("p1") String p1);
}
調用方式
@Resource
private TestClient testClient;
public Object result(String id) {
HashMap<String, Object> param = new HashMap<>();
param.put("haha", id);
final Map<String, Object> objectMap = testClient.post(param, id);
return objectMap;
}
更詳細的實作可以看Github
GitHub連接配接:https://github.com/ZhicongLin/cgcg-base-starter/tree/master