聊聊storagetapper的server

codecraft      2022-02-13     325

关键词:

本文主要研究一下storagetapper的server

server

storagetapper/server/server.go

var server *http.Server
var mutex = sync.Mutex{}

func init() {
    http.HandleFunc("/health", healthCheck)
    http.HandleFunc("/schema", schemaCmd)
    http.HandleFunc("/cluster", clusterInfoCmd)
    http.HandleFunc("/table", tableCmd)
    http.HandleFunc("/config", configCmd)
    http.HandleFunc("/", indexCmd)
}

//StartHTTPServer starts listening and serving traffic on configured port and sets up http routes.
func StartHTTPServer(port int) {
    state.EmitRegisteredTablesCount()
    mutex.Lock()

    server = &http.Server{Addr: fmt.Sprintf(":%d", port), Handler: nil}
    log.Debugf("HTTP server is listening on %v port", port)

    mutex.Unlock()

    err := server.ListenAndServe()
    if err != nil && err != http.ErrServerClosed {
        log.E(err)
    }
}

//Shutdown gracefully stops the server
func Shutdown() {
    mutex.Lock()
    defer mutex.Unlock()
    if server == nil {
        return
    }
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()
    log.E(server.Shutdown(ctx))
    server = nil
}
storagetapper的server提供了StartHTTPServer、Shutdown方法;其init方法注册了/health/schema/cluster/table/config/这几个url

healthCheck

storagetapper/server/server.go

//healthCheck handles call to the health check endpoint
func healthCheck(w http.ResponseWriter, r *http.Request) {
    w.Header().Add("Content-Type", "text/plain")
    w.WriteHeader(http.StatusOK)
    if _, err := w.Write([]byte("OK")); err != nil {
        log.Errorf("Health check failed: %s\n", err)
    }
}
healthCheck返回200,文本内容为OK

小结

storagetapper的server提供了StartHTTPServer、Shutdown方法;其init方法注册了/health/schema/cluster/table/config/这几个url。

doc

  • storagetapper

聊聊storagetapper的pool

序本文主要研究一下storagetapper的poolThreadstoragetapper/pool/pool.gotypeThreadinterface{Start(muint,ffunc())Adjust(muint)Terminate()boolNumProcs()uint}Thread接口定义了Start、Adjust、Terminate、NumProcs方法poolstoragetap 查看详情

聊聊golang的ddd项目结构

序本文主要研究一下golang的DDD项目结构interfacesfood-app-server/interfacesinterfacesgit:(master)tree.|____fileupload||____fileformat.go||____fileupload.go|____food_handler.go|____food_handler_test.go|____handler_set 查看详情

聊聊redis是如何进行请求处理

概述首先是注册处理器;开启循环监听端口,每监听到一个连接就会创建一个Goroutine;然后就是Goroutine里面会循环的等待接收请求数据,然后根据请求的地址去处理器路由表中匹配对应的处理器,然后将请求... 查看详情

聊聊kafka:producer源码解析(代码片段)

一、前言前面几篇我们讲了关于Kafka的基础架构以及搭建,从这篇开始我们就来源码分析一波。我们这用的Kafka版本是2.7.0,其Client端是由Java实现,Server端是由Scala来实现的,在使用Kafka时,Client是用户最先接触... 查看详情

聊聊kafka:producer源码解析(代码片段)

一、前言前面几篇我们讲了关于Kafka的基础架构以及搭建,从这篇开始我们就来源码分析一波。我们这用的Kafka版本是2.7.0,其Client端是由Java实现,Server端是由Scala来实现的,在使用Kafka时,Client是用户最先接触... 查看详情

深入理解wkwebview(基础篇)——聊聊cookie管理那些事(代码片段)

????????关注后回复 “进群” ,拉你进程序员交流群????????作者丨童红明来源丨百度App技术1.前言在浏览内核加载网络资源的过程中我们离不开 HTTP协议。它是在Web上进行数据交换的基础,同时也是一种无状态的client-server... 查看详情

聊聊dbsync的schedulable

序本文主要研究一下dbsync的SchedulableSchedulable//SchedulablerepresentanabstractionthatcanbescheduletypeSchedulablestruct{URLstringIDstring*contract.SyncSchedule*contract.ScheduleStatusstringstatusuint32}//NewS 查看详情

聊聊gost的generictaskpool

序本文主要研究一下gost的GenericTaskPoolGenericTaskPoolgost/sync/task_pool.go//GenericTaskPoolrepresentsangenerictaskpool.typeGenericTaskPoolinterface{//AddTaskwaitidleworkeraddtaskAddTask(ttask)bool//AddTaskAlw 查看详情

聊聊vue中的数据代理

今天和大家聊聊Vue中的数据代理,什么是数据代理数据代理:通过一个对象代理对另外一个对象中属性的操作Object.defineProperty这个方法也是Vue数据双向绑定原理的常见面试题。今天和大家聊聊Vue中的数据代理,什么是数据代理数... 查看详情

聊聊hystrix的源码(代码片段)

聊聊Hystrix的源码今天我们说一下Hystrix的源码的内容@EnableCircuitBreaker注解需要使用Hystrix的时候,需要我们通过@EnableCircuitBreaker来开启断路器,那么我们看一下这个注解:@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inheri... 查看详情

聊聊mybatis的事务模块(代码片段)

@[TOC]聊聊Mybatis的事务模块mybatis定义了自己的事务接口来实现事务,这里同样也使用了工厂模式工厂模式中的产品Transaction接口:publicinterfaceTransactionConnectiongetConnection()throwsSQLException;voidcommit()throwsSQLException;voidrollback()throwsSQ 查看详情

聊聊go.cqrs的dispatcher

序本文主要研究一下go.cqrs的DispatcherDispatchertypeDispatcherinterface{Dispatch(CommandMessage)errorRegisterHandler(CommandHandler,...interface{})error}Dispatcher接口定义了Dispatch、RegisterHandler方法InMemoryDispatche 查看详情

聊聊基于lucene的搜索引擎核心技术实践

最近公司用到了ES搜索引擎,由于ES是基于Lucene的企业搜索引擎,无意间在“聊聊架构”微信公众号里发现了这篇文章,分享给大家。请点击链接:聊聊基于Lucene的搜索引擎核心技术实践 查看详情

聊聊mybatis的basestatementhandler的三个子类(代码片段)

@[TOC]聊聊Mybatis的BaseStatementHandler的三个子类今天我们继续聊StatementHandler的实现类PreparedStatementHandlerPreparedStatementHandler处理的是包含?占位符的sql语句,所以它需要进行参数绑定:@Overridepublicvoidparameterize(Statementstatement)thro 查看详情

聊聊hystrix

聊聊HystrixHystrix也是SpringCloud框架中的重要组件,它的功能有跳闸机制,也就是当服务的错误率超过一定的阈值的时候,Hystrix在一段时间内停止请求这个服务,它还有资源隔离的功能,也就是每个方法都可以使用一个小型的线程... 查看详情

聊聊typescript中的类型保护(代码片段)

聊聊TypeScript中的类型保护在TypeScript中使用联合类型时,往往会碰到这种尴尬的情况:interfaceBird //独有方法fly(); //共有方法layEggs();interfaceFish //独有方法swim(); //共有方法layEggs();functiongetSmallPet():Fish|Bird//...letpet=getSmallPet() 查看详情

聊聊mybatis的总体流程(代码片段)

@[TOC]聊聊Mybatis的总体流程我们前几篇文章分析了各个模块,今天我们吧这几个模块串起来,看看这些模块是怎么被Mybatis使用的我们先看一下Mybatis是怎么使用的StringconfigName="mybatis_config.xml";Readerreader=Resources.getResourceAsReader(configNam... 查看详情

聊聊mybatis的数据源之工厂模式

@[TOC]聊聊Mybatis的数据源之工厂模式工厂模式是比较简单的设计模式,Mybatis的数据源的部分使用了工厂模式工厂模式的工厂DataSourceFactory是工厂角色的接口层publicinterfaceDataSourceFactoryvoidsetProperties(Propertiesprops);DataSourcegetDataSource();... 查看详情