应用场景:前端页面点击刷新,调用服务器A上Java接口,然后A调用服务器B的后台Python接口实时刷新后台数据库。
在这个场景中会涉及到两个问题:异步,Python服务器压力
(一)解决Python服务器压力
如果Python服务器接口不做任何措施,那么可能会有恶意的访问,从而导致该服务器一直刷新后台数据库。
我的解决方式是:服务器B会提供一串字符串给服务器A,当服务器A调用服务器B的服务时,将传递的参数和该字符串拼接再进行MD5加密,从而在服务器B上通过这个token值明确对方身份。
(二)异步
异步问题是:如何解决服务器A上的Java接口等待Python程序刷新数据库后返回的success,从而使得前端页面阻塞更新。
主要是通过Java中HttpURLConnection.InputStreamReader的方法实现异步:
1public String requestRefresh(String token, String clusterName){ 2 String result = null; 3 try{ 4 // 打开和URL之间的连接 5 URL url = new URL(URL_Refresh_Couchbase_Cluster); 6 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 7 connection.setDoOutput(true); 8 connection.setDoInput(true); 9 connection.setUseCaches(false); 10 connection.setRequestMethod("GET"); 11 connection.setRequestProperty("content-type", "application/x-www-form-urlencoded"); 12 OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(),"UTF-8"); 13 // 把数据写入请求的Body 14 out.write("token=" + token + "&cluster=" + clusterName); //参数形式跟在地址栏的一样 15 out.flush(); 16 out.close(); 17 // 获取数据,将返回的输入流转换成字符串 18 InputStream inputStream = connection.getInputStream(); 19 InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); 20 BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 21 result = bufferedReader.readLine(); 22 // 释放资源 23 bufferedReader.close(); 24 inputStreamReader.close(); 25 inputStream.close(); 26 connection.disconnect(); 27 }catch (Exception e){ 28 log.info("(requestRefresh) sending GET Request to refresh mysql databse has exception : {}", e); 29 e.printStackTrace(); 30 } 31 return result; 32 }