Commit 6c30acae authored by gaoshiyao's avatar gaoshiyao

初始化项目

parents
workspace:
path: src/gitlab.wodcloud.com/apaas/apaas-meshproxy
clone:
git:
image: registry-vpc.cn-qingdao.aliyuncs.com/wod-devops/git:1.5.0
pipeline:
build:
image: registry-vpc.cn-qingdao.aliyuncs.com/wod-devops/go:1.11.1-stretch
binary: apaas-meshproxy
main: src
docker-master:
image: registry-vpc.cn-qingdao.aliyuncs.com/wod-devops/docker:1.0
volumes:
- /var/run/docker.sock:/var/run/docker.sock
base: registry-vpc.cn-qingdao.aliyuncs.com/wod/alpine-glibc:3.8
repo: apaas/apaas-meshproxy
version: 1.0.1
channel: alpha
registry: hub.wodcloud.com
secrets:
- source: REGISTRY_USER
target: REGISTRY_USER
- source: REGISTRY_PASSWORD
target: REGISTRY_PASSWORD
when:
branch: [master]
# deploy:
# image: registry-vpc.cn-qingdao.aliyuncs.com/wod-devops/kubernetes:1.0
# namespace: apaas
# deployment: apaas-meshproxy
# container: apaas-meshproxy
# registry: hub.wodcloud.com
# secrets:
# - source: KUBERNETES_SERVER
# target: KUBERNETES_SERVER
# - source: KUBERNETES_TOKEN
# target: KUBERNETES_TOKEN
.vscode
.idea/
vendor
\ No newline at end of file
FROM {{ BASEIMAGE }}
MAINTAINER {{ AUTHOR }}
LABEL Author={{ AUTHOR }} Name={{ PROJECT }} Version={{ VERSION }}
COPY ./dist/. /app
EXPOSE 80
ENTRYPOINT ["/app/apaas-meshproxy", "--port=80"]
module gitlab.wodcloud.com/apaas/apaas-meshproxy
go 1.12
require (
github.com/go-redis/redis v6.15.6+incompatible
github.com/mattn/go-colorable v0.1.4 // indirect
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect
github.com/spf13/pflag v1.0.5
github.com/tav/golly v0.0.0-20180823113506-ad032321f11e
github.com/vulcand/oxy v1.0.0
)
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-redis/redis v6.15.6+incompatible h1:H9evprGPLI8+ci7fxQx6WNZHJSb7be8FqJQRhdQZ5Sg=
github.com/go-redis/redis v6.15.6+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/gravitational/trace v0.0.0-20190726142706-a535a178675f/go.mod h1:RvdOUHE4SHqR3oXlFFKnGzms8a5dugHygGw1bqDstYI=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/mailgun/minheap v0.0.0-20170619185613-3dbe6c6bf55f/go.mod h1:V3EvCedtJTvUYzJF2GZMRB0JMlai+6cBu3VCTQz33GQ=
github.com/mailgun/multibuf v0.0.0-20150714184110-565402cd71fb/go.mod h1:E0vRBBIQUHcRtmL/oR6w/jehh4FJqJFxe86gBnw9gXc=
github.com/mailgun/timetools v0.0.0-20141028012446-7e6055773c51 h1:Kg/NPZLLC3aAFr1YToMs98dbCdhootQ1hZIvZU28hAQ=
github.com/mailgun/timetools v0.0.0-20141028012446-7e6055773c51/go.mod h1:RYmqHbhWwIz3z9eVmQ2rx82rulEMG0t+Q1bzfc9DYN4=
github.com/mailgun/ttlmap v0.0.0-20170619185759-c1c17f74874f/go.mod h1:8heskWJ5c0v5J9WH89ADhyal1DOZcayll8fSbhB+/9A=
github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA=
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4=
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/tav/golly v0.0.0-20180823113506-ad032321f11e h1:cEN2utK6ivVxtMSlpCZc8+fRkI5qe2HRLxwFmL0oSk0=
github.com/tav/golly v0.0.0-20180823113506-ad032321f11e/go.mod h1:DYKtPPxKBRsX/fJcltMPl3Mdsdl+x18y6VtHlbXFfKE=
github.com/vulcand/oxy v1.0.0 h1:7vL5/pjDFzHGbtBEhmlHITUi6KLH4xXTDF33/wrdRKw=
github.com/vulcand/oxy v1.0.0/go.mod h1:6EXgOAl6CRa46/2ZGcDJKf3ywJUp5WtT7vSlGSkvecI=
github.com/vulcand/predicate v1.1.0/go.mod h1:mlccC5IRBoc2cIFmCB8ZM62I3VDb6p2GXESMHa3CnZg=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 h1:Ao/3l156eZf2AW5wK8a7/smtodRU+gha3+BeqJ69lRk=
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
# 发布
## go vendor
```bash
# install govendor
go get -u -v github.com/kardianos/govendor
# 初始化vendor目录
govendor init
# 将本地环境中的依赖Copy到vendor目录中
govendor add +external
```
\ No newline at end of file
package client
import (
"fmt"
"strings"
"time"
"gitlab.wodcloud.com/apaas/apaas-meshproxy/src/config"
"github.com/go-redis/redis"
)
type Redis struct {
Conn *redis.Client
Prefix string
}
var rs Redis
//GetRedisClient 获取connect
func GetRedisClient() (Redis, error) {
if rs.Conn != nil {
return rs, nil
}
addr := config.RedisURL
if strings.HasPrefix(config.RedisURL, "redis://") {
addr = strings.TrimPrefix(config.RedisURL, "redis://")
}
rs.Conn = redis.NewClient(&redis.Options{
Addr: addr,
Password: "", // no password set
DB: 0, // use default DB
})
rs.Prefix = config.RedisTag
flag := time.Now().Add(time.Second*5 + 1)
for {
_, e := rs.Conn.Ping().Result()
if e != nil {
fmt.Println("ping redis :" + addr)
} else {
fmt.Println("redis is health")
break
}
now := time.Now()
if now.After(flag) {
fmt.Println("ping redis timeout!")
break
}
time.Sleep(time.Second * 1)
}
return rs, nil
}
func (r Redis) Incr(key string) (ic *redis.IntCmd, err error) {
key = fmt.Sprintf("%s-%s", strings.ToUpper(r.Prefix), strings.ToUpper(key))
ic = r.Conn.Incr(strings.ToUpper(key))
return
}
func (r Redis) HGet(key string, tag string) (str string, err error) {
key = fmt.Sprintf("%s-%s", strings.ToUpper(r.Prefix), strings.ToUpper(key))
str, err = r.Conn.HGet(strings.ToUpper(key), strings.ToUpper(tag)).Result()
return str, err
}
func (r Redis) HSet(key string, tag string, value interface{}) error {
key = fmt.Sprintf("%s-%s", strings.ToUpper(r.Prefix), strings.ToUpper(key))
bmd := r.Conn.HSet(strings.ToUpper(key), strings.ToUpper(tag), value)
return bmd.Err()
}
func (r Redis) HDel(key string, tag string) error {
key = fmt.Sprintf("%s-%s", strings.ToUpper(r.Prefix), strings.ToUpper(key))
bmd := r.Conn.HDel(strings.ToUpper(key), strings.ToUpper(tag))
return bmd.Err()
}
func (r Redis) Get(key string) (str string, err error) {
key = fmt.Sprintf("%s-%s", strings.ToUpper(r.Prefix), strings.ToUpper(key))
str, err = r.Conn.Get(strings.ToUpper(key)).Result()
return str, err
}
func (r Redis) Set(key string, value interface{}, time time.Duration) error {
key = fmt.Sprintf("%s-%s", strings.ToUpper(r.Prefix), strings.ToUpper(key))
bmd := r.Conn.Set(strings.ToUpper(key), value, time)
return bmd.Err()
}
func (r Redis) Del(key string) error {
key = fmt.Sprintf("%s-%s", strings.ToUpper(r.Prefix), strings.ToUpper(key))
bmd := r.Conn.Del(strings.ToUpper(key))
return bmd.Err()
}
package config
import "os"
var (
ProxyHost string = os.Getenv("PROXY_HOST")
ProxyPath string = os.Getenv("PROXY_Path")
RedisURL string
RedisTag string
)
package handler
import (
"fmt"
"net/http"
"gitlab.wodcloud.com/apaas/apaas-meshproxy/src/client"
"gitlab.wodcloud.com/apaas/apaas-meshproxy/src/config"
)
// CountHandler , a proxy handler
type CountHandler struct {
}
// CreateCountHandler , a proxy handler
func CreateCountHandler() (*CountHandler, error) {
handler := new(CountHandler)
return handler, nil
}
func (handler *CountHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
redis, err := client.GetRedisClient()
if err != nil {
w.Write([]byte(err.Error()))
}
ic, err := redis.Get(fmt.Sprintf("%s%s", config.ProxyHost, config.ProxyPath))
w.Write([]byte(ic))
}
package handler
import (
"fmt"
"net/http"
"strings"
"gitlab.wodcloud.com/apaas/apaas-meshproxy/src/client"
"github.com/vulcand/oxy/forward"
"github.com/vulcand/oxy/testutils"
"gitlab.wodcloud.com/apaas/apaas-meshproxy/src/config"
)
// ProxyHandler , a proxy handler
type ProxyHandler struct {
forward *forward.Forwarder
}
// CreateProxyHandler , a proxy handler
func CreateProxyHandler() (*ProxyHandler, error) {
handler := new(ProxyHandler)
fwd, _ := forward.New(forward.PassHostHeader(true))
handler.forward = fwd
return handler, nil
}
func (handler *ProxyHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
if err := count(); err != nil {
fmt.Println(err.Error())
w.Write([]byte("缓存计数失败!"))
return
}
req.URL = testutils.ParseURI(handler.getProxyURL(req))
req.RequestURI = handler.getRequestURI(req)
req.Host = req.URL.Host
fmt.Println(req.URL, req.RequestURI, req.Host)
handler.forward.ServeHTTP(w, req)
}
func (handler *ProxyHandler) getProxyURL(req *http.Request) string {
path := req.URL.Path
// path = strings.Split(path, handler.prefix)[1]
rawQuery := req.URL.RawQuery
var result = ""
if rawQuery == "" {
if strings.Contains(path, ".js") || strings.Contains(path, ".html") || strings.Contains(path, ".css") || strings.Contains(path, "#") || strings.Contains(path, ".png") {
result = fmt.Sprintf("http://%s%s", config.ProxyHost, path)
} else {
result = fmt.Sprintf("http://%s%s/", config.ProxyHost, path)
}
} else {
result = fmt.Sprintf("http://%s%s?%s", config.ProxyHost, path, rawQuery)
}
return result
}
func (handler *ProxyHandler) getRequestURI(req *http.Request) string {
path := req.URL.Path
rawQuery := req.URL.RawQuery
var result = ""
if rawQuery == "" {
result = path
} else {
result = path + "?" + rawQuery
}
return result
}
/**
计数
*/
func count() error {
redis, err := client.GetRedisClient()
if err != nil {
return err
}
ic, err := redis.Incr(fmt.Sprintf("%s%s", config.ProxyHost, config.ProxyPath))
fmt.Println(ic)
return err
}
package main
import (
"fmt"
"net/http"
"os"
"gitlab.wodcloud.com/apaas/apaas-meshproxy/src/config"
"github.com/spf13/pflag"
"github.com/tav/golly/log"
"gitlab.wodcloud.com/apaas/apaas-meshproxy/src/handler"
)
var (
argPort = pflag.Int("port", 8088, "")
redisUrl = pflag.String("redisUrl", "redis://redis:16379", "")
redisTag = pflag.String("redisTag", "apaas-mesh-proxy", "")
)
func main() {
pflag.Parse()
initEnv()
initConfig()
proxyhandler, _ := handler.CreateProxyHandler()
counthandler, _ := handler.CreateCountHandler()
http.Handle("/count", counthandler)
http.Handle("/", proxyhandler)
if err := http.ListenAndServe(fmt.Sprintf(":%d", *argPort), nil); err != nil {
log.Error("Listen Server err:", err)
}
}
//注册环境变量
func initEnv() {
if len(os.Getenv("AWE_REDIS_CONNECTION")) > 0 {
*redisUrl = os.Getenv("AWE_REDIS_CONNECTION")
}
}
//注册公共config参数信息
func initConfig() {
config.RedisTag = *redisTag
config.RedisURL = *redisUrl
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment