| package main |
| |
| import ( |
| "context" |
| "encoding/json" |
| "io/ioutil" |
| "net/http" |
| "os" |
| "os/signal" |
| "strconv" |
| "syscall" |
| "time" |
| ) |
| |
| import ( |
| hessian "github.com/apache/dubbo-go-hessian2" |
| _ "github.com/apache/dubbo-go/cluster/cluster_impl" |
| _ "github.com/apache/dubbo-go/cluster/loadbalance" |
| "github.com/apache/dubbo-go/common/logger" |
| _ "github.com/apache/dubbo-go/common/proxy/proxy_factory" |
| "github.com/apache/dubbo-go/config" |
| _ "github.com/apache/dubbo-go/filter/filter_impl" |
| _ "github.com/apache/dubbo-go/metadata/service/inmemory" |
| _ "github.com/apache/dubbo-go/protocol/dubbo" |
| _ "github.com/apache/dubbo-go/registry/protocol" |
| _ "github.com/apache/dubbo-go/registry/zookeeper" |
| ) |
| |
| import ( |
| "github.com/apache/dubbo-go-samples/game/go-server-gate/pkg" |
| "github.com/apache/dubbo-go-samples/game/pkg/pojo" |
| ) |
| |
| func init() { |
| config.SetProviderService(new(pkg.BasketballService)) |
| |
| config.SetConsumerService(pkg.GameBasketball) |
| |
| hessian.RegisterPOJO(&pojo.Result{}) |
| } |
| |
| |
| func main() { |
| config.Load() |
| |
| go startHttp() |
| |
| initSignal() |
| } |
| |
| func initSignal() { |
| signals := make(chan os.Signal, 1) |
| |
| signal.Notify(signals, os.Interrupt, os.Kill, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT) |
| for { |
| sig := <-signals |
| logger.Infof("get signal %s", sig.String()) |
| switch sig { |
| case syscall.SIGHUP: |
| logger.Infof("app need reload") |
| default: |
| time.AfterFunc(time.Duration(time.Second*5), func() { |
| logger.Warnf("app exit now by force...") |
| os.Exit(1) |
| }) |
| |
| // The program exits normally or timeout forcibly exits. |
| logger.Warnf("app exit now...") |
| return |
| } |
| } |
| } |
| |
| func startHttp() { |
| |
| http.HandleFunc("/login", func(w http.ResponseWriter, r *http.Request) { |
| res, err := pkg.Login(context.TODO(), r.URL.Query().Get("name")) |
| if err != nil { |
| responseWithOrigin(w, r, 200, []byte(err.Error())) |
| return |
| } |
| |
| b, err := json.Marshal(res) |
| if err != nil { |
| responseWithOrigin(w, r, 200, []byte(err.Error())) |
| return |
| } |
| responseWithOrigin(w, r, 200, b) |
| }) |
| |
| http.HandleFunc("/score", func(w http.ResponseWriter, r *http.Request) { |
| reqBody, err := ioutil.ReadAll(r.Body) |
| if err != nil { |
| logger.Error(err.Error()) |
| } |
| var info pojo.Info |
| json.Unmarshal(reqBody, &info) |
| res, err := pkg.Score(context.TODO(), info.Name, strconv.Itoa(info.Score)) |
| if err != nil { |
| responseWithOrigin(w, r, 200, []byte(err.Error())) |
| return |
| } |
| |
| b, err := json.Marshal(res) |
| if err != nil { |
| responseWithOrigin(w, r, 200, []byte(err.Error())) |
| return |
| } |
| responseWithOrigin(w, r, 200, b) |
| }) |
| |
| http.HandleFunc("/rank", func(w http.ResponseWriter, r *http.Request) { |
| res, err := pkg.Rank(context.TODO(), r.URL.Query().Get("name")) |
| if err != nil { |
| responseWithOrigin(w, r, 200, []byte(err.Error())) |
| return |
| } |
| b, err := json.Marshal(res) |
| if err != nil { |
| responseWithOrigin(w, r, 200, []byte(err.Error())) |
| return |
| } |
| responseWithOrigin(w, r, 200, b) |
| }) |
| |
| _ = http.ListenAndServe("127.0.0.1:8089", nil) |
| } |
| |
| // avoid cors |
| func responseWithOrigin(w http.ResponseWriter, r *http.Request, code int, json []byte) { |
| w.Header().Set("Access-Control-Allow-Origin", "*") |
| w.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, UPDATE") |
| w.Header().Set("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization") |
| w.Header().Set("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Cache-Control, Content-Language, Content-Type") |
| w.Header().Set("Access-Control-Allow-Credentials", "true") |
| w.Header().Set("Content-Type", "application/json; charset=utf-8") |
| w.WriteHeader(code) |
| w.Write(json) |
| } |