應用場景:前端頁面點擊刷新,調用服務器A上Java接口,然后A調用服務器B的后台Python接口實時刷新后台數據庫。
在這個場景中會涉及到兩個問題:異步,Python服務器壓力
(一)解決Python服務器壓力
如果Python服務器接口不做任何措施,那么可能會有惡意的訪問,從而導致該服務器一直刷新后台數據庫。
我的解決方式是:服務器B會提供一串字符串給服務器A,當服務器A調用服務器B的服務時,將傳遞的參數和該字符串拼接再進行MD5加密,從而在服務器B上通過這個token值明確對方身份。
(二)異步
異步問題是:如何解決服務器A上的Java接口等待Python程序刷新數據庫后返回的success,從而使得前端頁面阻塞更新。
主要是通過Java中HttpURLConnection.InputStreamReader的方法實現異步:
public String requestRefresh(String token, String clusterName){ String result = null; try{ // 打開和URL之間的連接 URL url = new URL(URL_Refresh_Couchbase_Cluster); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); connection.setDoInput(true); connection.setUseCaches(false); connection.setRequestMethod("GET"); connection.setRequestProperty("content-type", "application/x-www-form-urlencoded"); OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(),"UTF-8"); // 把數據寫入請求的Body out.write("token=" + token + "&cluster=" + clusterName); //參數形式跟在地址欄的一樣 out.flush(); out.close(); // 獲取數據,將返回的輸入流轉換成字符串 InputStream inputStream = connection.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); result = bufferedReader.readLine(); // 釋放資源 bufferedReader.close(); inputStreamReader.close(); inputStream.close(); connection.disconnect(); }catch (Exception e){ log.info("(requestRefresh) sending GET Request to refresh mysql databse has exception : {}", e); e.printStackTrace(); } return result; }