Статьи

Java: симуляция различных проблем с соединением с Toxiproxy

Смоделируйте различные проблемы с подключением с помощью Toxiproxy и Java HttpURLConnection чтобы увидеть, какие ошибки возникают: превышено время HttpURLConnection подключения, превышено время чтения или отказано в соединении….

Полученные результаты:

Система: openjdk 11.0.1 2018-10-16

  1. (.setConnectTimeout 1) => java.net.SocketTimeoutException: истекло время соединения
  2. (.setReadTimeout 1) => javax.net.ssl.SSLProtocolException: Read timed out по HTTPS, java.net.SocketTimeoutException: Read timed out по HTTP (или Toxiproxy с задержкой 5 с или тайм-аутом)
  3. Ничего не слушает в порту => java.net.ConnectException: соединение отказано
  4. Toxiproxy без настроенного восходящего потока (т. Е. Порт открыт, но ничто не радует соединением) => javax.net.ssl.SSLHandshakeException: Remote host terminated the handshake по HTTPS, java.net.SocketTimeoutException: Read timed out по HTTP
  5. limit_data_downstream => java.io.IOException: преждевременный EOF

(То, что я не смог смоделировать (пока), это «соединение прервано / разорвано».)

Настройка

Prerequisities

В /etc/hosts добавьте:

1
127.0.0.1       proxied.google.com

Настройка токсипрокси

Запустить токсипрокси:

1
2
3
docker pull shopify/toxiproxy
# BEFORE we `run` it: case #3
docker run --rm -p 5555:5555 -p 6666:6666 -p 8474:8474 --name toxiproxy -it shopify/toxiproxy

Настройте его (мы могли бы просто POST :8474 но использовать CLI проще):

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
$ docker exec -it toxiproxy /bin/sh
/ # cd /go/bin/
# ./toxiproxy-cli create google -l 0.0.0.0:6666 -u www.google.com:443 # BEFORE this is run: case #4
# ./toxiproxy-cli toxic add google -t latency -a latency=5000 # case #2
Added downstream latency toxic 'latency_downstream' on proxy 'google
# ./toxiproxy-cli toxic remove google -n latency_downstream
Removed toxic 'latency_downstream' on proxy 'google'
 
# ./toxiproxy-cli toxic add google -t  timeout -a timeout=2000 # case #2
Added downstream timeout toxic 'timeout_downstream' on proxy 'google'
# ./toxiproxy-cli toxic remove google -n timeout_downstream
Removed toxic 'timeout_downstream' on proxy 'google'
 
# ./toxiproxy-cli toxic add google -t limit_data -a bytes=5000 # case #5
Added downstream limit_data toxic 'limit_data_downstream' on proxy 'google'

Тестовый код

1
2
3
4
5
6
7
8
9
(import '[java.net URL HttpURLConnection])
(->
  (doto ^HttpURLConnection (.openConnection (URL. "https://proxied.google.com:6666/"))
    ;; BEWARE: JVM *must* be started with `-Dsun.net.http.allowRestrictedHeaders=true` to allow setting the Host:
    (.setRequestProperty "Host" "www.google.com")
    (.setConnectTimeout 1000)
    (.setReadTimeout 1000))
  (.getInputStream)
  slurp)

задний

Прочитайте мой тайм-аут симуляции сети с помощью toxiproxy, чтобы узнать, почему мы должны беспокоиться о /etc/hosts и заголовке Host .

Опубликовано на Java Code Geeks с разрешения Якуба Холи, партнера нашей программы JCG . См. Оригинальную статью здесь: Java: моделирование различных проблем с соединением с Toxiproxy

Мнения, высказанные участниками Java Code Geeks, являются их собственными.