Link together all the containers in the example app.

This commit is contained in:
Tom Wilkie
2015-05-21 17:04:52 +00:00
parent 2dd08d632b
commit c193d69b19
9 changed files with 65 additions and 36 deletions

View File

@@ -1,6 +1,7 @@
FROM gliderlabs/alpine
MAINTAINER Weaveworks Inc <help@weave.works>
WORKDIR /home/weave
RUN apk add --update curl
ADD ./client /home/weave/
RUN chmod u+x /home/weave/client
ENTRYPOINT ["/home/weave/client"]

View File

@@ -1,3 +1,6 @@
#!/bin/sh
while true; do echo "foo" | nc qotd 4446; sleep 1; done
while true; do
curl http://pyapp:5000/
sleep 1
done

View File

@@ -2,21 +2,25 @@ client:
build: client
links:
- qotd
- pyapp
pyapp:
build: pyapp
ports:
- "5000"
links:
- qotd
- redis
- goapp
qotd:
build: qotd
expose:
- "4446"
pyapp:
build: pyapp
ports:
- "5000:5000"
links:
- redis
- qotd
redis:
image: redis
goapp:
build: goapp
ports:
- "8080"
links:
- elasticsearch1
- elasticsearch2

View File

@@ -15,13 +15,11 @@ import (
"sync"
"sync/atomic"
"syscall"
"time"
)
func main() {
var (
addr = flag.String("addr", ":8080", "HTTP listen address")
rate = flag.Duration("rate", 3*time.Second, "request rate")
)
flag.Parse()
@@ -45,7 +43,9 @@ func main() {
var reads uint64
http.HandleFunc("/", func(w http.ResponseWriter, _ *http.Request) {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
log.Printf("Handling %v", r)
read(targets, &reads)
fmt.Fprintf(w, "%s %d", hostname, atomic.LoadUint64(&reads))
})
@@ -56,31 +56,24 @@ func main() {
errc <- http.ListenAndServe(*addr, nil)
}()
go func() {
errc <- read(targets, *rate, &reads)
}()
go func() {
errc <- interrupt()
}()
log.Printf("%s", <-errc)
log.Printf("%v", <-errc)
}
func read(targets []string, rate time.Duration, reads *uint64) error {
for range time.Tick(rate) {
var wg sync.WaitGroup
wg.Add(len(targets))
for _, target := range targets {
go func(target string) {
get(target)
atomic.AddUint64(reads, 1)
wg.Done()
}(target)
}
wg.Wait()
func read(targets []string, reads *uint64) {
var wg sync.WaitGroup
wg.Add(len(targets))
for _, target := range targets {
go func(target string) {
get(target)
atomic.AddUint64(reads, 1)
wg.Done()
}(target)
}
return nil
wg.Wait()
}
func get(target string) {

View File

@@ -1,2 +1,2 @@
#!/bin/sh
/home/weave/app elasticsearch1 elasticsearch2
exec /home/weave/app elasticsearch1 elasticsearch2

View File

@@ -1,6 +1,7 @@
FROM python:2.7
MAINTAINER Weaveworks Inc <help@weave.works>
ADD . /home/weave
WORKDIR /home/weave
ADD requirements.txt /home/weave/
RUN pip install -r /home/weave/requirements.txt
ADD app.py /home/weave/
ENTRYPOINT ["python", "/home/weave/app.py"]

View File

@@ -1,15 +1,41 @@
import os
import socket
import requests
from concurrent.futures import ThreadPoolExecutor
from flask import Flask
from redis import Redis
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
pool = ThreadPoolExecutor(max_workers=10)
def do_redis():
redis.incr('hits')
return redis.get('hits')
def do_qotd():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect(("qotd", 4446))
s.send("Hello")
return s.recv(1024)
finally:
s.close()
def do_search():
r = requests.get('http://goapp:8080/')
return r.text
@app.route('/')
def hello():
redis.incr('hits')
return 'Hello World! I have been seen %s times.' % redis.get('hits')
counter_future = pool.submit(do_redis)
search_future = pool.submit(do_search)
qotd_future = pool.submit(do_qotd)
result = 'Hello World! I have been seen %s times.' % counter_future.result()
result += search_future.result()
result += qotd_future.result()
return result
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)

View File

@@ -2,4 +2,3 @@ flask
redis
requests
futures
requests-futures

View File

@@ -14,11 +14,13 @@ void *thread_func(void *sock) {
printf("I'm thread %d\n", syscall(SYS_gettid));
if (read(sockfd, buffer, sizeof(buffer), 0) < 0) {
if (read(sockfd, buffer, sizeof(buffer)) < 0) {
perror("ERROR reading from socket");
return;
}
sleep(1);
clientfd = socket(AF_INET, SOCK_STREAM, 0);
if (clientfd < 0) {
perror("ERROR opening socket");