setting
This commit is contained in:
commit
ac11ea7d95
68
.gitignore
vendored
Normal file
68
.gitignore
vendored
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
# Created by .ignore support plugin (hsz.mobi)
|
||||||
|
### JetBrains template
|
||||||
|
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
|
||||||
|
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||||
|
|
||||||
|
# User-specific stuff:
|
||||||
|
.idea/**/workspace.xml
|
||||||
|
.idea/**/tasks.xml
|
||||||
|
.idea/dictionaries
|
||||||
|
|
||||||
|
# Sensitive or high-churn files:
|
||||||
|
.idea/**/dataSources/
|
||||||
|
.idea/**/dataSources.ids
|
||||||
|
.idea/**/dataSources.xml
|
||||||
|
.idea/**/dataSources.local.xml
|
||||||
|
.idea/**/sqlDataSources.xml
|
||||||
|
.idea/**/dynamic.xml
|
||||||
|
.idea/**/uiDesigner.xml
|
||||||
|
|
||||||
|
# Gradle:
|
||||||
|
.idea/**/gradle.xml
|
||||||
|
.idea/**/libraries
|
||||||
|
|
||||||
|
# Mongo Explorer plugin:
|
||||||
|
.idea/**/mongoSettings.xml
|
||||||
|
|
||||||
|
## File-based project format:
|
||||||
|
*.iws
|
||||||
|
|
||||||
|
## Plugin-specific files:
|
||||||
|
|
||||||
|
# IntelliJ
|
||||||
|
/out/
|
||||||
|
|
||||||
|
# mpeltonen/sbt-idea plugin
|
||||||
|
.idea_modules/
|
||||||
|
|
||||||
|
# JIRA plugin
|
||||||
|
atlassian-ide-plugin.xml
|
||||||
|
|
||||||
|
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||||
|
com_crashlytics_export_strings.xml
|
||||||
|
crashlytics.properties
|
||||||
|
crashlytics-build.properties
|
||||||
|
fabric.properties
|
||||||
|
### Go template
|
||||||
|
# Binaries for programs and plugins
|
||||||
|
*.exe
|
||||||
|
*.dll
|
||||||
|
*.so
|
||||||
|
*.dylib
|
||||||
|
|
||||||
|
# Test binary, build with `go test -c`
|
||||||
|
*.test
|
||||||
|
|
||||||
|
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||||
|
*.out
|
||||||
|
|
||||||
|
# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736
|
||||||
|
.glide/
|
||||||
|
.idea/
|
||||||
|
*.iml
|
||||||
|
|
||||||
|
vendor/
|
||||||
|
glide.lock
|
||||||
|
.DS_Store
|
||||||
|
dist/
|
||||||
|
debug
|
32
.vscode/launch.json
vendored
Normal file
32
.vscode/launch.json
vendored
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "Debug",
|
||||||
|
"type": "go",
|
||||||
|
"request": "launch",
|
||||||
|
"mode": "debug",
|
||||||
|
"remotePath": "",
|
||||||
|
"port": 2345,
|
||||||
|
"host": "127.0.0.1",
|
||||||
|
"program": "${workspaceRoot}/main.go",
|
||||||
|
"env": {},
|
||||||
|
"args": [],
|
||||||
|
"showLog": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "File Debug",
|
||||||
|
"type": "go",
|
||||||
|
"request": "launch",
|
||||||
|
"mode": "debug",
|
||||||
|
"remotePath": "",
|
||||||
|
"port": 2345,
|
||||||
|
"host": "127.0.0.1",
|
||||||
|
"program": "${fileDirname}",
|
||||||
|
"env": {},
|
||||||
|
"args": [],
|
||||||
|
"showLog": true
|
||||||
|
}
|
||||||
|
|
||||||
|
]
|
||||||
|
}
|
11
.vscode/settings.json
vendored
Normal file
11
.vscode/settings.json
vendored
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
// Place your settings in this file to overwrite default and user settings.
|
||||||
|
{
|
||||||
|
// Specifies Lint tool name.
|
||||||
|
"go.lintTool": "gometalinter",
|
||||||
|
|
||||||
|
// Flags to pass to Lint tool (e.g. ["-min_confidence=.8"])
|
||||||
|
"go.lintFlags": [
|
||||||
|
"--config=${workspaceRoot}/golint.json"
|
||||||
|
]
|
||||||
|
|
||||||
|
}
|
6
backend/client.go
Normal file
6
backend/client.go
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
package backend
|
||||||
|
|
||||||
|
type PooledClient interface {
|
||||||
|
Exec(target string, method string, params []string) (string, error)
|
||||||
|
Close()
|
||||||
|
}
|
28
backend/options.go
Normal file
28
backend/options.go
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
package backend
|
||||||
|
|
||||||
|
import (
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Options struct {
|
||||||
|
// Dial is an application supplied function for creating and configuring a
|
||||||
|
// grpc connection.
|
||||||
|
//
|
||||||
|
// The grpc.ClientConn returned from Dial
|
||||||
|
Dial func() (*grpc.ClientConn, error)
|
||||||
|
|
||||||
|
// NewClient is an application supplied function for creating and configuring a
|
||||||
|
// client.
|
||||||
|
//
|
||||||
|
// The client returned from NewClient
|
||||||
|
NewClient func(*grpc.ClientConn) (interface{}, error)
|
||||||
|
|
||||||
|
Exec func(client interface{}, target string, method string, params []string) (string, error)
|
||||||
|
|
||||||
|
// Initial number of clients in the pool.
|
||||||
|
InitCapacity int
|
||||||
|
|
||||||
|
// Maximum number of clients allocated by the pool at a given time.
|
||||||
|
// When zero, there is no limit on the number of clients in the pool.
|
||||||
|
MaxCapacity int
|
||||||
|
}
|
144
backend/pool.go
Normal file
144
backend/pool.go
Normal file
|
@ -0,0 +1,144 @@
|
||||||
|
package backend
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Pool interface {
|
||||||
|
// Get gets a client. The application must close the returned client.
|
||||||
|
// This method always returns a valid client so that applications can defer
|
||||||
|
// error handling to the first use of the client. If there is an error
|
||||||
|
// getting an underlying client, then the client Err, Do, Send, Flush
|
||||||
|
// and Receive methods return that error.
|
||||||
|
Get() (PooledClient, error)
|
||||||
|
|
||||||
|
// Capacity returns the number of maximum clients in the pool.
|
||||||
|
Capacity() int
|
||||||
|
|
||||||
|
// Available returns the number of avaliable clients in the pool.
|
||||||
|
Available() int
|
||||||
|
|
||||||
|
// Destroy releases the resources used by the pool.
|
||||||
|
Destroy()
|
||||||
|
}
|
||||||
|
|
||||||
|
type pool struct {
|
||||||
|
dial func() (*grpc.ClientConn, error)
|
||||||
|
newClient func(*grpc.ClientConn) (interface{}, error)
|
||||||
|
exec func(client interface{}, target string, method string, params []string) (string, error)
|
||||||
|
initCapacity int
|
||||||
|
maxCapacity int
|
||||||
|
|
||||||
|
conn *grpc.ClientConn
|
||||||
|
mtx sync.Mutex
|
||||||
|
clients chan PooledClient
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewPool(o Options) (Pool, error) {
|
||||||
|
if o.Dial == nil {
|
||||||
|
return nil, fmt.Errorf("invalid Dial settings")
|
||||||
|
}
|
||||||
|
|
||||||
|
if o.NewClient == nil {
|
||||||
|
return nil, fmt.Errorf("invalid NewClient settings")
|
||||||
|
}
|
||||||
|
|
||||||
|
if o.InitCapacity < 0 || o.MaxCapacity < 0 {
|
||||||
|
return nil, fmt.Errorf("invalid capacity settings")
|
||||||
|
}
|
||||||
|
|
||||||
|
p := &pool{
|
||||||
|
dial: o.Dial,
|
||||||
|
newClient: o.NewClient,
|
||||||
|
exec: o.Exec,
|
||||||
|
initCapacity: o.InitCapacity,
|
||||||
|
maxCapacity: o.MaxCapacity,
|
||||||
|
clients: make(chan PooledClient, o.InitCapacity),
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
p.conn, err = p.dial()
|
||||||
|
if nil != err {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < p.initCapacity; i++ {
|
||||||
|
pc, err := p.create()
|
||||||
|
if err != nil {
|
||||||
|
p.conn.Close()
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
p.clients <- pc
|
||||||
|
}
|
||||||
|
|
||||||
|
return p, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *pool) Capacity() int {
|
||||||
|
return cap(p.clients)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *pool) Available() int {
|
||||||
|
return len(p.clients)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *pool) Get() (PooledClient, error) {
|
||||||
|
if p.clients == nil {
|
||||||
|
// pool aleardy destroyed, returns new client
|
||||||
|
return p.create()
|
||||||
|
}
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case c := <-p.clients:
|
||||||
|
return c, nil
|
||||||
|
default:
|
||||||
|
return p.create()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *pool) Destroy() {
|
||||||
|
p.mtx.Lock()
|
||||||
|
defer p.mtx.Unlock()
|
||||||
|
if p.clients == nil {
|
||||||
|
// pool aleardy destroyed
|
||||||
|
return
|
||||||
|
}
|
||||||
|
close(p.clients)
|
||||||
|
p.clients = nil
|
||||||
|
p.conn.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *pool) create() (PooledClient, error) {
|
||||||
|
c, err := p.newClient(p.conn)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
pc := &pooledClient{
|
||||||
|
p: p,
|
||||||
|
c: c,
|
||||||
|
}
|
||||||
|
return pc, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type pooledClient struct {
|
||||||
|
p *pool
|
||||||
|
c interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pc *pooledClient) Exec(target string, method string, params []string) (string, error) {
|
||||||
|
return pc.p.exec(pc.c, target, method, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pc *pooledClient) Close() {
|
||||||
|
select {
|
||||||
|
case pc.p.clients <- pc:
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
// pool is full, close passed connection
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
11
glide.yaml
Normal file
11
glide.yaml
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
package: git.loafle.net/overflow/overflow_server_app
|
||||||
|
import:
|
||||||
|
- package: github.com/valyala/fasthttp
|
||||||
|
version: v20160617
|
||||||
|
- package: github.com/buaazp/fasthttprouter
|
||||||
|
version: v0.1.1
|
||||||
|
- package: google.golang.org/grpc
|
||||||
|
version: v1.5.2
|
||||||
|
- package: git.loafle.net/overflow/overflow_api_server
|
||||||
|
subpackages:
|
||||||
|
- golang
|
54
main.go
Normal file
54
main.go
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"git.loafle.net/overflow/overflow_server_app/backend"
|
||||||
|
"git.loafle.net/overflow/overflow_server_app/module/member"
|
||||||
|
"git.loafle.net/overflow/overflow_server_app/server"
|
||||||
|
|
||||||
|
grpcAPI "git.loafle.net/overflow/overflow_api_server/golang"
|
||||||
|
|
||||||
|
"github.com/valyala/fasthttp"
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s := server.New()
|
||||||
|
|
||||||
|
grpcPool, err := backend.NewPool(backend.Options{
|
||||||
|
Dial: func() (*grpc.ClientConn, error) {
|
||||||
|
return grpc.Dial("192.168.1.101:50006", grpc.WithInsecure())
|
||||||
|
},
|
||||||
|
NewClient: func(conn *grpc.ClientConn) (interface{}, error) {
|
||||||
|
return grpcAPI.NewOverflowApiServerClient(conn), nil
|
||||||
|
},
|
||||||
|
Exec: func(client interface{}, target string, method string, params []string) (string, error) {
|
||||||
|
ctx := context.Background()
|
||||||
|
c := client.(grpcAPI.OverflowApiServerClient)
|
||||||
|
si := &grpcAPI.ServerInput{
|
||||||
|
Target: target,
|
||||||
|
Method: method,
|
||||||
|
Params: params,
|
||||||
|
}
|
||||||
|
so, err := c.Exec(ctx, si)
|
||||||
|
if nil != err {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return so.Result, nil
|
||||||
|
},
|
||||||
|
})
|
||||||
|
if nil != err {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
s.SetContextValue("grpc", grpcPool)
|
||||||
|
|
||||||
|
s.Route("POST", "/account/signin", member.SignIn)
|
||||||
|
s.Route("POST", "/account/signup", member.SignUp)
|
||||||
|
s.Route("POST", "/account/forgot_password", member.ForgotPassword)
|
||||||
|
s.Route("POST", "/account/check_email", member.CheckEmail)
|
||||||
|
|
||||||
|
fasthttp.ListenAndServe(":19080", s.Handler)
|
||||||
|
}
|
16
module/member/check_email.go
Normal file
16
module/member/check_email.go
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
package member
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"git.loafle.net/overflow/overflow_server_app/server"
|
||||||
|
|
||||||
|
"github.com/valyala/fasthttp"
|
||||||
|
)
|
||||||
|
|
||||||
|
func CheckEmail(sctx *server.ServerContext, ctx *fasthttp.RequestCtx) {
|
||||||
|
msg := sctx.Value("key1")
|
||||||
|
|
||||||
|
fmt.Fprintf(ctx, "Welcome!!!!: %s \n", msg)
|
||||||
|
|
||||||
|
}
|
16
module/member/forgot_password.go
Normal file
16
module/member/forgot_password.go
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
package member
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"git.loafle.net/overflow/overflow_server_app/server"
|
||||||
|
|
||||||
|
"github.com/valyala/fasthttp"
|
||||||
|
)
|
||||||
|
|
||||||
|
func ForgotPassword(sctx *server.ServerContext, ctx *fasthttp.RequestCtx) {
|
||||||
|
msg := sctx.Value("key1")
|
||||||
|
|
||||||
|
fmt.Fprintf(ctx, "Welcome!!!!: %s \n", msg)
|
||||||
|
|
||||||
|
}
|
29
module/member/signin.go
Normal file
29
module/member/signin.go
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
package member
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"git.loafle.net/overflow/overflow_server_app/backend"
|
||||||
|
|
||||||
|
"git.loafle.net/overflow/overflow_server_app/server"
|
||||||
|
|
||||||
|
"github.com/valyala/fasthttp"
|
||||||
|
)
|
||||||
|
|
||||||
|
func SignIn(sctx *server.ServerContext, ctx *fasthttp.RequestCtx) {
|
||||||
|
grpcPool := sctx.Value("grpc").(backend.Pool)
|
||||||
|
c, err := grpcPool.Get()
|
||||||
|
if nil != err {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
signinId := string(ctx.FormValue("signinId"))
|
||||||
|
signinPw := string(ctx.FormValue("signinPw"))
|
||||||
|
|
||||||
|
params := []string{signinId, signinPw}
|
||||||
|
|
||||||
|
r, err := c.Exec("MemberService", "signin", params)
|
||||||
|
|
||||||
|
fmt.Fprintf(ctx, "Welcome!!!!: %s\n", r)
|
||||||
|
|
||||||
|
}
|
16
module/member/signup.go
Normal file
16
module/member/signup.go
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
package member
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"git.loafle.net/overflow/overflow_server_app/server"
|
||||||
|
|
||||||
|
"github.com/valyala/fasthttp"
|
||||||
|
)
|
||||||
|
|
||||||
|
func SignUp(sctx *server.ServerContext, ctx *fasthttp.RequestCtx) {
|
||||||
|
msg := sctx.Value("key1")
|
||||||
|
|
||||||
|
fmt.Fprintf(ctx, "Welcome!: %s \n", msg)
|
||||||
|
|
||||||
|
}
|
19
server/context.go
Normal file
19
server/context.go
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
package server
|
||||||
|
|
||||||
|
type ServerContext struct {
|
||||||
|
values map[interface{}]interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *ServerContext) Value(key interface{}) interface{} {
|
||||||
|
if nil == c.values {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return c.values[key]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *ServerContext) setValue(key interface{}, value interface{}) {
|
||||||
|
if nil == c.values {
|
||||||
|
c.values = make(map[interface{}]interface{}, 1)
|
||||||
|
}
|
||||||
|
c.values[key] = value
|
||||||
|
}
|
5
server/handler.go
Normal file
5
server/handler.go
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
package server
|
||||||
|
|
||||||
|
import "github.com/valyala/fasthttp"
|
||||||
|
|
||||||
|
type RequestHandler func(sctx *ServerContext, ctx *fasthttp.RequestCtx)
|
44
server/server.go
Normal file
44
server/server.go
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
package server
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/buaazp/fasthttprouter"
|
||||||
|
"github.com/valyala/fasthttp"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Server interface {
|
||||||
|
Handler(ctx *fasthttp.RequestCtx)
|
||||||
|
Route(method, path string, handler RequestHandler)
|
||||||
|
SetContextValue(key interface{}, value interface{})
|
||||||
|
}
|
||||||
|
|
||||||
|
type server struct {
|
||||||
|
ctx *ServerContext
|
||||||
|
router *fasthttprouter.Router
|
||||||
|
}
|
||||||
|
|
||||||
|
func New() Server {
|
||||||
|
s := &server{}
|
||||||
|
|
||||||
|
s.router = fasthttprouter.New()
|
||||||
|
s.ctx = &ServerContext{}
|
||||||
|
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *server) SetContextValue(key interface{}, value interface{}) {
|
||||||
|
s.ctx.setValue(key, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *server) Handler(ctx *fasthttp.RequestCtx) {
|
||||||
|
s.router.Handler(ctx)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *server) Route(method, path string, handler RequestHandler) {
|
||||||
|
s.router.Handle(method, path, s.wrapHandler(handler))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *server) wrapHandler(handler RequestHandler) fasthttp.RequestHandler {
|
||||||
|
return fasthttp.RequestHandler(func(ctx *fasthttp.RequestCtx) {
|
||||||
|
handler(s.ctx, ctx)
|
||||||
|
})
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user