Documentation ¶
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Aggregator ¶
type Aggregator struct{}
Aggregator 是一个工具类,目前只有一个方法,几十行左右的代码量,负责各种统计数据的计算。 当需要扩展新的统计功能时,要修改 aggregate() 方法的代码,并且一旦越来越多的统计功能添加进来之后, 这个函数的代码量会持续增加,可读性、可维护性就变差了。 这个类的设计存在职责不够单一、不易扩展等问题,需要在之后的版本中,对其结构做优化。
func NewAggregator ¶
func NewAggregator() *Aggregator
func (*Aggregator) Aggregate ¶
func (a *Aggregator) Aggregate(requestInfos []RequestInfo, duration time.Duration) *RequestStat
Aggregate 根据原始数据,计算得到统计数据
type ConsoleReporter ¶
type ConsoleReporter struct {
// contains filtered or unexported fields
}
ConsoleReporter 和 EmailReporter 中存在代码重复问题。 在这两个类中,从数据库中取数据、做统计的逻辑都是相同的,可以抽取出来复用,否则就违反了 DRY 原则。 而且整个类负责的事情比较多,职责不是太单一。特别是显示部分的代码,可能会比较复杂(比如 Email 的展示方式), 最好是将显示部分的代码逻辑拆分成独立的类。除此之外,因为代码中涉及线程操作, 并且调用了 Aggregator 的方法,所以代码的可测试性不好。
func NewConsoleReporter ¶
func NewConsoleReporter(metricsStorage MetricsStorage, aggregator *Aggregator) *ConsoleReporter
func (*ConsoleReporter) StartRepeatedReport ¶
func (r *ConsoleReporter) StartRepeatedReport(period, duration time.Duration)
type EmailReporter ¶
type EmailReporter struct {
// contains filtered or unexported fields
}
func NewEmailReporter ¶
func NewEmailReporter(metricsStorage MetricsStorage, aggregator *Aggregator) *EmailReporter
func (*EmailReporter) AddToAddress ¶
func (r *EmailReporter) AddToAddress(addr ...string)
func (*EmailReporter) StartDailyReport ¶
func (r *EmailReporter) StartDailyReport()
type EmailSender ¶
type EmailSender struct {
// contains filtered or unexported fields
}
func NewEmailSender ¶
func NewEmailSender(smtpAddr string) *EmailSender
func (*EmailSender) AddReceiver ¶
func (s *EmailSender) AddReceiver(receiver ...string)
func (*EmailSender) SendMail ¶
func (s *EmailSender) SendMail(msg []byte) error
type Metrics ¶
type Metrics struct {
// contains filtered or unexported fields
}
func (*Metrics) RecordResponseTime ¶
RecordResponseTime 记录接口请求的响应时间
func (*Metrics) RecordTimestamp ¶
RecordTimestamp 记录接口请求的访问时间
type MetricsCollector ¶
type MetricsCollector struct {
// contains filtered or unexported fields
}
MetricsCollector 负责采集和存储数据,职责相对来说比较单一。 它基于接口而非实现编程,通过依赖注入的方式来传递 MetricsStorage 对象, 可以在不需要修改代码的情况下,灵活地替换不同的存储方式,满足开闭原则。
func NewMetricsCollector ¶
func NewMetricsCollector(metricsStorage MetricsStorage) *MetricsCollector
NewMetricsCollector 依赖注入的方式新建 collector
func (*MetricsCollector) RecordRequest ¶
func (c *MetricsCollector) RecordRequest(info *RequestInfo)
RecordRequest 用一个方法替代 MVP 中的两个方法
type MetricsStorage ¶
type MetricsStorage interface { SaveRequestInfo(info *RequestInfo) GetRequestInfo(apiName string, startTime, endTime time.Time) []RequestInfo GetRequestInfos(startTime, endTime time.Time) map[string][]RequestInfo }
MetricsStorage 和 RedisMetricsStorage 的设计比较简单。 需要实现新的存储方式的时候,只需要实现 MetricsStorage 接口即可。 因为所有用到 MetricsStorage 和 RedisMetricsStorage 的地方, 都是基于相同的接口函数来编程的,所以, 除了在组装类的地方有所改动(从 RedisMetricsStorage 改为新的存储实现类), 其他接口函数调用的地方都不需要改动,满足开闭原则。
type RedisMetricsStorage ¶
type RedisMetricsStorage struct{}
func NewRedisMetricsStorage ¶
func NewRedisMetricsStorage() *RedisMetricsStorage
func (*RedisMetricsStorage) GetRequestInfo ¶
func (r *RedisMetricsStorage) GetRequestInfo(apiName string, startTime, endTime time.Time) []RequestInfo
func (*RedisMetricsStorage) GetRequestInfos ¶
func (r *RedisMetricsStorage) GetRequestInfos(startTime, endTime time.Time) map[string][]RequestInfo
func (*RedisMetricsStorage) SaveRequestInfo ¶
func (r *RedisMetricsStorage) SaveRequestInfo(info *RequestInfo)
type RequestInfo ¶
type RequestInfo struct {
// contains filtered or unexported fields
}
func NewRequestInfo ¶
func NewRequestInfo(apiName string, responseTime time.Duration, timestamp int64) *RequestInfo
func (*RequestInfo) ApiName ¶
func (r *RequestInfo) ApiName() string
func (*RequestInfo) ResponseTime ¶
func (r *RequestInfo) ResponseTime() time.Duration
func (*RequestInfo) SetApiName ¶
func (r *RequestInfo) SetApiName(apiName string)
func (*RequestInfo) SetResponseTime ¶
func (r *RequestInfo) SetResponseTime(responseTime time.Duration)
func (*RequestInfo) SetTimestamp ¶
func (r *RequestInfo) SetTimestamp(timestamp int64)
func (*RequestInfo) Timestamp ¶
func (r *RequestInfo) Timestamp() int64
type RequestStat ¶
type UserController ¶
type UserController struct {
Metric
}
func NewUserController ¶
func NewUserController(metric Metric) *UserController
func (*UserController) Login ¶
func (c *UserController) Login(telephone, password string)
func (*UserController) Register ¶
func (c *UserController) Register(user UserVO)