Browse Source

init

master
一叶之秋 3 years ago
parent
commit
2b78e395a3
39 changed files with 1792 additions and 2 deletions
  1. +79
    -0
      DOCUMENTS/baidu_link_submit_ms.private.api.md
  2. +1
    -2
      README.md
  3. BIN
      bin/baidu_link_submit_ms
  4. +58
    -0
      config/nginx/baidu_link_submit_ms.private.conf
  5. +58
    -0
      config/nginx/baidu_link_submit_ms.public.conf
  6. +1
    -0
      config/nginx/placeholder
  7. +12
    -0
      config/systemctl/baidu_link_submit_ms.service
  8. +1
    -0
      config/systemctl/placeholder
  9. BIN
      pkg/linux_amd64/github.com/astaxie/beego.a
  10. BIN
      pkg/linux_amd64/github.com/astaxie/beego/config.a
  11. BIN
      pkg/linux_amd64/github.com/astaxie/beego/context.a
  12. BIN
      pkg/linux_amd64/github.com/astaxie/beego/context/param.a
  13. BIN
      pkg/linux_amd64/github.com/astaxie/beego/grace.a
  14. BIN
      pkg/linux_amd64/github.com/astaxie/beego/logs.a
  15. BIN
      pkg/linux_amd64/github.com/astaxie/beego/session.a
  16. BIN
      pkg/linux_amd64/github.com/astaxie/beego/toolbox.a
  17. BIN
      pkg/linux_amd64/github.com/astaxie/beego/utils.a
  18. BIN
      pkg/linux_amd64/github.com/garyburd/redigo/internal.a
  19. BIN
      pkg/linux_amd64/github.com/garyburd/redigo/redis.a
  20. +82
    -0
      scripts/ci.sh
  21. +72
    -0
      scripts/ci/build.sh
  22. +181
    -0
      scripts/ci/deploy.sh
  23. +71
    -0
      scripts/ci/fetch_source.sh
  24. +183
    -0
      scripts/ci/reactive_service.sh
  25. +51
    -0
      scripts/ci/run_bee.sh
  26. +58
    -0
      scripts/config_template/nginx/REPO_NAME.private.conf
  27. +58
    -0
      scripts/config_template/nginx/REPO_NAME.public.conf
  28. +12
    -0
      scripts/config_template/systemctl/REPO_NAME.beta.service
  29. +12
    -0
      scripts/config_template/systemctl/REPO_NAME.online.service
  30. +145
    -0
      scripts/init_config.sh
  31. +11
    -0
      src/base/init.go
  32. +21
    -0
      src/config/app.conf
  33. +59
    -0
      src/controllers/event.go
  34. +25
    -0
      src/main.go
  35. +39
    -0
      src/middlewares/input_adapter.go
  36. +306
    -0
      src/middlewares/request_mw.go
  37. +112
    -0
      src/middlewares/return_struct.go
  38. +65
    -0
      src/models/cache.go
  39. +19
    -0
      src/routers/router.go

+ 79
- 0
DOCUMENTS/baidu_link_submit_ms.private.api.md View File

@ -0,0 +1,79 @@
# 接口
```bash
IP: 192.168.100.50
PORT: 8000
HOST: baidu-link-submit-ms.juejin.im
```
## 资源创建通知
### 请求
`POST /v1/events/created`
### 参数
```bash
# 格式
Content-Type: application/json; charset=utf-8
{
type,
id
}
```
```bash
# 说明
type := 'link' | 'column'
# type -> 资源类型,必需
# link -> 链接
# column -> 专栏
id := <string>
# id -> 资源 ID,必需
```
### 响应
```bash
{
"s": 1,
"m": "success",
"d": []
}
```
### 示例
```bash
# 专栏文章创建后
POST http://192.168.100.50:8000/v1/events/created HTTP/1.1
Host: baidu-link-submit-ms.juejin.im
Content-Type: application/json
{
"type": "column",
"id": "5ac9dc9af265da23884d5543"
}
```
## 资源更新通知
### 请求
`POST /v1/events/updated`
其余同上。
## 资源删除通知
### 请求
`POST /v1/events/deleted`
其余同上。

+ 1
- 2
README.md View File

@ -1,2 +1 @@
# hi-guoqian-go-ms
guoqian Go->redis

BIN
bin/baidu_link_submit_ms View File


+ 58
- 0
config/nginx/baidu_link_submit_ms.private.conf View File

@ -0,0 +1,58 @@
# baidu_link_submit_ms.private.conf
# baidu_link_submit_ms nginx config file.
#
# This file auto generated by baidu_link_submit_ms/scripts/init_config.sh,
# [WARRING!] DO NOT change this manualy.
#
# @version 170227:1
# @author zhangxuhong <zhangxuhong@xitu.io>
#
upstream baidu_link_submit_ms_private {
server 127.0.0.1:10100;
keepalive 64;
}
server {
listen 8000;
server_name baidu-link-submit-ms.juejin.im;
default_type 'text/plain'; # or browser will download page
include /data/apps/nginx/conf/origin/gold.xitu.io_and_juejin.im.conf;
root /data/repo/baidu_link_submit_ms;
access_log /data/repo/baidu_link_submit_ms/logs/nginx-access.public.log logstash;
error_log /data/repo/baidu_link_submit_ms/logs/nginx-error.public.log;
client_body_temp_path /data/logs/nginx/client_body_temp/ 1 2;
proxy_temp_path /data/logs/nginx/proxy_temp/ 1 2;
# X-Juejin-Src for api src trace back
# X-Juejin-Uid for non-login user id
# X-Juejin-Token for api param hash check
add_header 'Access-Control-Allow-Headers' 'X-Juejin-Src,X-Juejin-Uid,X-Juejin-Token' always;
if ($request_method = OPTIONS ) {
return 200;
}
# global location settings
location /status {
return 200;
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxy true;
proxy_pass http://baidu_link_submit_ms_private;
}
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
}

+ 58
- 0
config/nginx/baidu_link_submit_ms.public.conf View File

@ -0,0 +1,58 @@
# baidu_link_submit_ms.public.conf
# baidu_link_submit_ms nginx config file.
#
# This file auto generated by baidu_link_submit_ms/scripts/init_config.sh,
# [WARRING!] DO NOT change this manualy.
#
# @version 170227:1
# @author zhangxuhong <zhangxuhong@xitu.io>
#
upstream baidu_link_submit_ms_public {
server 127.0.0.1:10100;
keepalive 64;
}
server {
listen 80;
server_name baidu-link-submit-ms.juejin.im;
default_type 'text/plain'; # or browser will download page
include /data/apps/nginx/conf/origin/gold.xitu.io_and_juejin.im.conf;
root /data/repo/baidu_link_submit_ms;
access_log /data/repo/baidu_link_submit_ms/logs/nginx-access.public.log logstash;
error_log /data/repo/baidu_link_submit_ms/logs/nginx-error.public.log;
client_body_temp_path /data/logs/nginx/client_body_temp/ 1 2;
proxy_temp_path /data/logs/nginx/proxy_temp/ 1 2;
# X-Juejin-Src for api src trace back
# X-Juejin-Uid for non-login user id
# X-Juejin-Token for api param hash check
add_header 'Access-Control-Allow-Headers' 'X-Juejin-Src,X-Juejin-Uid,X-Juejin-Token' always;
if ($request_method = OPTIONS ) {
return 200;
}
# global location settings
location /status {
return 200;
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxy true;
proxy_pass http://baidu_link_submit_ms_public;
}
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
}

+ 1
- 0
config/nginx/placeholder View File

@ -0,0 +1 @@
1

+ 12
- 0
config/systemctl/baidu_link_submit_ms.service View File

@ -0,0 +1,12 @@
[Unit]
Description = Micro Service API
After = syslog.target network.target
[Service]
PIDFile = /data/repo/baidu_link_submit_ms/lock/baidu_link_submit_ms.pid
ExecStart = /data/repo/baidu_link_submit_ms/bin/baidu_link_submit_ms beta
ExecReload = /data/repo/baidu_link_submit_ms/bin/baidu_link_submit_ms beta reload
ExecStop = /data/repo/baidu_link_submit_ms/bin/baidu_link_submit_ms beta stop
[Install]
WantedBy=multi-user.target

+ 1
- 0
config/systemctl/placeholder View File

@ -0,0 +1 @@
1

BIN
pkg/linux_amd64/github.com/astaxie/beego.a View File


BIN
pkg/linux_amd64/github.com/astaxie/beego/config.a View File


BIN
pkg/linux_amd64/github.com/astaxie/beego/context.a View File


BIN
pkg/linux_amd64/github.com/astaxie/beego/context/param.a View File


BIN
pkg/linux_amd64/github.com/astaxie/beego/grace.a View File


BIN
pkg/linux_amd64/github.com/astaxie/beego/logs.a View File


BIN
pkg/linux_amd64/github.com/astaxie/beego/session.a View File


BIN
pkg/linux_amd64/github.com/astaxie/beego/toolbox.a View File


BIN
pkg/linux_amd64/github.com/astaxie/beego/utils.a View File


BIN
pkg/linux_amd64/github.com/garyburd/redigo/internal.a View File


BIN
pkg/linux_amd64/github.com/garyburd/redigo/redis.a View File


+ 82
- 0
scripts/ci.sh View File

@ -0,0 +1,82 @@
#!/bin/sh
# ci.sh
# This script for build go projects.
# @version 170327:2
# @author zhangxuhong <zhangxuhong@xitu.io>
#
# [ci]
echo "-[ci]-"
echo "start"
# ----------------------------[manual config here]------------------------------
# base config
REPO_SRC=/data/repo/baidu_link_submit_ms
BUILD_TARGET=baidu_link_submit_ms
# fetch source config
go_packages=(
"github.com/astaxie/beego"
)
http_proxy=""
# deploy config
DEPLOY_SRC=/data/repo
DEPLOY_LOG_SRC=/data/logs
ACTION=$1
RELEASE_ENV=$2
DEV_ENV_LOCATION=(
"root@192.168.0.203"
)
BETA_ENV_LOCATION=(
"root@192.168.0.222"
)
ONLINE_ENV_LOCATION=(
"root@192.168.100.42" # microservice03v
"root@192.168.100.44" # microservice04v
"root@192.168.100.46" # microservice04v
)
# ------------------------------------------------------------------------------
# check if release env fit repo src
NOW_PWD=`pwd`
if [ "$NOW_PWD" != "${REPO_SRC}/scripts" ] && [ "$NOW_PWD" != "${REPO_SRC}" ]; then
echo -e "\033[43m[WARRING!] PWD is ${NOW_PWD}, but REPO_SRC is ${REPO_SRC} \033[0m";
echo -e "please check your REPO_SRC config to make sure that you config this file correctly.";
exit 1;
fi
# run scripts
SCRIPTS_SRC="${REPO_SRC}/scripts/ci"
if [ "${ACTION}" == "build" ]; then
. "${SCRIPTS_SRC}/fetch_source.sh"
. "${SCRIPTS_SRC}/build.sh"
elif [ "${ACTION}" == "release" ]; then
. "${SCRIPTS_SRC}/fetch_source.sh"
. "${SCRIPTS_SRC}/build.sh"
. "${SCRIPTS_SRC}/deploy.sh"
elif [ "${ACTION}" == "run_bee" ]; then
. "${SCRIPTS_SRC}/run_bee.sh"
else
echo "usage:"
echo "./ci.sh [action: build/release/run_bee] [beta/online/bee_path]"
echo ""
echo "e.g."
echo "./ci.sh release beta"
echo ""
fi
echo "end"

+ 72
- 0
scripts/ci/build.sh View File

@ -0,0 +1,72 @@
#!/bin/sh
# build.sh
# This script for build go projects.
# @version 170227:1
# @author zhangxuhong <zhangxuhong@xitu.io>
#
# [config]
echo "-[config]-"
# ----------------------------[manual config here]------------------------------
# REPO_SRC=/data/repo/collection_set_api
# BUILD_TARGET=collection_set_api
# ------------------------------------------------------------------------------
echo -e "\033[34mREPO_SRC set to: ${REPO_SRC}\033[0m"
echo -e "\033[34mBUILD_TARGET set to: ${BUILD_TARGET}\033[0m"
echo ""
sleep 1
# [set env]
echo "-[set env]-"
# $GOBIN
export GOBIN="${REPO_SRC}/bin"
echo -e "\033[34mGOBIN set to: ${GOBIN}\033[0m"
# $GOPATH
export GOPATH="${REPO_SRC}"
echo -e "\033[34mGOPATH set to: ${GOPATH}\033[0m"
echo ""
sleep 1
# [check old build target]
echo "-[check old build target]-"
if [ ! -d $GOBIN ]; then mkdir $GOBIN; fi
if [ -f "${GOBIN}/${BUILD_TARGET}" ]; then
echo -e "\033[43m[WARRING!] build target alerady exists, will remove it. \033[0m";
echo "old build_target detail:"
ls -alh "${GOBIN}/${BUILD_TARGET}";
oldShaSum=`shasum "${GOBIN}/${BUILD_TARGET}" | awk -F' ' '{print $1}'`;
echo "target sha: ${oldShaSum}";
rm -rf "${GOBIN}/${BUILD_TARGET}";
echo "old build target removed.";
fi
echo "done."
echo ""
sleep 1
# [build]
echo "-[build]-"
echo "build start: "
echo "go build -o ${GOBIN}/${BUILD_TARGET}"
cd "${GOPATH}/src"
go build -o "${GOBIN}/${BUILD_TARGET}"
ls -alh "${GOBIN}/${BUILD_TARGET}"
newShaSum=`shasum "${GOBIN}/${BUILD_TARGET}" | awk -F' ' '{print $1}'`;
echo "target sha: ${newShaSum}";
if [ "$oldShaSum" == "$newShaSum" ];then
echo -e "\033[43m[WARRING!] old build target shasum is equals to new build target. \033[0m"
fi
echo "done."

+ 181
- 0
scripts/ci/deploy.sh View File

@ -0,0 +1,181 @@
#!/bin/sh
# deploy.sh
# This script deploy repo to target env.
# @version 170322:2
# @author zhangxuhong <zhangxuhong@xitu.io>
#
# [start deploy]
echo "-[start deploy]-"
# ----------------------------[manual config here]------------------------------
# REPO_SRC=/data/repo/collection_set_api
# BUILD_TARGET=collection_set_api
# DEPLOY_SRC=/data/repo
# DEPLOY_LOG_SRC=/data/logs
# RELEASE_ENV=$1
#
# DEV_ENV_LOCATION=(
# "root@192.168.0.203"
# )
# BETA_ENV_LOCATION=(
# "root@192.168.0.204"
# )
# ONLINE_ENV_LOCATION=(
# "root@192.168.100.32" # microservice03v
# "root@192.168.100.28" # microservice04v
# )
# ------------------------------------------------------------------------------
# final release location
RELEASE_ENV_LOCATION=""
# release file temp storage location
RELEASE_TEMP_DIR=/data/repo/release
# program system service name for systemctl
SERVICE_NAME="${BUILD_TARGET}.service"
# final deploy src
FINAL_DEPLOY_SRC="${DEPLOY_SRC}/${BUILD_TARGET}"
# nginx config
NGINX_BIN_LOCATION="/data/apps/nginx/sbin/nginx"
NGINX_CONFIG_LOCATION="/data/apps/nginx/conf/vhost/"
# deploy target machine error handler config
DEPLOY_ERROR_SIGNAL_FILE="${FINAL_DEPLOY_SRC}/logs/deploy_error.s"
DEPLOY_SUCCESS_SIGNAL_FILE="${FINAL_DEPLOY_SRC}/logs/deploy_success.s"
DEPLOY_LOG="${FINAL_DEPLOY_SRC}/logs/deploy.log"
# print config
echo -e "\033[34mREPO_SRC set to: ${REPO_SRC}\033[0m"
echo -e "\033[34mBUILD_TARGET set to: ${BUILD_TARGET}\033[0m"
echo -e "\033[34mRELEASE_TEMP_DIR set to: ${RELEASE_TEMP_DIR}\033[0m"
echo -e "\033[34mPROJECT WILL DEPLOY TO: ${FINAL_DEPLOY_SRC}\033[0m"
echo -e "\033[34mSERVICE_NAME set to: ${SERVICE_NAME}\033[0m"
echo ""
sleep 2
# [check input]
if [ "$RELEASE_ENV" == "dev" ]; then
RELEASE_ENV_LOCATION=${DEV_ENV_LOCATION[*]}
elif [ "$RELEASE_ENV" == "beta" ]; then
RELEASE_ENV_LOCATION=${BETA_ENV_LOCATION[*]}
elif [ "$RELEASE_ENV" == "online" ]; then
RELEASE_ENV_LOCATION=${ONLINE_ENV_LOCATION[*]}
else
RELEASE_ENV_LOCATION=""
fi
if [ "$RELEASE_ENV_LOCATION" == "" ]; then
echo "please input an avaliable deploy environment [dev/beta/online]";
echo "example: ./deploy.sh beta";
exit 1;
fi
echo -e "\033[34mRELEASE_ENV set to: ${RELEASE_ENV} \033[0m"
echo -e "\033[34mRELEASE_ENV_LOCATION set to: \033[0m"
for releaseLocation in ${RELEASE_ENV_LOCATION[*]};
do
echo -e "\033[34m ${releaseLocation} \033[0m"
done
echo ""
sleep 1
# [check old release file]
echo "-[check old release target]-"
if [ ! -d $RELEASE_TEMP_DIR ]; then mkdir $RELEASE_TEMP_DIR; fi
if [ -f "${RELEASE_TEMP_DIR}/${BUILD_TARGET}.tar.gz" ]; then
echo -e "\033[43m[WARRING!] release target alerady exists, will remove it. \033[0m";
ls -alh "${RELEASE_TEMP_DIR}/${BUILD_TARGET}.tar.gz";
oldShaSum=`shasum "${RELEASE_TEMP_DIR}/${BUILD_TARGET}.tar.gz" | awk -F' ' '{print $1}'`;
echo "target sha: ${oldShaSum}";
rm -f "${RELEASE_TEMP_DIR}/${BUILD_TARGET}.tar.gz";
echo "old build target removed.";
fi
echo ""
sleep 1
# [compress new release file]
echo "-[compress new release file]-"
cd $REPO_SRC;
tar -zcf "${RELEASE_TEMP_DIR}/${BUILD_TARGET}.tar.gz" "./"
ls -alh "${RELEASE_TEMP_DIR}/${BUILD_TARGET}.tar.gz";
newShaSum=`shasum "${RELEASE_TEMP_DIR}/${BUILD_TARGET}.tar.gz" | awk -F' ' '{print $1}'`;
echo "target sha: ${newShaSum}";
if [ "$oldShaSum" == "$newShaSum" ];then
echo -e "\033[43m[WARRING!] old release target shasum is equals to new release target. \033[0m"
fi
echo ""
sleep 1
# [deploy]
echo "-[deploy]-"
echo "- coyp to target machine"
for releaseLocation in ${RELEASE_ENV_LOCATION[*]};
do
echo -e "\033[34m deploy to ${releaseLocation} \033[0m";
ssh -T $releaseLocation <<DEPLOY_INIT_SCRIPTS_1
if [ ! -d $FINAL_DEPLOY_SRC ]; then mkdir $FINAL_DEPLOY_SRC; fi
if [ -f ${FINAL_DEPLOY_SRC}/${BUILD_TARGET}.tar.gz ]; then
rm -f ${FINAL_DEPLOY_SRC}/${BUILD_TARGET}.tar.gz;
fi
DEPLOY_INIT_SCRIPTS_1
scp "${RELEASE_TEMP_DIR}/${BUILD_TARGET}.tar.gz" "${releaseLocation}:${FINAL_DEPLOY_SRC}/";
ssh -T $releaseLocation <<DEPLOY_INIT_SCRIPTS_2
cd "${FINAL_DEPLOY_SRC}/";
tar -zxvf "./${BUILD_TARGET}.tar.gz";
DEPLOY_INIT_SCRIPTS_2
done
echo "done."
echo ""
echo "-[configure & reactive service]-"
i=0
for releaseLocation in ${RELEASE_ENV_LOCATION[*]};
do
# sleep for online lvs reconnect nginx
if [ "$i" != "0" ]; then
echo "sleep 120 seconds for online lvs reconnect nginx.";
sleep 120;
fi
# deploy start
echo -e "\033[34mconfigure ${releaseLocation} \033[0m"
ssh -T $releaseLocation <<DEPLOY_SCRIPTS_1
# exec reactive scripts
chmod +x "${FINAL_DEPLOY_SRC}/scripts/ci/reactive_service.sh";
bash "${FINAL_DEPLOY_SRC}/scripts/ci/reactive_service.sh" ${REPO_SRC} ${BUILD_TARGET} ${DEPLOY_SRC} ${DEPLOY_LOG_SRC} ${RELEASE_ENV};
DEPLOY_SCRIPTS_1
#check deploy result
isDeploySuccess=""
isDeploySuccess=`ssh -T $releaseLocation <<DEPLOY_SCRIPTS_2
cat $DEPLOY_SUCCESS_SIGNAL_FILE
DEPLOY_SCRIPTS_2`
if [ "${isDeploySuccess}" != "success" ]; then
echo -e "\033[43m[ERROR!] deploy failed detected. Failed at : ${releaseLocation}\033[0m";
echo "please check release log at : ${releaseLocation}${DEPLOY_LOG}";
echo "script exit.";
exit 1;
else
echo -e "\033[32m[OK] deploy success. deploy at : ${releaseLocation}\033[0m";
fi
# counter
i=$(expr "$i" + "1");
done
echo "done.";
exit 0;

+ 71
- 0
scripts/ci/fetch_source.sh View File

@ -0,0 +1,71 @@
#!/bin/sh
# fetch_source.sh
# This script for fetch source and packages.
# @version 170227:1
# @author zhangxuhong <zhangxuhong@xitu.io>
#
# [config]
echo "-[config]-"
# ----------------------------[manual config here]------------------------------
# REPO_SRC=/data/repo/collection_set_api
go_packages=(
"github.com/astaxie/beego"
"github.com/garyburd/redigo/redis"
)
#
# http_proxy="http://localhost:8123"
# ------------------------------------------------------------------------------
# init env
# $GOBIN
export GOBIN="${REPO_SRC}/bin"
echo -e "\033[34mGOBIN set to: ${GOBIN}\033[0m"
# $GOPATH
export GOPATH="${REPO_SRC}"
echo -e "\033[34mGOPATH set to: ${GOPATH}\033[0m"
# print package list
echo "package list:"
for pkg in ${go_packages[*]};
do
echo -e "\033[34m${pkg}\033[0m";
done
echo ""
if [ "$http_proxy" != "" ]; then
echo "http_proxy set to:"
echo -e "\033[34m${http_proxy}\033[0m";
echo "http_proxy location info:"
proxyLocation=`http_proxy=${http_proxy} curl -s ip.gs`
echo -e "\033[34m${proxyLocation}\033[0m";
fi
echo ""
sleep 1
# [fetch]
echo "-[fetch package]-"
for pkg in ${go_packages[*]};
do
if [ "$http_proxy" == "" ]; then
echo "go get ${pkg}";
go get $pkg;
else
echo "http_proxy=${http_proxy} go get ${pkg}";
http_proxy=${http_proxy} go get $pkg;
fi
done
echo "done."

+ 183
- 0
scripts/ci/reactive_service.sh View File

@ -0,0 +1,183 @@
#!/bin/sh
# reactive_service.sh
# This script for reactive this projects.
# @version 170327:3
# @author zhangxuhong <zhangxuhong@xitu.io>
#
# [config]
echo "-[config]-"
# ----------------------------[manual config here]------------------------------
REPO_SRC=$1
BUILD_TARGET=$2
DEPLOY_SRC=$3
DEPLOY_LOG_SRC=$4
RELEASE_ENV=$5
# ------------------------------------------------------------------------------
# program system service name for systemctl
SERVICE_NAME="${BUILD_TARGET}.service"
# final deploy src
FINAL_DEPLOY_SRC="${DEPLOY_SRC}/${BUILD_TARGET}"
# nginx config
NGINX_BIN_LOCATION="/data/apps/nginx/sbin/nginx"
NGINX_CONFIG_LOCATION="/data/apps/nginx/conf/vhost/"
# deploy target machine error handler config
DEPLOY_ERROR_SIGNAL_FILE="${FINAL_DEPLOY_SRC}/logs/deploy_error.s"
DEPLOY_SUCCESS_SIGNAL_FILE="${FINAL_DEPLOY_SRC}/logs/deploy_success.s"
DEPLOY_LOG="${FINAL_DEPLOY_SRC}/logs/deploy.log"
# print config
echo -e "\033[34mREPO_SRC set to: ${REPO_SRC}\033[0m"
echo -e "\033[34mBUILD_TARGET set to: ${BUILD_TARGET}\033[0m"
echo -e "\033[34mPROJECT WILL DEPLOY TO: ${FINAL_DEPLOY_SRC}\033[0m"
echo -e "\033[34mSERVICE_NAME set to: ${SERVICE_NAME}\033[0m"
echo ""
sleep 2
# [check input]
if [ "$RELEASE_ENV" == "dev" ]; then
echo "env ok";
elif [ "$RELEASE_ENV" == "beta" ]; then
echo "env ok";
elif [ "$RELEASE_ENV" == "online" ]; then
echo "env ok";
else
echo "please input an avaliable deploy environment [dev/beta/online]";
echo "example: ./deploy.sh beta";
exit 1;
fi
echo -e "\033[34mRELEASE_ENV set to: ${RELEASE_ENV} \033[0m"
echo ""
sleep 1
# configure log
if [ ! -d "${DEPLOY_LOG_SRC}/${BUILD_TARGET}" ]; then mkdir "${DEPLOY_LOG_SRC}/${BUILD_TARGET}"; fi
if [ ! -L "${FINAL_DEPLOY_SRC}/logs" ]; then ln -s "${DEPLOY_LOG_SRC}/${BUILD_TARGET}" "${FINAL_DEPLOY_SRC}/logs"; fi
# remove old deploy signal
if [ -f "${DEPLOY_ERROR_SIGNAL_FILE}" ]; then rm -f "${DEPLOY_ERROR_SIGNAL_FILE}"; fi
if [ -f "${DEPLOY_SUCCESS_SIGNAL_FILE}" ]; then rm -f "${DEPLOY_SUCCESS_SIGNAL_FILE}"; fi
# deploy start
echo "" | tee -a $DEPLOY_LOG;
echo -e "`date "+%Y-%m-%d %H:%M:%S"` \c" | tee -a $DEPLOY_LOG;
echo "deploy start" | tee -a $DEPLOY_LOG;
# configure service
if [ ! -L "/etc/systemd/system/${SERVICE_NAME}" ]; then
cp "${FINAL_DEPLOY_SRC}/config/systemctl/${SERVICE_NAME}" "/etc/systemd/system/${SERVICE_NAME}";
else
rm -f "/etc/systemd/system/${SERVICE_NAME}";
cp "${FINAL_DEPLOY_SRC}/config/systemctl/${SERVICE_NAME}" "/etc/systemd/system/${SERVICE_NAME}";
fi
# configure nginx
PUBLIC_NGINX_CONF="${FINAL_DEPLOY_SRC}/config/nginx/${BUILD_TARGET}.public.conf"
PRIVATE_NGINX_CONF="${FINAL_DEPLOY_SRC}/config/nginx/${BUILD_TARGET}.private.conf"
if [ -f "${PUBLIC_NGINX_CONF}" ]; then
ln -s "${PUBLIC_NGINX_CONF}" $NGINX_CONFIG_LOCATION;
fi
if [ -f "${PRIVATE_NGINX_CONF}" ]; then
ln -s "${PRIVATE_NGINX_CONF}" $NGINX_CONFIG_LOCATION;
fi
# test nginx config
$NGINX_BIN_LOCATION -t 2> "${FINAL_DEPLOY_SRC}/logs/nginx_test.log";
isNginxOk=`grep 'test is successful' "${FINAL_DEPLOY_SRC}/logs/nginx_test.log" | wc -l `;
if [ "$isNginxOk" != "1" ]; then
touch $DEPLOY_ERROR_SIGNAL_FILE;
echo -e "`date "+%Y-%m-%d %H:%M:%S"` \c" | tee -a $DEPLOY_LOG;
echo "[ERROR!] deploy error with nginx config error, nginx config error is : " | tee -a $DEPLOY_LOG;
cat "${FINAL_DEPLOY_SRC}/logs/nginx_test.log" | tee -a $DEPLOY_LOG;
exit 1;
else
echo -e "`date "+%Y-%m-%d %H:%M:%S"` \c" | tee -a $DEPLOY_LOG;
echo "nginx config is ok:" | tee -a $DEPLOY_LOG;
cat "${FINAL_DEPLOY_SRC}/logs/nginx_test.log" | tee -a $DEPLOY_LOG;
fi
# stop nginx
$NGINX_BIN_LOCATION -s stop
# check nginx is stoped
sleep 20;
nginxNum=`ps auxw | grep --color 'nginx' | grep -v grep | wc -l`
if [ "$nginxNum" != "0" ]; then
touch $DEPLOY_ERROR_SIGNAL_FILE;
echo -e "`date "+%Y-%m-%d %H:%M:%S"` \c" | tee -a $DEPLOY_LOG;
echo "[ERROR!] deploy error with nginx stop failed, nginx process num is : ${nginxNum}" | tee -a $DEPLOY_LOG;
exit 1;
else
echo -e "`date "+%Y-%m-%d %H:%M:%S"` \c" | tee -a $DEPLOY_LOG;
echo "nginx stopped" | tee -a $DEPLOY_LOG;
fi
# restart service
/usr/bin/systemctl daemon-reload;
/usr/bin/systemctl enable ${SERVICE_NAME};
/usr/bin/systemctl stop ${BUILD_TARGET}; # use start-stop for first time deploy
/usr/bin/systemctl start ${BUILD_TARGET};
# check service
sleep 2;
/usr/bin/systemctl status "${BUILD_TARGET}" > "${FINAL_DEPLOY_SRC}/logs/service_status.log";
serviceStatus=`grep "Active: active" "${FINAL_DEPLOY_SRC}/logs/service_status.log" | wc -l`;
if [ "$serviceStatus" == "0" ]; then
touch $DEPLOY_ERROR_SIGNAL_FILE;
echo -e "`date "+%Y-%m-%d %H:%M:%S"` \c" | tee -a $DEPLOY_LOG;
echo "[ERROR!] deploy error with service start failed, systemctl status :" | tee -a $DEPLOY_LOG;
cat "${FINAL_DEPLOY_SRC}/logs/service_status.log" | tee -a $DEPLOY_LOG;
# restart nginx
$NGINX_BIN_LOCATION;
# check nginx num
nginxNum=`ps auxw | grep --color 'nginx' | grep -v grep | wc -l`
sleep 5;
if [ "$nginxNum" == "0" ]; then
touch $DEPLOY_ERROR_SIGNAL_FILE;
echo -e "`date "+%Y-%m-%d %H:%M:%S"` \c" | tee -a $DEPLOY_LOG;
echo "[ERROR!] deploy error with nginx start failed, nginx process num is : ${nginxNum}" | tee -a $DEPLOY_LOG;
exit 1;
else
echo -e "`date "+%Y-%m-%d %H:%M:%S"` \c" | tee -a $DEPLOY_LOG;
echo "nginx started" | tee -a $DEPLOY_LOG;
fi
exit 1;
else
echo -e "`date "+%Y-%m-%d %H:%M:%S"` \c" | tee -a $DEPLOY_LOG;
echo "service started" | tee -a $DEPLOY_LOG;
cat "${FINAL_DEPLOY_SRC}/logs/service_status.log" | tee -a $DEPLOY_LOG;
fi
# start nginx
$NGINX_BIN_LOCATION
# check nginx num
nginxNum=`ps auxw | grep --color 'nginx' | grep -v grep | wc -l`;
sleep 5;
if [ "$nginxNum" == "0" ]; then
touch $DEPLOY_ERROR_SIGNAL_FILE;
echo -e "`date "+%Y-%m-%d %H:%M:%S"` \c" | tee -a $DEPLOY_LOG;
echo "[ERROR!] deploy error with nginx start failed, nginx process num is : ${nginxNum}" | tee -a $DEPLOY_LOG;
exit 1;
else
echo -e "`date "+%Y-%m-%d %H:%M:%S"` \c" | tee -a $DEPLOY_LOG;
echo "nginx started" | tee -a $DEPLOY_LOG;
fi
# deploy success
echo "success" > $DEPLOY_SUCCESS_SIGNAL_FILE;
echo -e "`date "+%Y-%m-%d %H:%M:%S"` \c" | tee -a $DEPLOY_LOG;
echo "[OK] deploy success." | tee -a $DEPLOY_LOG;
exit 0;

+ 51
- 0
scripts/ci/run_bee.sh View File

@ -0,0 +1,51 @@
#!/bin/sh
# run_bee.sh
# This script for run beego projects for dev.
# @version 170227:1
# @author zhangxuhong <zhangxuhong@xitu.io>
#
# [config]
echo "-[config]-"
# ----------------------------[manual config here]------------------------------
# REPO_SRC=/data/repo/collection_set_api
# BUILD_TARGET=collection_set_api
BEE_PATH=$2
# ------------------------------------------------------------------------------
echo -e "\033[34mREPO_SRC set to: ${REPO_SRC}\033[0m"
echo -e "\033[34mBUILD_TARGET set to: ${BUILD_TARGET}\033[0m"
echo ""
sleep 1
# [set env]
echo "-[set env]-"
# $GOBIN
export GOBIN="${REPO_SRC}/bin"
echo -e "\033[34mGOBIN set to: ${GOBIN}\033[0m"
# $GOPATH
export GOPATH="${REPO_SRC}"
echo -e "\033[34mGOPATH set to: ${GOPATH}\033[0m"
echo ""
# run
if [ "${BEE_PATH}" == "" ]; then
echo "please input bee executable file loacation to run this scripts, like :"
echo "./ci.sh run_bee /data/bin/bee"
exit 1;
fi
`${BEE_PATH} run ${REPO_SRC}/src`
echo "done."

+ 58
- 0
scripts/config_template/nginx/REPO_NAME.private.conf View File

@ -0,0 +1,58 @@
# REPO_NAME.private.conf
# REPO_NAME nginx config file.
#
# This file auto generated by REPO_NAME/scripts/init_config.sh,
# [WARRING!] DO NOT change this manualy.
#
# @version 170227:1
# @author zhangxuhong <zhangxuhong@xitu.io>
#
upstream REPO_NAME_private {
server UPSTREAM_ADDR;
keepalive 64;
}
server {
listen 8000;
server_name DOMAIN_NAME;
default_type 'text/plain'; # or browser will download page
include /data/apps/nginx/conf/origin/gold.xitu.io_and_juejin.im.conf;
root /data/repo/REPO_NAME;
access_log /data/repo/REPO_NAME/logs/nginx-access.public.log logstash;
error_log /data/repo/REPO_NAME/logs/nginx-error.public.log;
client_body_temp_path /data/logs/nginx/client_body_temp/ 1 2;
proxy_temp_path /data/logs/nginx/proxy_temp/ 1 2;
# X-Juejin-Src for api src trace back
# X-Juejin-Uid for non-login user id
# X-Juejin-Token for api param hash check
add_header 'Access-Control-Allow-Headers' 'X-Juejin-Src,X-Juejin-Uid,X-Juejin-Token' always;
if ($request_method = OPTIONS ) {
return 200;
}
# global location settings
location /status {
return 200;
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxy true;
proxy_pass http://REPO_NAME_private;
}
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
}

+ 58
- 0
scripts/config_template/nginx/REPO_NAME.public.conf View File

@ -0,0 +1,58 @@
# REPO_NAME.public.conf
# REPO_NAME nginx config file.
#
# This file auto generated by REPO_NAME/scripts/init_config.sh,
# [WARRING!] DO NOT change this manualy.
#
# @version 170227:1
# @author zhangxuhong <zhangxuhong@xitu.io>
#
upstream REPO_NAME_public {
server UPSTREAM_ADDR;
keepalive 64;
}
server {
listen 80;
server_name DOMAIN_NAME;
default_type 'text/plain'; # or browser will download page
include /data/apps/nginx/conf/origin/gold.xitu.io_and_juejin.im.conf;
root /data/repo/REPO_NAME;
access_log /data/repo/REPO_NAME/logs/nginx-access.public.log logstash;
error_log /data/repo/REPO_NAME/logs/nginx-error.public.log;
client_body_temp_path /data/logs/nginx/client_body_temp/ 1 2;
proxy_temp_path /data/logs/nginx/proxy_temp/ 1 2;
# X-Juejin-Src for api src trace back
# X-Juejin-Uid for non-login user id
# X-Juejin-Token for api param hash check
add_header 'Access-Control-Allow-Headers' 'X-Juejin-Src,X-Juejin-Uid,X-Juejin-Token' always;
if ($request_method = OPTIONS ) {
return 200;
}
# global location settings
location /status {
return 200;
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxy true;
proxy_pass http://REPO_NAME_public;
}
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
}

+ 12
- 0
scripts/config_template/systemctl/REPO_NAME.beta.service View File

@ -0,0 +1,12 @@
[Unit]
Description = Micro Service API
After = syslog.target network.target
[Service]
PIDFile = /data/repo/REPO_NAME/lock/BUILD_TARGET.pid
ExecStart = /data/repo/REPO_NAME/bin/BUILD_TARGET beta
ExecReload = /data/repo/REPO_NAME/bin/BUILD_TARGET beta reload
ExecStop = /data/repo/REPO_NAME/bin/BUILD_TARGET beta stop
[Install]
WantedBy=multi-user.target

+ 12
- 0
scripts/config_template/systemctl/REPO_NAME.online.service View File

@ -0,0 +1,12 @@
[Unit]
Description = Micro Service API
After = syslog.target network.target
[Service]
PIDFile = /data/repo/REPO_NAME/lock/BUILD_TARGET.pid
ExecStart = /data/repo/REPO_NAME/bin/BUILD_TARGET online
ExecReload = /data/repo/REPO_NAME/bin/BUILD_TARGET online reload
ExecStop = /data/repo/REPO_NAME/bin/BUILD_TARGET online stop
[Install]
WantedBy=multi-user.target

+ 145
- 0
scripts/init_config.sh View File

@ -0,0 +1,145 @@
#!/bin/bash
# init_config.sh
# init enviroment config scripts.
# @version 170322:1
# @author zhangxuhong <zhangxuhong@xitu.io>
#
# ----------------------------[manual config here]------------------------------
# base config
REPO_SRC=/data/repo/baidu_link_submit_ms
REPO_NAME=baidu_link_submit_ms
BUILD_TARGET="${REPO_NAME}"
RELEASE_ENV=$1 # test, beta, online
# nginx config file type
DOMAIN_NAME="baidu-link-submit-ms.juejin.im"
PUBLIC_UPSTREAM_PORT=13100
PRIVATE_UPSTREAM_PORT=13100
# ------------------------------------------------------------------------------
# default config
NGINX_CONF_TMPL_PUBLIC="REPO_NAME.public.conf"
NGINX_CONF_TMPL_PRIVATE="REPO_NAME.private.conf"
SYSTEMCTL_CONF_TMPL_BETA="REPO_NAME.beta.service"
SYSTEMCTL_CONF_TMPL_RELEASE="REPO_NAME.online.service"
# auto generated config
# nginx
NGINX_CONFIG_TMPL_FOLDER="${REPO_SRC}/scripts/config_template/nginx"
NGINX_CONFIG_DEPLOY_FOLDER="${REPO_SRC}/config/nginx"
NGINX_CONF_PUBLIC="${REPO_NAME}.public.conf"
NGINX_CONF_PRIVATE="${REPO_NAME}.private.conf"
NGINX_CONF_PUBLIC_ADDR="${NGINX_CONFIG_DEPLOY_FOLDER}/${NGINX_CONF_PUBLIC}"
NGINX_CONF_PRIVATE_ADDR="${NGINX_CONFIG_DEPLOY_FOLDER}/${NGINX_CONF_PRIVATE}"
if [ "${PUBLIC_UPSTREAM_PORT}" != "" ]; then
UPSTREAM_ADDR_PUBLIC="127.0.0.1:${PUBLIC_UPSTREAM_PORT}"
fi
if [ "${PRIVATE_UPSTREAM_PORT}" != "" ]; then
UPSTREAM_ADDR_PRIVATE="127.0.0.1:${PRIVATE_UPSTREAM_PORT}"
fi
# systemctl
SYSTEMCTL_CONFIG_TMPL_FOLDER="${REPO_SRC}/scripts/config_template/systemctl"
SYSTEMCTL_CONFIG_DEPLOY_FOLDER="${REPO_SRC}/config/systemctl"
SYSTEMCTL_CONF="${REPO_NAME}.service"
SYSTEMCTL_CONF_ADDR="${SYSTEMCTL_CONFIG_DEPLOY_FOLDER}/${SYSTEMCTL_CONF}"
# release env
if [ "$RELEASE_ENV" == "dev" ]; then
RELEASE_ENV_LOCATION="$RELEASE_ENV"
elif [ "$RELEASE_ENV" == "beta" ]; then
RELEASE_ENV_LOCATION="$RELEASE_ENV"
elif [ "$RELEASE_ENV" == "online" ]; then
RELEASE_ENV_LOCATION="$RELEASE_ENV"
else
RELEASE_ENV_LOCATION=""
fi
if [ "$RELEASE_ENV_LOCATION" == "" ]; then
echo "please input an avaliable deploy environment [dev/beta/online]";
echo "example: ./init_config.sh.sh beta";
exit 1;
fi
# ------------------------------------------------------------------------------
# scripts start
# check env
NOW_PWD=`pwd`
if [ "$NOW_PWD" != "${REPO_SRC}/scripts" ] && [ "$NOW_PWD" != "${REPO_SRC}" ]; then
echo -e "\033[43m[WARRING!] PWD is ${NOW_PWD}, but REPO_SRC is ${REPO_SRC} \033[0m";
echo -e "please check your REPO_SRC config to make sure that you config this file correctly.";
exit 1;
fi
# [init nginx config]
# deploy tmpl config to deploy folder
# for public config
if [ "${PUBLIC_UPSTREAM_PORT}" != "" ]; then
# deploy tmpl config to deploy folder
if [ -f "${NGINX_CONF_PUBLIC_ADDR}" ]; then
rm -f "${NGINX_CONF_PUBLIC_ADDR}";
fi
cp "${NGINX_CONFIG_TMPL_FOLDER}/${NGINX_CONF_TMPL_PUBLIC}" "${NGINX_CONF_PUBLIC_ADDR}";
# replace config param
sed -i "s/REPO_NAME/${REPO_NAME}/g" "${NGINX_CONF_PUBLIC_ADDR}";
# replace domain name
sed -i "s/DOMAIN_NAME/${DOMAIN_NAME}/g" "${NGINX_CONF_PUBLIC_ADDR}";
# replace upstream addr
sed -i "s/UPSTREAM_ADDR/${UPSTREAM_ADDR_PUBLIC}/g" "${NGINX_CONF_PUBLIC_ADDR}";
fi
# for private config
if [ "${PRIVATE_UPSTREAM_PORT}" != "" ]; then
# deploy tmpl config to deploy folder
if [ -f "${NGINX_CONF_PRIVATE_ADDR}" ]; then
rm -f "${NGINX_CONF_PRIVATE_ADDR}";
fi
cp "${NGINX_CONFIG_TMPL_FOLDER}/${NGINX_CONF_TMPL_PRIVATE}" "${NGINX_CONF_PRIVATE_ADDR}"
# replace config param
sed -i "s/REPO_NAME/${REPO_NAME}/g" "${NGINX_CONF_PRIVATE_ADDR}";
# replace domain name
sed -i "s/DOMAIN_NAME/${DOMAIN_NAME}/g" "${NGINX_CONF_PRIVATE_ADDR}";
# replace upstream addr
sed -i "s/UPSTREAM_ADDR/${UPSTREAM_ADDR_PRIVATE}/g" "${NGINX_CONF_PRIVATE_ADDR}";
fi
# [init systemctl config]
# deploy tmpl config to deploy folder
# for beta service
if [ "${RELEASE_ENV_LOCATION}" == "beta" ]; then
if [ -f "${SYSTEMCTL_CONF_ADDR}" ]; then
rm -f "${SYSTEMCTL_CONF_ADDR}";
fi
cp "${SYSTEMCTL_CONFIG_TMPL_FOLDER}/${SYSTEMCTL_CONF_TMPL_BETA}" "${SYSTEMCTL_CONF_ADDR}"
# replace repo name
sed -i "s/REPO_NAME/${REPO_NAME}/g" "${SYSTEMCTL_CONF_ADDR}";
# replace build target
sed -i "s/BUILD_TARGET/${BUILD_TARGET}/g" "${SYSTEMCTL_CONF_ADDR}";
fi
# for online service
if [ "${RELEASE_ENV_LOCATION}" == "online" ]; then
if [ -f "${SYSTEMCTL_CONF_ADDR}" ]; then
rm -f "${SYSTEMCTL_CONF_ADDR}";
fi
cp "${SYSTEMCTL_CONFIG_TMPL_FOLDER}/${SYSTEMCTL_CONF_TMPL_RELEASE}" "${SYSTEMCTL_CONF_ADDR}"
# replace repo name
sed -i "s/REPO_NAME/${REPO_NAME}/g" "${SYSTEMCTL_CONF_ADDR}";
# replace build target
sed -i "s/BUILD_TARGET/${BUILD_TARGET}/g" "${SYSTEMCTL_CONF_ADDR}";
fi
exit 0;

+ 11
- 0
src/base/init.go View File

@ -0,0 +1,11 @@
package base
import (
"github.com/astaxie/beego"
)
const configFilePath = "/data/repo/baidu_link_submit_ms/src/config/app.conf"
func init() {
beego.LoadAppConfig("ini", configFilePath)
}

+ 21
- 0
src/config/app.conf View File

@ -0,0 +1,21 @@
appname = hi_guoqian_go_ms
httpport = 13100
runmode = dev
autorender = false
copyrequestbody = true
EnableDocs = false
[dev]
redisAddress = 192.168.0.204:6379
redisDb = 0
redisPassword=
[beta]
redisAddress = 192.168.0.204:6379
redisDb = 0
redisPassword=
[proc]
redisAddress = 192.168.100.15:6379
redisDb = 1
redisPassword=rcASeLT1NayQp59B4UiM

+ 59
- 0
src/controllers/event.go View File

@ -0,0 +1,59 @@
package controllers
import (
. "errors"
"github.com/astaxie/beego"
. "middlewares"
. "models"
)
var (
baseUrl string = "https://juejin.im"
typePathMap map[string]string = map[string]string{
"link": "/entry/",
"column": "/post/",
}
)
type EventController struct {
beego.Controller
}
//start
func (this *EventController) Contribution() {
ret, err := IncrRedis("hi:guoqian")
controller := &BeegoController{Controller: this.Controller}
if err != nil {
if err.Error() == M_NO_RESULT {
controller.RenderOutput(EmptyErr(nil))
return
} else {
controller.RenderOutput(ServerErr(err.Error()))
return
}
}else{
controller.RenderOutput(Success(ret))
return
}
}
func (this *EventController) Second() {
ret, err := GetRedis("hi:guoqian")
controller := &BeegoController{Controller: this.Controller}
if err != nil {
if err.Error() == M_NO_RESULT {
controller.RenderOutput(EmptyErr(nil))
return
} else {
controller.RenderOutput(ServerErr(err.Error()))
return
}
}else{
controller.RenderOutput(Success(ret))
return
}
}
//end

+ 25
- 0
src/main.go View File

@ -0,0 +1,25 @@
package main
import (
"github.com/astaxie/beego"
_ "base"
_ "models"
_ "routers"
)
func main() {
initLog()
beego.Run()
}
func initLog() {
name := beego.AppConfig.String("appname")
logFilePath := "/data/repo/" + name + "/logs/" + name + ".log"
beego.SetLogger("file", `{"filename":"` + logFilePath + `","level":2,"daily":true,"maxdays":10}`)
if beego.AppConfig.String("runmode") != "dev" {
beego.BeeLogger.DelLogger("console")
}
beego.BeeLogger.EnableFuncCallDepth(true)
beego.SetLogFuncCall(true)
beego.BeeLogger.Async()
}

+ 39
- 0
src/middlewares/input_adapter.go View File

@ -0,0 +1,39 @@
package middleware
import (
"github.com/astaxie/beego"
)
type BeegoController struct {
Controller beego.Controller
}
func (c *BeegoController) GetQuery(key string) string {
return c.Controller.Input().Get(key)
}
func (c *BeegoController) GetForm(key string) string {
return c.Controller.Input().Get(key)
}
func (c *BeegoController) GetHeader(key string) string {
return c.Controller.Ctx.Input.Header(key)
}
func (c *BeegoController) GetCookie(key string) string {
return c.Controller.Ctx.Input.Cookie(key)
}
func (c *BeegoController) GetBody() []byte {
return c.Controller.Ctx.Input.RequestBody
}
func (c *BeegoController) GetPath(key string) string {
return c.Controller.GetString(":" + key)
}
func (c *BeegoController) GetArray(key string) []string {
array := make([]string, 0)
c.Controller.Ctx.Input.Bind(&array, key)
return array
}
func (c *BeegoController) RenderOutput(ret *RenderStruct) {
c.Controller.Ctx.Output.Status = ret.Status
c.Controller.Data["json"] = ret
c.Controller.ServeJSON()
}

+ 306
- 0
src/middlewares/request_mw.go View File

@ -0,0 +1,306 @@
package middleware
import (
"encoding/json"
"strconv"
"time"
)
const (
TYPE_STRING = iota
TYPE_INT
TYPE_FLOAT
TYPE_BOOLEAN
TYPE_TIME
TYPE_ARRAY
TYPE_JSON_OBJECT
)
const (
POS_QUERY = iota
POS_HEADER
POS_BODY_FORM
POS_BODY_JSON
POS_PATH
POS_COOKIE
)
const (
TIME_LAYOUT = "2006-01-02T15:04:05Z"
)
type InputInterface interface {
GetQuery(key string) string
GetForm(key string) string
GetHeader(key string) string
GetCookie(key string) string
GetBody() []byte
GetPath(key string) string
GetArray(key string) []string
RenderOutput(r *RenderStruct)
}
type InputContainer struct {
simpleMap map[string]interface{}
objectMap map[string][]byte
arrayMap map[string][]string
}
type InputRule struct {
Name string
Description string
Position int
Type int
//此处有蹊跷
Limit []string
Necessary bool
Max int
Min int
Default interface{}
}
type CheckError struct {
Missing string `json:"missing" xml:"missing"`
Illegal string `json:"illegal" xml:"illegal"`
}
func (c *CheckError) Error() string {
return "input error"
}
//must use this func to create a new container
func NewContainer() *InputContainer {
return &InputContainer{
simpleMap: make(map[string]interface{}),
objectMap: make(map[string][]byte),
arrayMap: make(map[string][]string),
}
}
func (i *InputContainer) CheckInput(input InputInterface, rules []*InputRule) *CheckError {
for _, rule := range rules {
//check special input type
switch rule.Type {
case TYPE_ARRAY:
arr := input.GetArray(rule.Name)
if rule.Necessary && len(arr) <= 0 {
return &CheckError{
Missing: rule.Name,
}
}
if rule.Max > 0 {
if len(arr) > rule.Max {
return &CheckError{
Illegal: rule.Name,
}
}
}
if rule.Min > 0 {
if len(arr) < rule.Min {
return &CheckError{
Illegal: rule.Name,
}
}
}
i.arrayMap[rule.Name] = arr
case TYPE_JSON_OBJECT:
var bytes []byte
switch rule.Position {
default:
fallthrough
case POS_BODY_JSON:
bytes = input.GetBody()
case POS_QUERY:
bytes = []byte(input.GetQuery(rule.Name))
case POS_BODY_FORM:
bytes = []byte(input.GetForm(rule.Name))
case POS_HEADER:
bytes = []byte(input.GetHeader(rule.Name))
case POS_COOKIE:
bytes = []byte(input.GetCookie(rule.Name))
}
if rule.Necessary && len(bytes) <= 0 {
return &CheckError{
Missing: rule.Name,
}
} else if len(bytes) <= 0 {
continue
}
err := json.Unmarshal(bytes, &map[string]interface{}{})
if err != nil {
return &CheckError{
Illegal: rule.Name,
}
}
i.objectMap[rule.Name] = bytes
default:
//check normal input type
var val string
switch rule.Position {
case POS_PATH:
val = input.GetPath(rule.Name)
default:
fallthrough
case POS_QUERY:
val = input.GetQuery(rule.Name)
case POS_BODY_FORM:
val = input.GetForm(rule.Name)
case POS_HEADER:
val = input.GetHeader(rule.Name)
case POS_COOKIE:
val = input.GetCookie(rule.Name)
}
if rule.Necessary && len(val) <= 0 {
return &CheckError{
Missing: rule.Name,
}
} else if len(val) <= 0 {
i.simpleMap[rule.Name] = rule.Default
} else {
res, err := checkValue(rule, val)
if err != nil {
return err
}
i.simpleMap[rule.Name] = res
}
}
}
return nil
}
func checkValue(rule *InputRule, val string) (interface{}, *CheckError) {
limit := len(rule.Limit) <= 0
if !limit {
for _, i := range rule.Limit {
if val == i {
limit = true
break
}
}
if !limit {
return nil, &CheckError{
Illegal: rule.Name,
}
}
}
switch rule.Type {
default:
fallthrough
case TYPE_STRING:
if rule.Max > 0 {
if len(val) > rule.Max {
return nil, &CheckError{
Illegal: rule.Name,
}
}
}
if rule.Min > 0 {
if len(val) < rule.Min {
return nil, &CheckError{
Illegal: rule.Name,
}
}
}
return val, nil
case TYPE_INT:
intVal, err := strconv.Atoi(val)
if err != nil {
return nil, &CheckError{
Illegal: rule.Name,
}
}
if rule.Max > 0 {
if intVal > rule.Max {
return nil, &CheckError{
Illegal: rule.Name,
}
}
}
if rule.Min > 0 {
if intVal < rule.Min {
return nil, &CheckError{
Illegal: rule.Name,
}
}
}
return intVal, nil
case TYPE_FLOAT:
floatVal, err := strconv.ParseFloat(val, 64)
if err != nil {
return nil, &CheckError{
Illegal: rule.Name,
}
}
if rule.Max > 0 {
if floatVal > float64(rule.Max) {
return nil, &CheckError{
Illegal: rule.Name,
}
}
}
if rule.Min > 0 {
if floatVal < float64(rule.Min) {
return nil, &CheckError{
Illegal: rule.Name,
}
}
}
return floatVal, nil
case TYPE_BOOLEAN:
booleanVal, err := strconv.ParseBool(val)
if err != nil {
return nil, &CheckError{
Illegal: rule.Name,
}
}
return booleanVal, nil
case TYPE_TIME:
t, err := time.Parse(TIME_LAYOUT, val)
if err != nil {
return nil, &CheckError{
Illegal: rule.Name,
}
}
return t, nil
}
}
func (i *InputContainer) GetInt(key string) int {
if res, ok := i.simpleMap[key].(int); ok {
return res
}
return 0
}
func (i *InputContainer) GetBoolean(key string) bool {
if res, ok := i.simpleMap[key].(bool); ok {
return res
}
return false
}
func (i *InputContainer) GetFloat(key string) float64 {
if res, ok := i.simpleMap[key].(float64); ok {
return res
}
return 0
}
func (i *InputContainer) GetString(key string) string {
if res, ok := i.simpleMap[key].(string); ok {
return res
}
return ""
}
func (i *InputContainer) GetArray(key string) []string {
return i.arrayMap[key]
}
func (i *InputContainer) GetObject(key string, obj interface{}) error {
bytes := i.objectMap[key]
return json.Unmarshal(bytes, obj)
}
func (i *InputContainer) GetTime(key string) time.Time {
if res, ok := i.simpleMap[key].(time.Time); ok {
return res
}
return time.Time{}
}

+ 112
- 0
src/middlewares/return_struct.go View File

@ -0,0 +1,112 @@
package middleware
import (
"github.com/astaxie/beego"
"net/http"
)
const (
S_UNKNOWN_ERROR = iota
S_OK
S_NO_RESULT
S_ILLEGAL_TOKEN
S_WRONG_INPUT
S_WRONG_EXEC_RESULT
S_TOKEN_EXPIRE
)
const (
M_OK = "success"
M_NO_RESULT = "no result"
M_ILLEGAL_TOKEN = "illegal token"
M_TOKEN_EXPIRE = "token expired"
M_ILLEGAL_SESSION = "illegal session"
M_WRONG_INPUT = "wrong input"
M_WRONG_EXEC_RESULT = "exec error"
)
type RenderStruct struct {
Status int `json:"-"`
S int `json:"s"`
M string `json:"m"`
D interface{} `json:"d"`
}
func Success(list interface{}) (r *RenderStruct) {
r = new(RenderStruct)
r.Status = http.StatusOK
r.S = S_OK
r.M = M_OK
if list == nil {
list = []interface{}{}
}
r.D = list
return
}
func EmptyErr(list interface{}) (r *RenderStruct) {
r = new(RenderStruct)
r.Status = http.StatusOK
r.S = S_NO_RESULT
r.M = M_NO_RESULT
if list == nil {
list = []interface{}{}
}
r.D = list
return
}
func InputErr(data interface{}) (r *RenderStruct) {
r = new(RenderStruct)
r.Status = http.StatusBadRequest
if data == nil {
data = []interface{}{}
}
r.S = S_WRONG_INPUT
r.M = M_WRONG_INPUT
r.D = data
if beego.BConfig.RunMode != "dev" {
r.D = []interface{}{}
}
return
}
func NormalErr(status int, s int, msg string, d interface{}) (r *RenderStruct) {
r = new(RenderStruct)
r.Status = status
r.S = s
r.M = msg
if d == nil {
d = []interface{}{}
}
r.D = d
return
}
func ServerErr(message string) (r *RenderStruct) {
r = new(RenderStruct)
r.Status = http.StatusInternalServerError
r.S = S_WRONG_EXEC_RESULT
r.M = message
if len(message) <= 0 {
r.M = M_WRONG_EXEC_RESULT
}
r.D = []interface{}{}
return
}
func TokenErr(errorType int) (r *RenderStruct) {
r = new(RenderStruct)
r.Status = http.StatusForbidden
switch errorType {
case S_TOKEN_EXPIRE:
r.S = S_TOKEN_EXPIRE
r.M = M_TOKEN_EXPIRE
default:
fallthrough
case S_ILLEGAL_TOKEN:
r.S = S_ILLEGAL_TOKEN
r.M = M_ILLEGAL_TOKEN
}
r.D = []interface{}{}
return
}

+ 65
- 0
src/models/cache.go View File

@ -0,0 +1,65 @@
package models
import (
"github.com/astaxie/beego"
"github.com/garyburd/redigo/redis"
"time"
)
var RedisPool *redis.Pool
func init() {
address := beego.AppConfig.String("redisAddress")
password := beego.AppConfig.String("redisPassword")
dbNum := beego.AppConfig.String("redisDb")
dialFunc := func() (c redis.Conn, err error) {
// c, err = redis.Dial("tcp", address)
// func DialTimeout(network, address string, connectTimeout, readTimeout, writeTimeout time.Duration) (Conn, error)
c, err = redis.DialTimeout("tcp", address, 3*time.Second, 3*time.Second, 3*time.Second)
if err != nil {
return nil, err
}
if beego.AppConfig.String("redisPassword") != "" {
if _, err := c.Do("AUTH", password); err != nil {
c.Close()
return nil, err
}
}
_, selecterr := c.Do("SELECT", dbNum)
if selecterr != nil {
c.Close()
return nil, selecterr
}
return
}
// initialize a new pool
RedisPool = &redis.Pool{
MaxIdle: 100,
MaxActive: 50,
IdleTimeout: 180 * time.Second,
Dial: dialFunc,
}
}
func SetRedis(key string, value []byte) error {
conn := RedisPool.Get()
defer conn.Close()
conn.Send("SET", key, value)
return conn.Flush()
}
func GetRedis(key string) (int64, error) {
conn := RedisPool.Get()
defer conn.Close()
ret, err := redis.Int64(conn.Do("GET", key))
return ret, err
}
func IncrRedis(key string) (int64, error) {
conn := RedisPool.Get()
defer conn.Close()
ret, err := redis.Int64(conn.Do("INCR", key))
return ret, err
}

+ 19
- 0
src/routers/router.go View File

@ -0,0 +1,19 @@
package routers
import (
"net/http"
"github.com/astaxie/beego"
. "controllers"
)
func init() {
eventController := EventController{}
namespace := beego.NewNamespace("/v1",
beego.NSRouter("/second", &eventController, "get:Second"),
beego.NSRouter("/contribution", &eventController, "post:Contribution"),
)
beego.AddNamespace(namespace)
beego.ErrorHandler("404", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusNotFound)
})
}

Loading…
Cancel
Save