1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
| package cn.mucang.dianping.nginx;
import nginx.clojure.NativeInputStream; import nginx.clojure.NginxClojureRT; import nginx.clojure.java.Constants; import nginx.clojure.java.NginxJavaRequest; import nginx.clojure.java.NginxJavaRingHandler; import org.apache.commons.collections.MapUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils;
import java.io.IOException; import java.net.URLDecoder; import java.util.HashMap; import java.util.Map; import java.util.Random;
public class DianpingRewriteHandler implements NginxJavaRingHandler { public static final String KEY_URI = "uri"; public static final String KEY_BODY = "body"; public static final String KEY_REQUEST_METHOD = "request-method"; public static final String KEY_QUERY_STRING = "query-string"; public static final String ENCODING = "UTF-8";
public static final Map NODES = new HashMap(); public static final int NODE_SIZE = 2; public static final String MASTER_NODE = "node1"; public static final String SALVE_NODE = "node2";
private static final Random R = new Random();
static { NODES.put(0, MASTER_NODE); NODES.put(1, SALVE_NODE); }
public Object[] invoke(Map requestMap) throws IOException { long start = System.currentTimeMillis(); Map params = getParams(requestMap); String node = getNode(requestMap);
NginxJavaRequest request = (NginxJavaRequest) requestMap; request.setVariable("node", normalizeNode(node));
long elasped = System.currentTimeMillis() - start; NginxClojureRT.log.info(String.format("[gaoyoubo] elasped:%s ms, node=%s, uri:%s, elasped, node, uri));
return Constants.PHASE_DONE; }
/** * 计算当前请求应该走哪个节点 * * @param requestMap * @return */ private String getNode(Map requestMap) { // 业务逻辑 }
private String normalizeNode(String node) { return "http: }
private Map getParams(Map requestMap) { Map params = new HashMap<>(); try { params.putAll(getGetParams(requestMap)); params.putAll(getPostParams(requestMap)); } catch (Exception e) { NginxClojureRT.log.error("获取请求参数失败", e); } return params; }
private Map getGetParams(Map requestMap) { String queryString = MapUtils.getString(requestMap, KEY_QUERY_STRING); return buildQuerys(queryString); }
private Map getPostParams(Map requestMap) throws IOException { String requestMethod = MapUtils.getString(requestMap, KEY_REQUEST_METHOD); if (StringUtils.equalsIgnoreCase(requestMethod, "POST")) { Object bodyObj = requestMap.get(KEY_BODY); if (bodyObj != null) { NativeInputStream nis = (NativeInputStream) bodyObj; String body = IOUtils.toString(nis, ENCODING); return buildQuerys(body); } } return new HashMap<>(); }
private Map buildQuerys(String queryString) { Map params = new HashMap<>(); if (StringUtils.isBlank(queryString)) { return params; } String[] kvs = queryString.split("&"); if (kvs != null) { for (String kv : kvs) { String[] pair = kv.split("\\=", 2); if (pair.length == 2) { params.put(pair[0], urlDecode(pair[1], ENCODING)); } } } return params; }
private String urlDecode(String s, String encoding) { try { return URLDecoder.decode(s, encoding); } catch (Exception ex) { NginxClojureRT.log.error(null, ex); } return s; } }
|