changed project structure

This commit is contained in:
Radu Ioan Fericean
2012-01-25 13:48:59 +02:00
parent 2d2234691f
commit 1d2e20a7e6
6 changed files with 200 additions and 0 deletions

6
src/inquirer/Makefile Normal file
View File

@@ -0,0 +1,6 @@
include $(GOROOT)/src/Make.inc
TARG=inquirer
GOFILES=inquirer.go
include $(GOROOT)/src/Make.cmd

52
src/inquirer/inquirer.go Normal file
View File

@@ -0,0 +1,52 @@
package main
import (
"fmt"
"log"
"net/http"
"net/rpc"
"registration"
//"time"
"errors"
)
var raterList *registration.RaterList
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "<html><body><ol>")
for addr, _ := range raterList.Clients {
fmt.Fprint(w, fmt.Sprintf("<li>%s</li>", addr))
}
fmt.Fprint(w, "</ol></body></html>")
}
func callRater() {
var reply float64
arg := 9.0
err := errors.New("") //not nil value
for err != nil {
client:= <-raterList.Balancer
err = client.Call("Sumer.Square", arg, &reply)
if err != nil {
log.Print("Got en error from rater... recovering")
}
}
fmt.Println(fmt.Sprintf("Result: %v", reply))
}
func testCallRater(){
for i:= 0; i<10; i++ {
go callRater()
//time.Sleep(1 * time.Second)
}
}
func main() {
raterList = registration.NewRaterList()
go testCallRater()
rpc.Register(raterList)
rpc.HandleHTTP()
http.HandleFunc("/", handler)
log.Print("The server is listening...")
http.ListenAndServe(":2000", nil)
}

View File

@@ -0,0 +1,51 @@
package registration
import (
"fmt"
"log"
"net/rpc"
"time"
)
type RaterList struct {
Clients map[string]*rpc.Client
Balancer chan *rpc.Client
}
func NewRaterList() *RaterList {
return &RaterList{
Clients: make(map[string]*rpc.Client),
Balancer: make(chan *rpc.Client),
}
}
func (rl *RaterList) RegisterRater(clientAddress string, replay *byte) error {
time.Sleep(1 * time.Second) // wait a second for Rater to start serving
client, err := rpc.Dial("tcp", clientAddress)
if err != nil {
log.Panic("Could not connect to client!")
}
rl.Clients[clientAddress] = client
log.Print(fmt.Sprintf("Server %v registered succesfully", clientAddress))
rl.startBalance()
return nil
}
func (rl *RaterList) UnRegisterRater(clientAddress string, replay *byte) error {
client := rl.Clients[clientAddress]
client.Close()
delete(rl.Clients, clientAddress)
log.Print(fmt.Sprintf("Server %v unregistered succesfully", clientAddress))
return nil
}
func (rl *RaterList) startBalance() {
go func(){
for {
for addr, client := range rl.Clients {
log.Printf("using server %s:", addr)
rl.Balancer <- client
}
}
}()
}

6
src/rater/Makefile Normal file
View File

@@ -0,0 +1,6 @@
include $(GOROOT)/src/Make.inc
TARG=inquirer
GOFILES=inquirer.go
include $(GOROOT)/src/Make.cmd

37
src/rater/rater.go Normal file
View File

@@ -0,0 +1,37 @@
package main
import (
"flag"
"log"
"math"
"net"
"net/rpc"
"registration"
)
var (
server = flag.String("server", "127.0.0.1:2000", "target host:port")
listen = flag.String("listen", "127.0.0.1:1234", "target host:port")
)
type Sumer int
func (t *Sumer) Square(n float64, reply *float64) error {
*reply = math.Sqrt(n)
return nil
}
func main() {
flag.Parse()
arith := new(Sumer)
rpc.Register(arith)
rpc.HandleHTTP()
go registration.RegisterToServer(server, listen)
//go registration.StopSingnalHandler(server, listen)
addr, err1 := net.ResolveTCPAddr("tcp", *listen)
l, err2 := net.ListenTCP("tcp", addr)
if err1 != nil || err2 != nil {
log.Panic("cannot create listener for specified address ", *listen)
}
rpc.Accept(l)
}

View File

@@ -0,0 +1,48 @@
package registration
import (
"log"
"net/rpc"
"os"
"os/signal"
"syscall"
)
func StopSingnalHandler(server, listen *string) {
log.Print("Handling stop signals...")
sig := <-signal.Incoming
if usig, ok := sig.(os.UnixSignal); ok {
switch usig {
case syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT:
log.Printf("Caught signal %v, unregistering from server\n", usig)
unregisterFromServer(server, listen)
os.Exit(1)
}
}
}
func unregisterFromServer(server, listen *string) {
client, err := rpc.DialHTTP("tcp", *server)
if err != nil {
log.Panic("Cannot register to server!")
}
var reply byte
log.Print("Unregistering from server ", *server)
client.Call("RaterList.UnRegisterRater", *listen, &reply)
if err := client.Close(); err != nil {
log.Panic("Could not close server unregistration!")
}
}
func RegisterToServer(server, listen *string) {
client, err := rpc.DialHTTP("tcp", *server)
if err != nil {
log.Panic("Cannot register to server!")
}
var reply byte
log.Print("Registering to server ", *server)
client.Call("RaterList.RegisterRater", *listen, &reply)
if err := client.Close(); err != nil {
log.Panic("Could not close server registration!")
}
}