|
1 |
| -//package top.meethigher; |
2 |
| -// |
3 |
| -//import io.vertx.core.http.HttpClient; |
4 |
| -//import io.vertx.core.http.HttpServer; |
5 |
| -//import org.slf4j.Logger; |
6 |
| -//import org.slf4j.LoggerFactory; |
7 |
| -// |
8 |
| -//import java.util.concurrent.ThreadLocalRandom; |
9 |
| -// |
10 |
| -//public class VertxHTTPReverseProxy { |
11 |
| -// |
12 |
| -// private static final Logger log = LoggerFactory.getLogger(VertxHTTPReverseProxy.class); |
13 |
| -// |
14 |
| -// private static final char[] ID_CHARACTERS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); |
15 |
| -// |
16 |
| -// private String sourceHost = "0.0.0.0"; |
17 |
| -// |
18 |
| -// private int sourcePort = 999; |
19 |
| -// |
20 |
| -// private final HttpServer server; |
21 |
| -// |
22 |
| -// private final HttpClient httpClient; |
23 |
| -// |
24 |
| -// private final HttpClient httpsClient; |
25 |
| -// |
26 |
| -// private final String targetHost; |
27 |
| -// |
28 |
| -// private final int targetPort; |
29 |
| -// |
30 |
| -// private final String name; |
31 |
| -// |
32 |
| -// private static String generateName() { |
33 |
| -// final String prefix = "VertxHTTPReverseProxy-"; |
34 |
| -// try { |
35 |
| -// // 池号对于虚拟机来说是全局的,以避免在类加载器范围的环境中池号重叠 |
36 |
| -// synchronized (System.getProperties()) { |
37 |
| -// final String next = String.valueOf(Integer.getInteger("top.meethigher.VertxHTTPReverseProxy.name", 0) + 1); |
38 |
| -// System.setProperty("top.meethigher.VertxHTTPReverseProxy.name", next); |
39 |
| -// return prefix + next; |
40 |
| -// } |
41 |
| -// } catch (Exception e) { |
42 |
| -// final ThreadLocalRandom random = ThreadLocalRandom.current(); |
43 |
| -// final StringBuilder sb = new StringBuilder(prefix); |
44 |
| -// for (int i = 0; i < 4; i++) { |
45 |
| -// sb.append(ID_CHARACTERS[random.nextInt(62)]); |
46 |
| -// } |
47 |
| -// return sb.toString(); |
48 |
| -// } |
49 |
| -// } |
50 |
| -//} |
| 1 | +package top.meethigher; |
| 2 | + |
| 3 | +import io.vertx.core.AsyncResult; |
| 4 | +import io.vertx.core.Future; |
| 5 | +import io.vertx.core.Handler; |
| 6 | +import io.vertx.core.Vertx; |
| 7 | +import io.vertx.core.http.HttpClient; |
| 8 | +import io.vertx.core.http.HttpClientOptions; |
| 9 | +import io.vertx.core.http.HttpServer; |
| 10 | +import io.vertx.ext.web.Router; |
| 11 | +import org.slf4j.Logger; |
| 12 | +import org.slf4j.LoggerFactory; |
| 13 | + |
| 14 | +import java.util.concurrent.ThreadLocalRandom; |
| 15 | + |
| 16 | +public class VertxHTTPReverseProxy { |
| 17 | + |
| 18 | + private static final Logger log = LoggerFactory.getLogger(VertxHTTPReverseProxy.class); |
| 19 | + |
| 20 | + private static final char[] ID_CHARACTERS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); |
| 21 | + |
| 22 | + private String sourceHost = "0.0.0.0"; |
| 23 | + |
| 24 | + private int sourcePort = 998; |
| 25 | + |
| 26 | + |
| 27 | + private final Router router; |
| 28 | + private final HttpServer httpServer; |
| 29 | + private final HttpClient httpClient; |
| 30 | + private final HttpClient httpsClient; |
| 31 | + private final String name; |
| 32 | + |
| 33 | + private VertxHTTPReverseProxy(Router router, HttpServer httpServer, HttpClient httpClient, HttpClient httpsClient, String name) { |
| 34 | + this.router = router; |
| 35 | + this.httpServer = httpServer; |
| 36 | + this.httpClient = httpClient; |
| 37 | + this.httpsClient = httpsClient; |
| 38 | + this.name = name; |
| 39 | + } |
| 40 | + |
| 41 | + public static VertxHTTPReverseProxy create(Vertx vertx, String name) { |
| 42 | + return new VertxHTTPReverseProxy(Router.router(vertx), vertx.createHttpServer(), vertx.createHttpClient(), vertx.createHttpClient(new HttpClientOptions().setSsl(true).setTrustAll(true)), name); |
| 43 | + } |
| 44 | + |
| 45 | + public static VertxHTTPReverseProxy create(Vertx vertx) { |
| 46 | + return new VertxHTTPReverseProxy(Router.router(vertx), vertx.createHttpServer(), vertx.createHttpClient(), vertx.createHttpClient(new HttpClientOptions().setSsl(true).setTrustAll(true)), generateName()); |
| 47 | + } |
| 48 | + |
| 49 | + |
| 50 | + private static String generateName() { |
| 51 | + final String prefix = "VertxHTTPReverseProxy-"; |
| 52 | + try { |
| 53 | + // 池号对于虚拟机来说是全局的,以避免在类加载器范围的环境中池号重叠 |
| 54 | + synchronized (System.getProperties()) { |
| 55 | + final String next = String.valueOf(Integer.getInteger("top.meethigher.VertxHTTPReverseProxy.name", 0) + 1); |
| 56 | + System.setProperty("top.meethigher.VertxHTTPReverseProxy.name", next); |
| 57 | + return prefix + next; |
| 58 | + } |
| 59 | + } catch (Exception e) { |
| 60 | + final ThreadLocalRandom random = ThreadLocalRandom.current(); |
| 61 | + final StringBuilder sb = new StringBuilder(prefix); |
| 62 | + for (int i = 0; i < 4; i++) { |
| 63 | + sb.append(ID_CHARACTERS[random.nextInt(62)]); |
| 64 | + } |
| 65 | + return sb.toString(); |
| 66 | + } |
| 67 | + } |
| 68 | + |
| 69 | + public void start() { |
| 70 | + httpServer.requestHandler(router).exceptionHandler(e -> log.error("request failed", e)); |
| 71 | + Future<HttpServer> listenFuture = httpServer.listen(sourcePort, sourceHost); |
| 72 | + |
| 73 | + Handler<AsyncResult<HttpServer>> asyncResultHandler = ar -> { |
| 74 | + if (ar.succeeded()) { |
| 75 | + log.info("{} started on {}:{}", name, sourceHost, sourcePort); |
| 76 | + } else { |
| 77 | + Throwable e = ar.cause(); |
| 78 | + log.error("{} start failed", name, e); |
| 79 | + |
| 80 | + } |
| 81 | + }; |
| 82 | + listenFuture.onComplete(asyncResultHandler); |
| 83 | + } |
| 84 | + |
| 85 | + public void stop() { |
| 86 | + httpServer.close() |
| 87 | + .onSuccess(v -> log.info("{} closed", name)) |
| 88 | + .onFailure(e -> log.error("{} close failed", name, e)); |
| 89 | + } |
| 90 | +} |
0 commit comments