第六课 Go容器化微服务系统实战-性能监控能力完善
tags:
- GO
- 慕课网
categories:
- 监控系统
- Docker-compose
- promethues
第一节 监控系统介绍
1.1 promethues 基本介绍
- 它是一套开源的监控、报警、时间序列数据库的组合。
- 基本原理是通过HTTP协议周期性抓取被监控组件的状态
- 适合Docker、Kubernetes环境的监控系统
- promethues架构图

1.2 promethues重要组件
- Prometheus Server:用于收集和存储时间序列数据。
- Client Library:客户端库成相应的metrics并暴露给Prometheus server
- Push Gateway:主要用于短期的jobs
- Exporters:用于暴露已有的第三方服务的metrics 给Prometheus。比如:mysql、redis、mongo等
- Alertmanager:从 Prometheus server端接收到 alerts后,会进行去除重复,分组,并路由到对收的接受方式,发出报警。
1.3 promethues工作流程
- Prometheus server定期从配置好的jobs、exporters、Pushgateway中拉数据
- Prometheus server记录数据并且根据报警规则推送 alert 数据
- Alertmanager根据配置文件,对接收到的警报进行处理,发出告警。
- 在图形界面中,可视化采集数据
1.4 promethues相关概念
- promethue中的数据模型
- Prometheus中存储的数据为时间序列
- 格式上由metric的名字和一系列的标签(键值对)唯一标识组成
- 不同的标签则代表不同的时间序列
- metric(指标)类型
- Counter类型:一种累加的指标,如︰请求的个数,出现的错误数等
- Gauge类型:可以任意加减,如︰温度,运行的goroutines的个数
- Histogram类型:可以对观察结果采样,分组及统计,如∶柱状图
- Summary类型︰提供观测值的count和sum 功能,如:请求持续时间
- instance和jobs
- instance : 一个单独监控的目标,—般对应于一个进程。
- jobs:一组同种类型的instances (主要用于保证可扩展性和可靠性)
- grafana看板
- 拥有丰富dashboard和图表编辑的指标分析平台
- 拥有自己的权限管理和用户管理系统
- Grafana更适合用于数据可视化展示
第二节 订单领域开发环境
2.1 Docker-Compose安装使用
- 首先,使用Dockerfile定义应用程序的环境
- 其次,使用docker-compose.yml定义构成应用程序的服务
- 最后,执行docker-compose up命令来启动并运行整个应用程序
- 安装docker-compose
curl -L https://github.com/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod 777 /usr/local/bin/docker-compose
docker-compose --version
- docker-compose常用命令
# 后台运行
docker-compose up -d
# 列出项目中所有容器
docker-compose ps
# 停止和删除容器和网络
docker-compose down
- docker-compose.yml 例子。
#声明版本
version: "3"
#定义服务
services:
#服务名称,能够在同一个网络内按照名称访问
consul:
#说明采用的镜像地址
image: consul:1.6.0
#镜像对外映射的端口
ports:
- "8500:8500"
#服务名称,能够在同一个网络内按照名称访问
jaeger:
#说明采用的镜像地址
image: jaegertracing/all-in-one:latest
#镜像对外映射的端口
ports:
- "6831:6831/udp"
- "16686:16686"
#熔断看板
hystrix-dashboard:
#说明采用的镜像地址
image: mlabouardy/hystrix-dashboard
#镜像对外映射的端口
ports:
- "9002:9002"
#熔断看板
prometheus:
#说明采用的镜像地址
image: prom/prometheus
#把外部yml文件挂载到容器中
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
#熔断看板
grafana:
#说明采用的镜像地址
image: grafana/grafana
#镜像对外映射的端口
ports:
- "3000:3000"
2.2 订单领域开发目录生成
- 用上节课方法自动生成我们的目录文件。
sudo docker pull micro/micro
sudo docker run --rm -v $(pwd):$(pwd) -w $(pwd) micro/micro new order
- 新建domain文件夹,并在domain中创建model、repository、service三个文件夹。
- 删除go.mod,重新通过下面命令生成。
go mod init git.imooc.com/qnhyn/cart
go mod tidy
- 新建common文件夹。
2.3 订单领域proto开发
- proto下order文件夹下order.proto编写。
- 生成go文件。
# 生成之后看下product.pb.micro.go 用到的版本 主要要是v2(v3会在编译时报错)
protoc *.proto --gofast_out=. --micro_out=.
- 不写条件可以为空如:AllOrderRequest
syntax = "proto3";
package go.micro.service.order;
service Order {
rpc GetOrderByID(OrderID) returns (OrderInfo){}
rpc GetAllOrder(AllOrderRequest) returns (AllOrder){}
rpc CreateOrder(OrderInfo) returns (OrderID){}
rpc DeleteOrderByID(OrderID) returns (Response){}
rpc UpdateOrderPayStatus(PayStatus) returns (Response){}
rpc UpdateOrderShipStatus(ShipStatus) returns (Response){}
rpc UpdateOrder(OrderInfo) returns (Response){}
}
message AllOrderRequest {
}
message AllOrder{
repeated OrderInfo order_info = 1;
}
message OrderID {
int64 order_id = 1;
}
message OrderInfo{
int64 id = 1;
int32 pay_status =2;
int32 ship_status =3;
double price =4;
repeated OrderDetail order_detail =5;
}
message OrderDetail {
int64 id = 1;
int64 product_id =2;
int64 product_num =3;
int64 product_size_id =4;
int64 product_price =5;
int64 order_id =6;
}
message Response{
string msg = 1;
}
message PayStatus{
int64 order_id =1;
int32 pay_status =2;
}
message ShipStatus{
int64 order_id =1;
int32 ship_status =2;
}
第三节 订单领域代码开发
3.1 订单领域domain开发-model
- domain下model下order.go.
package model
import "time"
type Order struct{
ID int64 `gorm:"primary_key;not_null;auto_increment",json:"id"`
OrderCode string `gorm:"unique_index;not_null",json:"order_code"`
PayStatus int32 `json:"pay_status"`
ShipStatus int32 `json:"ship_status"`
Price float64 `json:"price"`
OrderDetail []OrderDetail `gorm:"ForeignKey:OrderID" json:"order_detail"`
CreateAt time.Time
UpdateAt time.Time
}
- domain下model下order_detail.go
package model
type OrderDetail struct {
ID int64 `grom:"primary_key;not_null;auto_increment",json:"id"`
ProductID int64 `json:"product_id"`
ProductNum int64 `json:"product_num"`
ProductSizeID int64 `json:"product_size_id"`
ProductPrice float64 `json:"product_price"`
OrderID int64 `json:"order_id"`
}
3.2 订单领域domain开发-repository
- domain下repository下order_repository.go
package repository
import (
"errors"
"github.com/jinzhu/gorm"
"git.imooc.com/qnhyn/order/domain/model"
)
type IOrderRepository interface{
InitTable() error
FindOrderByID(int64) (*model.Order, error)
CreateOrder(*model.Order) (int64, error)
DeleteOrderByID(int64) error
UpdateOrder(*model.Order) error
FindAll()([]model.Order,error)
UpdateShipStatus(int64,int32) error
UpdatePayStatus(int64,int32) error
}
//创建orderRepository
func NewOrderRepository(db *gorm.DB) IOrderRepository {
return &OrderRepository{
mysqlDb:db}
}
type OrderRepository struct {
mysqlDb *gorm.DB
}
//初始化表
func</

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



