JavaでHTTPS通信は遅いんだっけ

## 起こったこと

* 前段のアプリ、後段のAPI群の構成で、前段のアプリは複数の後段のAPIをcallして、おマトメして返却する
* 後段のAPIは軒並みTLSを要求する
* 前段アプリのスループットがでない、CPUがむっちゃ張り付く＞＜

## 確認したいこと

* JavaのTLS通信がどれだけCPU時間食うのか

## テストパターン

### 1. [Java] -- http --> [AP]

```java:JavaReqHttp.java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandler;
import java.nio.charset.StandardCharsets;

public class JavaReqHttp{

    public static void main(String[] args) {
        try {
            HttpRequest request = HttpRequest
                    .newBuilder(URI.create("http://example.com/"))
                    .build();

            BodyHandler<String> bodyHandler = HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8);
            HttpResponse<String> response = HttpClient.newBuilder().build().send(request, bodyHandler);
            System.out.println(response.body());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```

### 2. [Java] -- https --> [AP]

```java:JavaReqHttps.java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandler;
import java.nio.charset.StandardCharsets;

public class JavaReqHttps{

    public static void main(String[] args) {
        try {
            HttpRequest request = HttpRequest
                    .newBuilder(URI.create("https://example.com/"))
                    .build();

            BodyHandler<String> bodyHandler = HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8);
            HttpResponse<String> response = HttpClient.newBuilder().build().send(request, bodyHandler);
            System.out.println(response.body());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```

### 3. [Java] -- http --> [Proxy] -- https --> [AP]

```java:JavaReqProxy.java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandler;
import java.nio.charset.StandardCharsets;

public class JavaReqProxy{

    public static void main(String[] args) {
        try {
            HttpRequest request = HttpRequest
                    .newBuilder(URI.create("http://localhost/"))
                    .build();

            BodyHandler<String> bodyHandler = HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8);
            HttpResponse<String> response = HttpClient.newBuilder().build().send(request, bodyHandler);
            System.out.println(response.body());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```

```apache:/etc/httpd/conf.d/proxy.conf
RewriteEngine on
RewriteCond %{REQUEST_URI} !=/server-status
RewriteRule ^/(.*) https://example.com/$1 [P,L]
```

## 結果

* HTTP.* -> テストパターン 1. [Java] -- http --> [AP]
* HTTPS.* -> テストパターン 2. [Java] -- https --> [AP]
* PROXY.* -> テストパターン 3. [Java] -- http --> [Proxy] -- https --> [AP]

|		|	HTTP.real	|	HTTP.user	|	HTTP.sys	|	HTTPS.real	|	HTTPS.user	|	HTTPS.sys	|	PROXY.real	|	PROXY.user	|	PROXY.sys	|
|	:---:	|	:---:	|	:---:	|	:---:	|	:---:	|	:---:	|	:---:	|	:---:	|	:---:	|	:---:	|
|	1	|	1.072	|	0.655	|	0.387	|	1.627	|	1.336	|	0.595	|	1.374	|	0.738	|	0.398	|
|	2	|	1.121	|	0.542	|	0.545	|	1.653	|	1.316	|	0.520	|	1.289	|	0.709	|	0.330	|
|	3	|	1.111	|	0.886	|	0.227	|	1.589	|	1.390	|	0.490	|	1.320	|	0.633	|	0.439	|
|	4	|	1.177	|	0.808	|	0.490	|	1.608	|	1.457	|	0.479	|	1.307	|	0.644	|	0.441	|
|	5	|	1.057	|	0.752	|	0.308	|	1.581	|	1.362	|	0.489	|	1.394	|	0.498	|	0.639	|
|	6	|	1.092	|	0.666	|	0.491	|	1.576	|	1.050	|	0.808	|	1.343	|	0.713	|	0.565	|
|	7	|	1.081	|	0.713	|	0.422	|	1.555	|	1.535	|	0.386	|	1.321	|	0.803	|	0.298	|
|	8	|	1.075	|	0.650	|	0.482	|	1.521	|	1.198	|	0.650	|	1.348	|	0.778	|	0.323	|
|	9	|	1.065	|	0.635	|	0.452	|	1.650	|	1.550	|	0.458	|	1.327	|	0.727	|	0.336	|
|	10	|	1.070	|	0.555	|	0.517	|	1.650	|	1.342	|	0.540	|	1.355	|	0.822	|	0.263	|

まあ、都度接続だから負荷かかるの当たり前だけど、思ったより`tms_utime`、`tms_cutime`食ってるのね。
sidecarっぽく、ローカルプロキシで多段にしたほうがまだ軽いし、CPU時間も食わない。