操作系统 : CentOS7.3.1611_x64

go语言版本:1.8.3 linux/amd64

InfluxDB版本:1.1.0

服务模块介绍

源码路径: github.com/influxdata/influxdb/services/httpd

config.go : httpd服务配置相关内容

config_test.go : 配置测试

service.go :httpd服务主程序

listen.go :对监听器进行包装,限制活动连接的数量

listen_test.go :对监听器包装的测试

handler.go : 客户端请求转发及具体的处理逻辑相关代码

handler_test.go : 处理逻辑测试代码

response_writer.go : http响应内容(支持csv、json格式)

response_logger.go :日志相关内容

该模块提供https服务、http服务、unixSocket服务

服务主要提供如下功能:

  • 查询服务器的状态
  • 统计服务器监控信息
  • 提供数据查询功能
  • 提供数据写入功能
  • 用户认证

Service结构

该结构所在文件 : service.go

主服务结构如下:

type Service struct {
ln net.Listener
addr string
https bool
cert string
key string
limit int
err chan error unixSocket bool
bindSocket string
unixSocketListener net.Listener Handler *Handler Logger *log.Logger
}

解释如下:

  • ln

tcp连接,用于提供http服务或https服务。

  • addr

tcp服务器绑定的服务地址及端口信息。 对应配置文件中的 bind-address 选项。

  • https

是否提供https服务,如果该标识为false,则提供http服务。 对应配置文件中的 https-enabled 选项。

  • cert

https证书路径,使用https时有效。 对应配置文件中的 https-certificate 选项。

  • key

https私钥,使用https时有效。 对应配置文件中的 https-private-key 选项。

  • limit

用于限制服务器最大连接数,该值为0时不限制。 对应配置文件中的 max-connection-limit 选项。

  • err

error通道,暂时不知道怎么用。

  • unixSocket

是否使用unix-socket,如果该标识为false,则不提供unix-socket服务(windows环境不适用)。 对应配置文件中的 unix-socket-enabled 选项。

  • bindSocket

unix-socket文件路径,unix-socket开启时适用。 对应配置文件中的 bind-socket 选项。

  • unixSocketListener

unix_socket连接,用于提供unix_socket服务。

  • Handler

httpd->Handler 对象

Handler结构

该结构所在文件 : handler.go

snapshotter客户端请求的数据结构如下:

// Handler represents an HTTP handler for the InfluxDB server.
type Handler struct {
mux *pat.PatternServeMux
Version string MetaClient interface {
Database(name string) *meta.DatabaseInfo
Authenticate(username, password string) (ui *meta.UserInfo, err error)
Users() []meta.UserInfo
User(username string) (*meta.UserInfo, error)
} QueryAuthorizer interface {
AuthorizeQuery(u *meta.UserInfo, query *influxql.Query, database string) error
} WriteAuthorizer interface {
AuthorizeWrite(username, database string) error
} QueryExecutor *influxql.QueryExecutor Monitor interface {
Statistics(tags map[string]string) ([]*monitor.Statistic, error)
}
PointsWriter interface {
WritePoints(database, retentionPolicy string, consistencyLevel models.ConsistencyLevel, points []models.Point) error
} Config *Config
Logger *log.Logger
CLFLogger *log.Logger
stats *Statistics
}

解释如下:

  • mux

go语言的 net/http 库的模式复用器。

  • Version

InfluxDB版本信息。

  • MetaClient

meta服务客户端接口,指向 meta.Client 结构(源码路径: influxdb/services/meta/client.go), 用于操作meta数据。

Database 函数 : 通过名字查找数据库,可用于判断数据库是否存在。

Authenticate 函数 : 认证用户信息。

Users 函数 :获取系统中所有用户的信息。

User 函数 : 获取系统中单个用户的信息。

  • QueryAuthorizer

数据查询认证接口,指向 meta.QueryAuthorizer 结构(源码路径: influxdb/services/meta/query_authorizer.go)。

AuthorizeQuery 函数 : 认证用户信息并执行数据查询操作。

  • WriteAuthorizer

数据写入认证接口,指向 meta.WriteAuthorizer 结构(源码路径: influxdb/services/meta/write_authorizer.go)。

AuthorizeWrite 函数 : 认证用户信息并执行数据写入操作。

  • QueryExecutor

查询执行器。

  • Monitor

httpd服务状态监控接口,指向 monitor.Monitor 结构(源码路径: influxdb/monitor/service.go)。

Statistics 函数 : 统计服务器监控信息。

  • PointsWriter

数据写入接口,执向 coordinator.PointsWriter 结构(源码路径: influxdb/coordinator/points_writer.go)。

WritePoints 函数 : 数据写入功能。

  • Config

httpd服务配置。

  • Logger

日志相关。

  • CLFLogger

日志相关。

  • stats

用于存储httpd服务统计信息。

limitListener结构

该结构所在文件 : listen.go

limitListener是一个监听器,它在任何给定时间都会限制活动连接的数量,当配置文件中的max-connection-limit大于0的时有效。

数据结构如下:

type limitListener struct {
net.Listener
sem chan struct{}
}

该服务在InfluxDB中的应用

该服务在InfluxDB主服务器程序(influxd)中使用,具体如下:

[root@localhost influxdb]# grep "github.com/influxdata/influxdb/services/httpd" * -rn
cmd/influxd/run/config.go:: "github.com/influxdata/influxdb/services/httpd"
cmd/influxd/run/server.go:: "github.com/influxdata/influxdb/services/httpd"
cmd/influxd/run/server_helpers_test.go:: "github.com/influxdata/influxdb/services/httpd"
services/httpd/config_test.go:: "github.com/influxdata/influxdb/services/httpd"
services/httpd/handler_test.go:: "github.com/influxdata/influxdb/services/httpd"
services/httpd/listen_test.go:: "github.com/influxdata/influxdb/services/httpd"
services/httpd/service.go::package httpd // import "github.com/influxdata/influxdb/services/httpd"
[root@localhost influxdb]#

在config中加载配置,在server中启动httpd服务。

好,就这些了,希望对你有帮助。

本文github地址:

https://github.com/mike-zhang/mikeBlogEssays/blob/master/2018/20180206_InfluxDB源码阅读之httpd服务.rst

欢迎补充

InfluxDB源码阅读之httpd服务的更多相关文章

  1. InfluxDB源码阅读之snapshotter服务

    操作系统 : CentOS7.3.1611_x64 go语言版本:1.8.3 linux/amd64 InfluxDB版本:1.1.0 服务模块介绍 源码路径: github.com/influxda ...

  2. [源码阅读] 阿里SOFA服务注册中心MetaServer(1)

    [源码阅读] 阿里SOFA服务注册中心MetaServer(1) 目录 [源码阅读] 阿里SOFA服务注册中心MetaServer(1) 0x00 摘要 0x01 服务注册中心 1.1 服务注册中心简 ...

  3. [源码阅读] 阿里SOFA服务注册中心MetaServer(2)

    [源码阅读] 阿里SOFA服务注册中心MetaServer(2) 目录 [源码阅读] 阿里SOFA服务注册中心MetaServer(2) 0x00 摘要 0x01 MetaServer 注册 1.1 ...

  4. [源码阅读] 阿里SOFA服务注册中心MetaServer(3)

    [源码阅读] 阿里SOFA服务注册中心MetaServer(3) 目录 [源码阅读] 阿里SOFA服务注册中心MetaServer(3) 0x00 摘要 0x01 概念 1.1 分布式一致性 1.2 ...

  5. 【Dubbo源码阅读系列】服务暴露之远程暴露

    引言 什么叫 远程暴露 ?试着想象着这么一种场景:假设我们新增了一台服务器 A,专门用于发送短信提示给指定用户.那么问题来了,我们的 Message 服务上线之后,应该如何告知调用方服务器,服务器 A ...

  6. 【Dubbo源码阅读系列】服务暴露之本地暴露

    在上一篇文章中我们介绍 Dubbo 自定义标签解析相关内容,其中我们自定义的 XML 标签 <dubbo:service /> 会被解析为 ServiceBean 对象(传送门:Dubbo ...

  7. xxl-job源码阅读二(服务端)

    1.源码入口 xxl-job-admin是一个简单的springboot工程,简单翻看源码,可以很快发现XxlJobAdminConfig入口. @Override public void after ...

  8. Centos7源码部署apache/httpd服务

    httpd:是一个提供网站服务的程序 监听端口:80 环境准备: Linux CentOS7.3系统 使用一台服务端,一台客户端即可: 一.安装httpd 1:安装 [root@localhost ~ ...

  9. Spark源码阅读之存储体系--存储体系概述与shuffle服务

    一.概述 根据<深入理解Spark:核心思想与源码分析>一书,结合最新的spark源代码master分支进行源码阅读,对新版本的代码加上自己的一些理解,如有错误,希望指出. 1.块管理器B ...

随机推荐

  1. HDU 1796 How many integers can you find 【容斥】

    <题目链接> 题目大意: 给你m个数,其中可能含有0,问有多少小于n的正数能整除这个m个数中的某一个. 解题分析: 容斥水题,直接对这m个数(除0以外)及其组合的倍数在[1,n)中的个数即 ...

  2. 深入理解JS防抖与节流

    参考博客:JS防抖和节流,感谢作者的用心分享 日常开发过程中,滚动事件做复杂计算频繁调用回调函数很可能会造成页面的卡顿,这时候我们更希望把多次计算合并成一次,只操作一个精确点,JS把这种方式称为deb ...

  3. 数据结构之二叉搜索树、AVL自平衡树

    前言 最近在帮公司校招~~ 所以来整理一些数据结构方面的知识,这些知识呢,光看一遍理解还是很浅的,看过跟动手做过一遍的同学还是很容易分辨的哟~ 一直觉得数据结构跟算法,就好比金庸小说里的<九阳神 ...

  4. Mybatis之注解实现动态sql

    通过注解实现动态sql一共需要三部:1.创建表,2.创建entity类,3.创建mapper类, 4.创建动态sql的Provider类.1.和2.可以参见该系列其他文章,这里主要对3和4进行演示,并 ...

  5. PAT (Advanced Level) Practise 1003 解题报告

    GitHub markdownPDF 问题描述 解题思路 代码 提交记录 问题描述 Emergency (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题 ...

  6. jquery,underscore,lodash那些事儿

    一.参考链接 https://jquery.com/ https://en.wikipedia.org/wiki/JQuery https://developer.mozilla.org/zh-CN/ ...

  7. java 实验 三 (1)

    (1)金字塔:Pyramid.java在屏幕上显示一个由星型符号“*”组成的金字塔图案,要求用户设置金字塔的高度,程序能根据用户设置的高度打印金字塔,示例如下: * ******** package ...

  8. 潭州课堂25班:Ph201805201 django 项目 第二十七课 docker简介,配置文件 (课堂笔记)

    新闻搜索功能实现 一.docker介绍 1.什么是docker? 使用容器让创建.部署.运行应用程序更简单的一个工具 让应用所需的库和依赖环境打包 有一点点像虚拟机 2.为什么使用docker? 3. ...

  9. .net 相关性能计数器丢失问题解决方案

    1.开始运行:cmd 2.在cmd窗口中执行下面命令: cd c:\windows\system32 lodctr /R 执行完上面命令,会提示:“信息: 成功地从系统备份存储中重建性能计数器设置” ...

  10. egret获取本周,上周,今天,昨天,明天,现在时间,今年,本月

    class TimerShow extends egret.DisplayObjectContainer{ private now = new Date(); //当前日期 private nowDa ...