cd origin
docker-compose up -d
docker-compose ps
docker exec -it mongo27018 sh
mongo
use admin
db.createUser(
{
user: "admin",
pwd: "admin",
roles: [ { role: "root", db: "admin" } ]
}
)
db.auth('admin','admin')
use weather
use profile
for(var i=100;i<=200;i++){ db.bj.insert({ username: 'zhangsan', age:Math.round(Math.random() * 100), address:Math.round(
Math.random() * 100), }); }
cd origin
go run init/main.go
-
其中init目录下 local.json 只有redis和mongodb
-
如果使用docker运行,要确保init/local.json中的 中间件 host为可访问到的地址,不能使用localhost
-
init/local.json这个配置文件会直接作用到zgo engine的配置上
-
init/all_db_local_back.json 可以复制内容到 local.json 中,有全量的中间件可以使用,具体要看docker-compose运行了多少个
local.json适合本地调试开发 8081端口,仍然使用原生的方式来连接各种db,以配置文件的方式在ECS机器上,在此以redis和mongodb为例
- 当使用local.json本地开发时,还需要在 engine/zgo.go中指定使用的中间件的key, 你可能使用一个或多个中间件
如果使用 dev.json/qa.json/pro.json/k8s.json就会使用etcd做为配置库 默认80端口,其中的数据存储格式就是init/local.json中部分的实例,
- 当然真实的 etcd中还存有其它mysql/mongo/kafka等等的配置文件
container.json仅供打包测试image时 默认是80端口
- 如果不使用etcd做为配置中心,又要docker build,那么最好的方式是使用container.json进行相应的参数变更,仅供测试image
最佳实践,如果部署到不同的k8s环境,可以使用dev/qa/pro/k8s相应的配置并修改
- 如果使用etcd-address参数,支持etcd集群,多节点用,隔开(ip:port,ip:port,ip:port); args参数中的etcd-address会覆盖dev/qa/pro/k8s.json中的etcdAddress
local.json 和 container.json 经过zgo engine时不会读取配置中心etcd中的值,仅使用.json中的配置,意味着你可以把 中间件的信息放置在这2个配置文件中,模拟存储在etcd中的配置信息
go get github.com/gogo/protobuf/protoc-gen-gofast
make proto
通过makefile,运行dockerfile,制作包含git版本的image
make image
docker run --rm -p 8081:80 -p 8181:8181 -p 50051:50051 -d --name origin rubinus/origin:v1.0
- 本机开发
go run cmd/main.go --env dev --etcd-address localhost:3379
-
本机开发最佳实践,直接修改config/local.json中 env=dev 和 etcdAddress的值
-
Docker运行时指定 env=dev etcd-address参数为配置中心etcd的地址host:port(容器可访问到的IP)
docker run --rm -p 8081:80 -p 8181:8181 -p 50051:50051 --name origin rubinus/origin:v1.0 --env=dev --etcd-address=192.168.110.173:3379
curl -l -H "Content-type: application/json" -X POST -d '{"query":"深圳市"}' "http://localhost:8081/apis/weather/v1/put"
curl -l "http://localhost:8081/apis/weather/v1/list?city=深圳市"
go run grpcclient-test/helloworld/main.go
go run grpcclient-test/weather/main.go
//前端请求接口-->main.go(Run)-->routes(视图 V 层)-->handlers(控制 C 层)-->services(逻辑 L 层)-->models(库 M 层)-->zgo.engine组件(mysql/mongo/redis/kafka)
请参照:routes对应的handlers中的 weather.go 来写接口
grpcserver 是grpc服务端实现与启动
grpchandlers 是类似与 handler 的处理grpc的handler,服务端的实现
grpcclient 是grpc客户端的连接与封装
grpcclient-test 是grpc模拟发送客户端
queue_push 是队列生产端
queue_pop 是队列消费端
git clone 这个项目后,改名成自己开发的项目名字(全局替换:origin),这是一个模板,内含有examples目录
安装docker,在本地一次性跑起redis,mongodb,mysql,nsq,kafka
- 安装ginkgo
go install github.com/onsi/ginkgo/ginkgo
cd services
ginkgo bootstrap
ginkgo generate weather
- 安装gomock
go install github.com/golang/mock/mockgen@v1.6.0
mockgen -source=weather.go -destination=mocks/weather_mock.go -package=mocks
go test -count 1 -v -cover -coverprofile=c.out ./services/...
go tool cover -html=c.out
go test -trace=t.out ./services/.
go tool trace t.out
go test -bench . -benchtime 3s -cpuprofile cpu.out ./services/.
go tool pprof cpu.out
list 函数名
go test -bench . -benchtime 3s -memprofile mem.out ./services/.
go tool pprof mem.out
list 函数名
https://graphviz.gitlab.io/_pages/Download/Download_source.html
下载graphviz-2.40.1后进入目录
./configure
make
make install
http://localhost:8181/debug/pprof/
使用pprof查看所有gorutines
go tool pprof http://localhost:8181/debug/pprof/goroutine?debug=1
使用pprof查看堆内存分配
go tool pprof http://localhost:8181/debug/pprof/heap
使用pprof查看内存分配最多的
go tool pprof http://localhost:8181/debug/pprof/allocs
top 15 -cum
使用pprof查看10秒CPU使用
go tool pprof http://localhost:8181/debug/pprof/profile?seconds=10
使用go tool trace查看trace
wget -O trace.out http://localhost:8181/debug/pprof/trace?seconds=10
go tool trace trace.out
执行完后,输入: web ,在浏览器中打开
退出输入:quit 或 q
go build -o origin cmd/main.go
go build -gcflags '-m -l' -o origin cmd/main.go
GODEBUG=scheddetail=1,schedtrace=1000,gctrace=1 ./origin
GODEBUG=scheddetail=1,schedtrace=1000,gctrace=1 go run cmd/main.go
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o origin cmd/main.go
docker build -t rubinus/origin:v1.0 .
docker push rubinus/origin:v1.0
docker pull rubinus/origin:v1.0
docker rm -f origin
docker run -d --restart always -p 8081:80 -p 50051:50051 --name origin rubinus/origin:v1.0
docker run -d --restart always -p 8081:8081 -p 50051:50051 -e SVC_HOST=192.168.100.19 -e SVC_HTTP_PORT=8081 -e SVC_GRPC_PORT=50051 --name origin1 rubinus/origin:v1.0
docker run -d --restart always -p 8082:8082 -p 50052:50051 -e SVC_HOST=192.168.100.19 -e SVC_HTTP_PORT=8082 -e SVC_GRPC_PORT=50052 --name origin2 rubinus/origin:v1.0
docker run -d --restart always -p 8081:80 -p 50051:50051 --name origin rubinus/origin:v1.0
docker run -d --restart always -p 8281:8281 -p 50051:50051 -e SVC_HOST=localhost -e SVC_HTTP_PORT=8281 -e SVC_GRPC_PORT=50051 --name origin1 rubinus/origin:v1.0
docker run -d --restart always -p 8282:8282 -p 50052:50051 -e SVC_HOST=localhost -e SVC_HTTP_PORT=8282 -e SVC_GRPC_PORT=50052 --name origin2 rubinus/origin:v1.0
docker logs -f --tail=20 origin