https://github.com/sitano/tiproxy
Inetd-like proxy for a single process
https://github.com/sitano/tiproxy
inetd proxy-server
Last synced: 2 months ago
JSON representation
Inetd-like proxy for a single process
- Host: GitHub
- URL: https://github.com/sitano/tiproxy
- Owner: sitano
- Created: 2020-08-07T12:34:45.000Z (almost 6 years ago)
- Default Branch: master
- Last Pushed: 2020-08-14T13:55:08.000Z (almost 6 years ago)
- Last Synced: 2026-01-01T09:11:00.527Z (6 months ago)
- Topics: inetd, proxy-server
- Language: Go
- Homepage:
- Size: 82 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# tiproxy
Proxy accepts connections and translates them into
the child process. It maintains a single child process
when there are active incoming connections.
### Quick start
#### curl+ncat
$ go build
$ ./tiproxy --dest 127.0.0.1:3000 --exec ncat --workdir /usr/sbin -- -l -k -p 3000 -4 -v
$ curl -v http://127.0.0.1:4000/api
#### broker-ncat+nc
$ go build
$ ./tiproxy --dest 127.0.0.1:3000 --exec ncat --workdir /usr/sbin -- -l -k -p 3000 -4 -v --broker
terminal X: $ nc -t 127.0.0.1 4000
terminal Y: $ echo HELLO | nc -t 127.0.0.1 4000
terminal Z: $ telnet 127.0.0.1 4000
terminal Z: > blah [ press ENTER ]
### TiDB with docker-compose
$ go build
$ cp tiproxy docker/bin
$ docker build -t tiproxy:latest ./docker
$ docker-compose -f ./docker/docker-compose.yml up
$ mysql --host 127.0.0.1 --port 4000 -u root
$ mysql --host 127.0.0.1 --port 4000 -u root
### Architecture
Client -> Proxy -> Pool -> Resource
|
conn -> get -> if -> exists
| |
done <----------- conn <---/
|
else -> spawn \
or | |
wait <---/ |
| |
done <----------- conn |
... |
release -> put /------------/
| |
done <- * v (spawn monitor)
...
Monitor Resource
timeout and no connections
| -> kill
| |
killed <- /
|
exit
Pool uses `sync.Cond` to control state transitions
between executing coroutines. A calling coroutine
processes pool state change. Every new resource has
its own controlling monitor that exits as soon as
resource disappears.
Pool uses `sync.Mutex` to control its state. States
switch between: `closed, opened, starting, shutdown`.
Pool tracks usage statistics counting connections and
keeping the latest change time.
Resource monitor respects SIGCHLD signals.
Proxy uses `io.Copy` creating 2 coroutines to serve
TCP connections 2-way.