|
|
|
|
|
|
08 2017 档案
server.go 源码阅读
摘要:package pingoimport ( "bufio" "bytes" "flag" "fmt" "io" "math/rand" "net" "net/rpc" "os" "path" "path/filepath" "reflect" "strings" "time")// Register a new o..
阅读全文
pingo--util.go 源码阅读
摘要:package pingoimport ( "fmt" "math/rand" "strings")type meta string //定义 自定义数据类型//输出包含自身在内的参数字符串func (h meta) output(key, val string) { fmt.Printf("%s: %s: %s\n", string(h), key, val)}fun...
阅读全文
error.go源码笔记
摘要:package pingoimport ( "errors" "strings")const ( errorCodeConnFailed = "err-connection-failed" errorCodeHttpServe = "err-http-serve")// Error reported when connection to the external plug...
阅读全文
req_params.go
摘要:package http_apiimport ( "fmt" "log" "net" "net/http" "strings" "github.com/nsqio/nsq/internal/app")type logWriter struct { app.Logger}func (l logWriter) Write(p []byte) (int, err...
阅读全文
top_channel_args.go
摘要:package http_apiimport ( "fmt" "log" "net" "net/http" "strings" "github.com/nsqio/nsq/internal/app")type logWriter struct { app.Logger}func (l logWriter) Write(p []byte) (int, err...
阅读全文
authorizations.go
摘要:package authimport ( "errors" "fmt" "log" "net/url" "regexp" "time" "github.com/nsqio/nsq/internal/http_api")type Authorization struct { Topic string `json:"topic"` ...
阅读全文
http_server.go
摘要:package http_apiimport ( "fmt" "log" "net" "net/http" "strings" "github.com/nsqio/nsq/internal/app")type logWriter struct { app.Logger}func (l logWriter) Write(p []byte) (int, err...
阅读全文
compress.go
摘要:// Copyright 2013 The Gorilla Authors. All rights reserved.// Use of this source code is governed by a BSD-style// license that can be found in the LICENSE file.// copied from https://github.com/goril...
阅读全文
api_response.go
摘要:package http_apiimport ( "encoding/json" "fmt" "io" "net/http" "time" "github.com/julienschmidt/httprouter" "github.com/nsqio/nsq/internal/app")type Decorator func(APIHandler) API...
阅读全文
api_request.go
摘要:package http_apiimport ( "crypto/tls" "encoding/json" "fmt" "io/ioutil" "net" "net/http" "net/url" "strconv" "strings" "time")type deadlinedConn struct { Timeout time....
阅读全文
logger.go
摘要:package app//日志接口type Logger interface { Output(maxdepth int, s string) error}
阅读全文
string_array.go
摘要:package appimport ( "strings")type StringArray []stringfunc (a *StringArray) Set(s string) error { *a = append(*a, s) return nil}func (a *StringArray) String() string { return strings.Join...
阅读全文
float_array.go
摘要:package appimport ( "fmt" "log" "sort" "strconv" "strings")//这个文件相关的代码不需要解释了吧!!!type FloatArray []float64func (a *FloatArray) Set(param string) error { for _, s := range strings.Spli...
阅读全文
types.go
摘要:package clusterinfoimport ( "encoding/json" "fmt" "sort" "strings" "time" "github.com/blang/semver" "github.com/nsqio/nsq/internal/quantile")type ProducerTopic struct { Topic ...
阅读全文
data.go
摘要:package clusterinfoimport ( "fmt" "net" "net/url" "sort" "strconv" "strings" "sync" "github.com/blang/semver" "github.com/nsqio/nsq/internal/http_api" "github.com/nsqio/n...
阅读全文
dirlock_windows.go
摘要:package dirlocktype DirLock struct { dir string}func New(dir string) *DirLock { return &DirLock{ dir: dir, }}func (l *DirLock) Lock() error { return nil}func (l *DirLock) Unlock() e...
阅读全文
tcp.go
摘要:package nsqdimport ( "io" "net" "github.com/nsqio/nsq/internal/protocol")type tcpServer struct { ctx *context}func (p *tcpServer) Handle(clientConn net.Conn) { p.ctx.nsqd.logf("TCP: new...
阅读全文
dirlock.go
摘要:// +build !windowspackage dirlockimport ( "fmt" "os" "syscall")type DirLock struct { dir string f *os.File}func New(dir string) *DirLock { return &DirLock{ dir: dir, }}fu...
阅读全文
statsd.go
摘要:package nsqdimport ( "fmt" "math" "runtime" "sort" "time" "github.com/nsqio/nsq/internal/statsd")type Uint64Slice []uint64func (s Uint64Slice) Len() int { return len(s)}func (s Ui...
阅读全文
stats.go
摘要:package nsqdimport ( "sort" "sync/atomic" "github.com/nsqio/nsq/internal/quantile")type TopicStats struct { TopicName string `json:"topic_name"` Channels []ChannelStats `...
阅读全文
rename.go
摘要:package nsqdimport ( "syscall" "unsafe")var ( modkernel32 = syscall.NewLazyDLL("kernel32.dll") procMoveFileExW = modkernel32.NewProc("MoveFileExW"))const ( MOVEFILE_REPLACE_EXISTING...
阅读全文
rename_windows.go
摘要:package nsqdimport ( "syscall" "unsafe")var ( modkernel32 = syscall.NewLazyDLL("kernel32.dll") procMoveFileExW = modkernel32.NewProc("MoveFileExW"))const ( MOVEFILE_REPLACE_EXISTING...
阅读全文
protocol_v2.go
摘要:package nsqdimport ( "bytes" "encoding/binary" "encoding/json" "errors" "fmt" "io" "math" "math/rand" "net" "sync/atomic" "time" "unsafe" "github.com/nsqio/nsq/i...
阅读全文
nsqd.go
摘要:package nsqdimport ( "crypto/tls" "crypto/x509" "encoding/json" "errors" "fmt" "io/ioutil" "math/rand" "net" "os" "path" "runtime" "strings" "sync" "sync/atom...
阅读全文
options.go
摘要:package nsqdimport ( "crypto/md5" "crypto/tls" "hash/crc32" "io" "log" "os" "time")type Options struct { // basic options ID int64 `flag:"worke...
阅读全文
lookup_peer.go
摘要:package nsqdimport ( "encoding/binary" "fmt" "io" "net" "time" "github.com/nsqio/go-nsq")// lookupPeer is a low-level type for connecting/reading/writing to nsqlookupd//// A lookupPe...
阅读全文
message.go
摘要:package nsqdimport ( "bytes" "encoding/binary" "fmt" "io" "time")const ( MsgIDLength = 16 minValidMsgLength = MsgIDLength + 8 + 2 // Timestamp + Attempts)type MessageID [Msg...
阅读全文
lookup.go
摘要:package nsqdimport ( "bytes" "encoding/json" "net" "os" "strconv" "time" "github.com/nsqio/go-nsq" "github.com/nsqio/nsq/internal/version")func connectCallback(n *NSQD, hostnam...
阅读全文
http.go
摘要:package nsqdimport ( "bufio" "bytes" "encoding/json" "fmt" "io" "io/ioutil" "net" "net/http" "net/http/pprof" "net/url" "os" "reflect" "runtime" "strconv" ...
阅读全文
in_flight_pqueue.go
摘要:package nsqdtype inFlightPqueue []*Messagefunc newInFlightPqueue(capacity int) inFlightPqueue { return make(inFlightPqueue, 0, capacity)}func (pq inFlightPqueue) Swap(i, j int) { pq[i], pq[j] = ...
阅读全文
logger.go
摘要:package nsqdtype Logger interface { Output(maxdepth int, s string) error}
阅读全文
guid.go
摘要:package nsqd// the core algorithm here was borrowed from:// Blake Mizerany's `noeqd` https://github.com/bmizerany/noeqd// and indirectly:// Twitter's `snowflake` https://github.com/twitter/snowflake//...
阅读全文
dummy_backend_queue.go
摘要:package nsqdtype dummyBackendQueue struct { readChan chan []byte}func newDummyBackendQueue() BackendQueue { return &dummyBackendQueue{readChan: make(chan []byte)}}func (d *dummyBackendQueue) Put...
阅读全文
dqname_widnows.go
摘要:package nsqd// On Windows, file names cannot contain colons.func getBackendName(topicName, channelName string) string { // backend names, for uniqueness, automatically include the topic... ; bac...
阅读全文
diskqueue.go
摘要:package nsqdimport ( "bufio" "bytes" "encoding/binary" "errors" "fmt" "io" "math/rand" "os" "path" "sync" "sync/atomic" "time")// diskQueue implements the BackendQu...
阅读全文
dqname.go
摘要:package nsqdfunc getBackendName(topicName, channelName string) string { // backend names, for uniqueness, automatically include the topic... : backendName := topicName + ":" + channelName ret...
阅读全文
context.go
摘要:package nsqdtype context struct { nsqd *NSQD}
阅读全文
client_v2.go
摘要:package nsqdimport ( "bufio" "compress/flate" "crypto/tls" "fmt" "net" "sync" "sync/atomic" "time" "github.com/mreiferson/go-snappystream" "github.com/nsqio/nsq/internal/...
阅读全文
buffer_pool.go
摘要:package nsqdimport ( "bytes" "sync")var bp sync.Poolfunc init() { bp.New = func() interface{} { return &bytes.Buffer{} }}func bufferPoolGet() *bytes.Buffer { return bp.Get().(*by...
阅读全文
channel.go
摘要:package nsqdimport ( "bytes" "container/heap" "errors" "math" "strings" "sync" "sync/atomic" "time" "github.com/nsqio/nsq/internal/pqueue" "github.com/nsqio/nsq/internal/...
阅读全文
backend_queue.go
摘要:package nsqd// BackendQueue represents the behavior for the secondary message// storage systemtype BackendQueue interface { Put([]byte) error ReadChan() chan []byte // this is expected to be an ...
阅读全文
http.go
摘要:package nsqlookupdimport ( "fmt" "net/http" "net/http/pprof" "sync/atomic" "github.com/julienschmidt/httprouter" "github.com/nsqio/nsq/internal/http_api" "github.com/nsqio/nsq/int...
阅读全文
nsqlookup_protocol_v1.go
摘要:package nsqlookupdimport ( "bufio" "encoding/binary" "encoding/json" "fmt" "io" "log" "net" "os" "strings" "sync/atomic" "time" "github.com/nsqio/nsq/internal/proto...
阅读全文
tcp.go
摘要:package nsqlookupdimport ( "io" "net" "github.com/nsqio/nsq/internal/protocol")type tcpServer struct { ctx *Context}func (p *tcpServer) Handle(clientConn net.Conn) { p.ctx.nsqlookupd.lo...
阅读全文
nsqlookupd.go
摘要:package nsqlookupdimport ( "fmt" "net" "os" "sync" "github.com/nsqio/nsq/internal/http_api" "github.com/nsqio/nsq/internal/protocol" "github.com/nsqio/nsq/internal/util" "githu...
阅读全文
registration_db.go
摘要:package nsqlookupdimport ( "fmt" "sync" "sync/atomic" "time")//db(注册中心--内存数据库map)结构体type RegistrationDB struct { sync.RWMutex //读写锁 registrationMap map[Registration]Producers //}//代...
阅读全文
logger.go
摘要:package nsqlookupd//日志结构type Logger interface { Output(maxdepth int, s string) error}
阅读全文
options.go
摘要:package nsqlookupdimport ( "log" "os" "time")//记录nsqd配置信息type Options struct { Verbose bool `flag:"verbose"` //开启日志信息 TCPAddress string `flag:"tcp-address"` //tcp地址 HTTPAddres...
阅读全文
context.go
摘要:package nsqlookupd//上下文接口type Context struct { nsqlookupd *NSQLookupd //本次协成上下文所包含的信息结构体}
阅读全文
client_v1.go
摘要:package nsqlookupdimport ( "net")//客户端 结构体type ClientV1 struct { net.Conn //客户端连接 peerInfo *PeerInfo //服务端信息结构体}func NewClientV1(conn net.Conn) *ClientV1 { return &ClientV1{ Con...
阅读全文
NSQ源码剖析之nsqd
摘要:NSQ简介NSQ 是实时的分布式消息处理平台,其设计的目的是用来大规模地处理每天数以十亿计级别的消息。NSQ 具有分布式和去中心化拓扑结构,该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征,是一个成熟的、已在大规模生成环境下应用的产品。NSQ 由 3 个守护进程组成: nsqd 是接收、保存和传送消息到客户端的守护进程。 nsqlookupd 是管理的拓扑信息,维护着所有n...
阅读全文
golang使用Nsq
摘要:为什么要使用Nsq最近一直在寻找一个高性能,高可用的消息队列做内部服务之间的通讯。一开始想到用zeromq,但在查找资料的过程中,意外的发现了Nsq这个由golang开发的消息队列,毕竟是golang原汁原味的东西,功能齐全,关键是性能还不错。其中支持动态拓展,消除单点故障等特性, 都可以很好的满足我的需求下面上一张Nsq与其他mq的对比图,看上去的确强大。下面简单记录一下Nsq的使用方法图片来...
阅读全文
nsq源码阅读笔记之nsqd(四)——Channel
摘要:与Channel相关的代码主要位于nsqd/channel.go, nsqd/nsqd.go中。Channel与Topic的关系Channel是消费者订阅特定Topic的一种抽象。对于发往Topic的消息,nsqd向该Topic下的所有Channel投递消息,而同一个Channel只投递一次,Channel下如果存在多个消费者,则随机选择一个消费者做投递。这种投递方式可以被用作消费者负载均衡。Ch...
阅读全文
nsq源码阅读笔记之nsqd(二)——Topic
摘要:与Topic相关的代码主要位于nsqd/nsqd.go, nsqd/topic.go中。Topic的获取Topic通过GetTopic函数获取GetTopic函数用于获取topic对象,首先先尝试从topicMap表中获取,如果指定的topic存在,则直接返回topic对象。当topic不存在时需要新建一个topic,加入到topicMap中, 如果启用了nsqlookupd则需要从lookupd...
阅读全文
nsq源码阅读笔记之nsqd(三)——diskQueue
摘要:diskQueue是backendQueue接口的一个实现。backendQueue的作用是在实现在内存go channel缓冲区满的情况下对消息的处理的对象。 除了diskQueue外还有dummyBackendQueue实现了backendQueue接口。对于临时(#ephemeral结尾)Topic/Channel,在创建时会使用dummyBackendQueue初始化backend, du...
阅读全文
nsq topic和channel的区别
摘要:topic:一个可供订阅的话题。channel:属于topic的下一级,一个topic可以有多个channel。二者关系可以再参考下面两文章:http://www.cnblogs.com/forrestsun/p/3892710.htmlhttp://www.linuxeden.com/html/news/20140301/148960.html举个例子:topic:比做一个广播,如交通广播。打开...
阅读全文
nsq源码阅读笔记之nsqd(一)——nsqd的配置解析和初始化
摘要:配置解析nsqd的主函数位于apps/nsqd.go中的main函数首先main函数调用nsqFlagset和Parse进行命令行参数集初始化, 然后判断version参数是否存在,若存在,则打印版本号并退出程序接下来钩住系统的syscall.SIGINT和syscall.SIGTERM消息,用来阻塞主goroutine防止退出随后判断config参数是否存在,若存在的话还需进行配置文件的读取, ...
阅读全文
go语言nsq源码解读九 tcp和http中channel、topic的增删
摘要:通过前面多篇文章,nsqlookupd基本已经解读完毕了,不过在关于channel和topic的增删上还比较模糊,所以本篇将站在宏观的角度来总结一下,tcp.go和http.go两个文件中关于channel和topic的操作有哪些。总结如下表:模块文件所在方法名调用方法RegistrationCategoryKeySubKeyTCPlookup_protocol_v1.goREGISTERAddP...
阅读全文
go语言nsq源码解读八 http.go、http_server.go
摘要:这篇讲另两个文件http.go、http_server.go,这两个文件和第六讲go语言nsq源码解读六 tcp.go、tcp_server.go里的两个文件是相对应的。那两个文件用于处理tcp请求,而这两个是处理http请求的。http_sesrver.go123456789101112131415161718192021222324package utilimport ( "log" ...
阅读全文
go语言nsq源码解读七 lookup_protocol_v1.go
摘要:本篇将解读nsqlookup处理tcp请求的核心代码文件lookup_protocol_v1.go。123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798...
阅读全文
go语言nsq源码解读六 tcp.go、tcp_server.go
摘要:本篇讲nsqlookupd中tcp.go、tcp_server.gotcp_server.go位于util目录下。123456789101112131415161718192021222324252627282930313233343536373839package util import ( "log" "net" "runtime" "strings")ty...
阅读全文
go语言nsq源码解读五 nsqlookupd源码registration_db.go
摘要:本篇将讲解registration_db.go文件。123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919...
阅读全文
go语言 nsq源码解读四 nsqlookupd源码options.go、context.go和wait_group_wrapper.go
摘要:本节会解读nsqlookupd.go文件中涉及到的其中三个文件:options.go、context.go和wait_group_wrapper.go。options.go1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253package nsqlookup...
阅读全文
go语言nsq源码解读二 nsqlookupd、nsqd与nsqadmin
摘要:nsqlookupd:官方文档解释见:http://bitly.github.io/nsq/components/nsqlookupd.html用官方话来讲是:nsqlookupd管理拓扑信息,客户端根据特定的topic查询nsqlookupd来发现nsqd生产者及nsqd广播topic和channel信息。比较难懂,所以接下来,用通俗的话来解释。首先讲点别的东西,用过linux的同学可能会发现,...
阅读全文
go语言 nsq源码解读三 nsqlookupd源码nsqlookupd.go
摘要:从本节开始,将逐步阅读nsq各模块的代码。读一份代码,我的思路一般是:1、了解用法,知道了怎么使用,对理解代码有宏观上有很大帮助。2、了解各大模块的功能特点,同时再想想,如果让自己来实现这些模块,会是怎么样的思路。3、开始上手试读,为不打击阅读的积极性,可以选择一个简单的模块,或者某一个功能点开始读。对nsq而言,打开源码的目录看一下,发现nsqlookupd和nsqadmin的代码相对较少,而n...
阅读全文
go语言nsq源码解读一-基本介绍
摘要:简单介绍一下nsq.参考 http://feilong.me/2013/05/nsq-realtime-message-processing-system 的介绍:NSQ是由知名短链接服务商bitly用Go语言开发的实时消息处理系统,具有高性能、高可靠、无视单点故障等优点,是一个非常不错的新兴的消息队列解决方案。nsq易于配置和部署,所有参考都通过命令行指定,编译好的二进制文件,没有其它依赖项。而...
阅读全文
Grafana简单使用
摘要:下载安装Grafana也是用GO语言写的,无任何依赖,安装非常简单。启动sudo service grafana-server start 运行直接访问:http://your_ip:3000登入默认帐号:admin默认密码:admin添加数据库在Data Sources中添加数据库testDB其中user和password,如果没有设置过,可以随便填下。保存之后,可以通过Test Connect...
阅读全文
数据展示工具
摘要:数据最终是需要一套UI来展示的,而这种实时数据的展示,已经有不少项目了。 比如:+官方的ChronografGrafana其它...
阅读全文
第三方库API接口
摘要:第三方库API接口InfluxDB提供了各种语言的Http API接口的封装。具体可以看这里:https://docs.influxdata.com/influxdb/v0.10/clients/api/+同时,官方也提供了Telegraf插件来收集数据,除此之外还有collectd等比较常用的第三方数据收集工具。我并不推荐一开始就用各种工具,这样会淡化对InfluxDB的理解。当然,如果你本身对...
阅读全文
连续查询(Continuous Queries)
摘要:当数据超过保存策略里指定的时间之后,就会被删除。如果我们不想完全删除掉,比如做一个数据统计采样:把原先每秒的数据,存为每小时的数据,让数据占用的空间大大减少(以降低精度为代价)。这就需要InfluxDB提供的:连续查询(Continuous Queries)。当前数据库的Continuous Queries# 这条命令得在命令行下输入,在web管理界面不能显示。 SHOW CONTINUOUS Q...
阅读全文
用户管理
摘要:用户管理以下语句都可以直接在InfluxDB的Web管理界面中调用# 显示用户 SHOW USERS # 创建用户 CREATE USER "username" WITH PASSWORD 'password'# 创建管理员权限的用户 CREATE USER "username" WITH PASSWORD 'password' WITH ALL PRIVILEGES # 删除用户 DROP U...
阅读全文
数据保存策略(Retention Policies)
摘要:数据保存策略(Retention Policies)InfluxDB没有提供直接删除Points的方法,但是它提供了Retention Policies。主要用于指定数据的保留时间:当数据超过了指定的时间之后,就会被删除。查看当前数据库的Retention PoliciesSHOW RETENTION POLICIES ON "testDB"创建新的Retention PoliciesCREATE...
阅读全文
数据库与表的操作
摘要:以下语句都可以直接在InfluxDB的Web管理界面中调用+# 创建数据库 CREATE DATABASE "db_name"# 显示所有数据库 SHOW DATABASES # 删除数据库 DROP DATABASE "db_name"# 使用数据库 USE mydb # 显示该数据库中的表 SHOW MEASUREMENTS # 创建表# 直接在插入数据的时候指定表名(weather就是表...
阅读全文
查
摘要:本节将演示下查询数据的一些常用方法。+通过命令行use testDB # 查询最新的三条数据 SELECT * FROM weather ORDER BY time DESC LIMIT 3通过Http接口curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=testDB" --data-urlencode "...
阅读全文
增
摘要:增在名词解释这一章节中,我们看到在weather中的有不少数据。本节将演示下如何为数据库插入数据。通过命令行use testDB insert weather,altitude=1000,area=北 temperature=11,humidity=-4这样,我们就向数据库中添加了一条数据。通过Http接口InfluxDB提供了Http的API接口,所以我们也可以通过下面的方式来插入数据。+cur...
阅读全文
删与改
摘要:在InfluxDB中并没有提供数据的删除与修改方法。不过我们可以通过数据保存策略(Retention Policies)来实现删除。具体请看:数据保存策略(Retention Policies)这一章节。
阅读全文
名词解释
摘要:在上一个章节中,已经建立了一个名为testDB的数据库。在之后的演示中,都将在这个数据库上操作。在InfluxDB中有不少名词,初学者非常容易搞混,这一节主要就是对这些名词进行解释。场景定义我们有一个数据库名为testDB,里面有一张表weather用于记录:多个地区在几组海拔下的一天的温度变化,所以表中有以下字段:时间 time温度 temperature湿度 humidity地区 area海拔...
阅读全文
基本操作
摘要:本章将介绍InfluxDB中的一些基本操作,包括数据的增删改查、数据库与表的操作等。
阅读全文
安装使用
摘要:下载地址直接官网下载就好,非常简单。https://influxdata.com/downloads/#influxdb安装sudo dpkg -i influxdbName.deb 启动sudo service influxdb start 使用启动成功之后,我们就可以开始使用influxDB啦!命令行在命令行中直接输入influx,就可以管理数据库了。root@xtutu:~# influx ...
阅读全文
InfluxDB介绍
摘要:InfluxDB介绍InfluxDB用Go语言编写的一个开源分布式时序、事件和指标数据库,和传统是数据库相比有不少不同的地方。类似的数据库有Elasticsearch、Graphite等。特点提供了Http接口的API来操作数据提供了类似sql的数据库语句其它...用途一般用来储存实时数据,配合一套UI界面来展示信息。
阅读全文
proxy.go
摘要:package mainimport ( "net" "time")// 初始化代理服务func initProxy() { Log.Infof("Proxying %s -> %s\n", Config.Bind, Config.Backend) server, err := net.Listen("tcp", Config.Bind) if err != nil ...
阅读全文
balancer.go
摘要:package mainimport ( "math/rand" "net" "time" "stathat.com/c/consistent")// 代理服务的结构type BackendSvr struct { identify string //代理服务器地址 isLive bool // 服务是否存活 failTimes int //失败...
阅读全文
monitor.go
摘要:package mainimport ( "fmt" "net/http")// 查询监控信息的接口func statsHandler(w http.ResponseWriter, r *http.Request) { _str := "" for _, v := range BackendSvrs { _str += fmt.Sprintf("Server:...
阅读全文
log.go
摘要:package mainimport ( "os" "github.com/Sirupsen/logrus")// 初始化日志模块func initLogger() error { logFilePath := Config.Log.Path //日志文件存放位置 file, err := os.OpenFile(logFilePath, os.O_APPEND|os.O_...
阅读全文
config.go
摘要:package mainimport ( "io/ioutil" "github.com/go-yaml/yaml")// 代理配置数据结构type ProxyConfig struct { Bind string `yaml:"bind"` //前置服务器地址 WaitQueueLen int `yaml:"wait_queue_len...
阅读全文
Golang 的内存管理(上篇)
摘要:Golang 的内存管理基于 tcmalloc,可以说起点挺高的。但是 Golang 在实现的时候还做了很多优化,我们下面通过源码来看一下 Golang 的内存管理实现。下面的源码分析基于 go1.8rc3。1.tcmalloc 介绍关于 tcmalloc 可以参考这篇文章 tcmalloc 介绍,原始论文可以参考 TCMalloc : Thread-Caching Malloc。2. Golan...
阅读全文
main.go
摘要:package mainimport ( "flag" "fmt" "log" "os" "os/signal" "syscall" "github.com/Sirupsen/logrus")var ( Config ProxyConfig //配置文件解析后的结构体 Log *logrus.Logger c...
阅读全文
Go 1.9 sync.Map揭秘
摘要:Go 1.9 sync.Map揭秘目录 [−]有并发问题的mapGo 1.9之前的解决方案sync.MapLoadStoreDeleteRangesync.Map的性能其它在Go 1.6之前, 内置的map类型是部分goroutine安全的,并发的读没有问题,并发的写可能有问题。自go 1.6之后, 并发地读写map会报错,这在一些知名的开源库中都存在这个问题,所以go 1.9之前的解决方案是额外...
阅读全文
Go的context的问题
摘要:Go的context的问题2017-05-29最近被由context引发的一个bug坑得不轻,所以反思一下Go的context的问题。context是隐式的约束,没有检测如果我们写一个函数,比如:func f(a int, b []byte) { } 我们知道它需要哪些参数,编译器是会帮我做检查的,当我调用f(3, "sdfsdf") 它就会报错。可是如果是context,就变成了一种隐式的约束,...
阅读全文
Golang 知识点总结
摘要:各种类型复制的时候的花费本节标题也可以叫做“各种类型的值的大小” (the sizes of values of all kinds of types),底层可被不同的值共享的数据的大小未被计算。下面的表格中一个 word在32bit操作系统中代表4个字节,在64bit操作系统中代表8个字节,内容基于官方的Go 1.7的编译器。TypeCost Of Value Copying (Value Si...
阅读全文
golang接口三个特性
摘要:类型和接口因为映射建设在类型的基础之上,首先我们对类型进行全新的介绍。go是一个静态性语言,每个变量都有静态的类型,因此每个变量在编译阶段中有明确的变量类型,比如像:int、float32、MyType。。。比如:type MyInt int var i int var j MyInt变量i的类型为int,变量j的类型为MyInt,变量i、j具有确定的类型,虽然i、j的潜在类型是一样的,但是在没有...
阅读全文
[]T 还是 []*T, 这是一个问题
摘要:全面分析Go语言中的类型和类型指针的抉择目录 [−]副本的创建T的副本创建*T的副本创建如何选择 T 和 *T什么时候发生副本创建最常见的casemap、slice和数组for-range循环channel函数参数和返回值Method Receiver不同类型的副本创建bool,数值和指针数组map、slice 和 channel字符串函数参考文档在编程语言深入讨论中,经常被大家提起也是争论最多的...
阅读全文
十条有用的GO技术
摘要:十条有用的 Go 技术 这里是我过去几年中编写的大量 Go 代码的经验总结而来的自己的最佳实践。我相信它们具有弹性的。这里的弹性是指: 某个应用需要适配一个灵活的环境。你不希望每过 3 到 4 个月就不得不将它们全部重构一遍。添加新的特性应当很容易。许多人参与开发该应用,它应当可以被理解,且维护简单。许多人使用该应用,bug 应该容易被发现并且可以快速的修复。我用了很长的时间学到了这些事情。其中的...
阅读全文
JSON 的小技巧
摘要:有的时候上游传过来的字段是string类型的,但是我们却想用变成数字来使用。 本来用一个json:",string" 就可以支持了,如果不知道golang的这些小技巧,就要大费周章了。参考文章:http://attilaolah.eu/2014/09/10/json-and-struct-composition-in-go/临时忽略struct字段临时忽略掉Password字段临时添加额外的字段临...
阅读全文
Clean http handlers in Go
摘要:IntroductionFor this blog post we are going to take a look at the http.HandlerFunc type and how we can improve it to make more elegant and clean handlers. Following the idioms of Go and staying compat...
阅读全文
Goroutine陷阱
摘要:Go在语言层面通过Goroutine与channel来支持并发编程,使并发编程看似变得异常简单,但通过最近一段时间的编码,越来越觉得简单的东西,很容易会被滥用。Java的标准库也让多线程编程变得简单,但想当初在公司定位Java的问题,发现很多的同学由于没有深入了解Java Thread的机制,Thr
阅读全文
golang 1.8 优雅关闭
摘要:// main.go package main import ( "fmt" "log" "net/http" "os" "os/signal" "syscall" "time" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Re...
阅读全文
Go性能优化小结
摘要:1 内存优化 1.1 小对象合并成结构体一次分配,减少内存分配次数 做过C/C++的同学可能知道,小对象在堆上频繁地申请释放,会造成内存碎片(有的叫空洞),导致分配大的对象时无法申请到连续的内存空间,一般建议是采用内存池。Go runtime底层也采用内存池,但每个span大小为4k,同时维护一个c
阅读全文
理解Go Context机制
摘要:1 什么是Context 最近在公司分析gRPC源码,proto文件生成的代码,接口函数第一个参数统一是ctx context.Context接口,公司不少同事都不了解这样设计的出发点是什么,其实我也不了解其背后的原理。今天趁着妮妲台风妹子正面登陆深圳,全市停工、停课、停业,在家休息找了一些资料研究
阅读全文
Java 线程池(ThreadPoolExecutor)原理分析与使用
摘要:在我们的开发中“池”的概念并不罕见,有数据库连接池、线程池、对象池、常量池等等。下面我们主要针对线程池来一步一步揭开线程池的面纱。 使用线程池的好处 1、降低资源消耗 可以重复利用已创建的线程降低线程创建和销毁造成的消耗。 2、提高响应速度 当任务到达时,任务可以不需要等到线程创建就能立即执行。 3
阅读全文
理解Go Interface
摘要:理解Go Interface1 概述Go语言中的接口很特别,而且提供了难以置信的一系列灵活性和抽象性。接口是一个自定义类型,它是一组方法的集合,要有方法为接口类型就被认为是该接口。从定义上来看,接口有两个特点:接口本质是一种自定义类型,因此不要将Go语言中的接口简单理解为C++/Java中的接口,后者仅用于声明方法签名。接口是一种特殊的自定义类型,其中没有数据成员,只有方法(也可以为空)。接口是完...
阅读全文
深入讨论channel timeout
摘要:深入讨论channel timeoutGo 语言的 channel 本身是不支持 timeout 的,所以一般实现 channel 的读写超时都采用 select,如下:select { case <-c: case <-time.After(time.Second): } 这两天在写码的过程中突然对这样实现 channel 超时产生了怀疑,这种方式真的好吗?于是我写了这样一个测试程序:packa...
阅读全文
fasthttp中的协程池实现
摘要:fasthttp中的协程池实现协程池可以控制并行度,复用协程。fasthttp 比 net/http 效率高很多倍的重要原因,就是利用了协程池。实现并不复杂,我们可以参考他的设计,写出高性能的应用。入口// server.go func (s *Server) Serve(ln net.Listener) error { var lastOverflowErrorTime time.Ti...
阅读全文
Golang 知识点总结
摘要:Golang 知识点总结目录 [−]各种类型复制的时候的花费可使用内建函数的类型 (len、cap、close、delete、make)内建容器类型的值比较组合类型T{...}的值比较零值是nil的类型编译时被执行的函数不能被寻址的值不支持比较的类型可命名的源代码元素命名的源代码元素可以使用 ()分组声明可以在函数内外声明的源代码元素可以返回一个可选bool返回值的表达式使用channel机制永远...
阅读全文
高级编码和解码技术
摘要:Go 的标准库包含了一些很不错的编码和解码包,里面涵盖了大量的编码方案。一切数据,不管是CSV,XML,JSON,还是 gob —— 一个 Go 特定的编码格式,都涵盖在内,并且,这些包都非常容易上手使用。 事实上,它们中的大多数都不需要再添加任何代码,你只需插入数据,它就会输出编码后的数据。不过,并不是所有的应用程序都乐于处理这种到 JSON 展现的一对一映射。Struct 标记可以涵盖一些场景...
阅读全文
go源文件中是否有main函数
摘要:import ( "go/parser""go/token" "go/ast" ) func HasMain(file string) (bool, error) { fset := token.NewFileSet() f, err := parser.ParseFile(fset, file, nil, 0)if err != nil {return fal...
阅读全文
golang 并发模式笔记
摘要:1、并发并不是并行,前者是优先对时间片的抢占,后者是真多核。 go中多线程时直接要求并行的方法是:亦不可滥用,CPU密集型,并发度很高的场景适用。 2、go起的协程 3、 function that returns a chanel fan-in 二次缓冲 send a chanel on a chanel 利用chanel饥饿阻塞原理实现有序 select 利用select的ok随机执行性,可以...
阅读全文
Golang 通用连接池库 Golang-Pool
摘要:Golang 实现的连接池功能:* 连接池中连接类型为interface{},使得更加通用* 链接的最大空闲时间,超时的链接将关闭丢弃,可避免空闲时链接自动失效问题* 使用channel处理池中的链接,高效基本用法//factory 创建连接的方法 factory := func() (interface{}, error) { return net.Dial("tcp", "127.0.0.1:...
阅读全文
如果裸写一个goroutine pool
摘要:引言在上文中,我说到golang的原生http server处理client的connection的时候,每个connection起一个goroutine,这是一个相当粗暴的方法。为了感受更深一点,我们来看一下go的源码。先定义一个最简单的http server如下。12345678func myHandler(w http.ResponseWriter, r *http.Request) { ...
阅读全文
fasthttp 的 goroutine pool 实现探究
摘要:引言fasthttp是一个非常优秀的web server框架,号称比官方的net/http快10倍以上。fasthttp用了很多黑魔法。俗话说,源码面前,了无秘密,我们今天通过源码来看一看她的goroutine pool的实现。热身fasthttp写server和原生的net/http写法上基本没有区别,这里就不举例子。直接找到入口函数,在根目录下的server.go文件中,我们从函数Listen...
阅读全文
golang实现权重轮询调度算法
摘要:package main import ( "fmt" "time" ) var slaveDns = map[int]map[string]interface{}{ 0: {"connectstring": "root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8", ...
阅读全文
获取本机ip
摘要:func GetLocalIP() { host, _ := os.Hostname() addrs, _ := net.LookupIP(host) for _, addr := range addrs { if ipv4 := addr.To4(); ipv4 != nil { fmt.Println("IPv4: ", ipv4) ...
阅读全文
golang学习资料
摘要:http://yougg.github.io/static/gonote/GolangStudy.html
阅读全文
dnscache --源码笔记
摘要://最新版本参见https://github.com/karlseguin/dnscache地址 或者 https://github.com/netroby/dnscache package dnscache// Package dnscache caches DNS lookupsimport ( "net" "sync" "time")//一个域名可能对应多个iptype Reso...
阅读全文
xsrftoken--源码笔记
摘要:// Package xsrftoken provides methods for generating and validating secure XSRF tokens.package xsrftoken // import "golang.org/x/net/xsrftoken"import ( "crypto/hmac" "crypto/sha1" "crypto/sub...
阅读全文
forwardport--源码笔记--注释
摘要:package mainimport ( "encoding/json" "flag" "fmt" "io" "log" "net" "net/http" "os" "os/signal" "runtime" "sync" "syscall" "time")var restApiServer = flag.String(...
阅读全文
golang 通过exec Command启动的进程如何关闭的解决办法 以及隐藏黑色窗口
摘要:golang 通过exec Command启动的进程如何关闭的解决办法在用exec包调用的其他进程后如何关闭结束,可以使用context包的机制进行管理,context包的使用详见:https://godoc.org/contextexec.CommandContext方发实现了context,通过context可以对exec启动的进程结束。隐藏程序自身黑窗口的方法:Go build -ldfla...
阅读全文
nsq理解
摘要:核心概念在讨论NSQ如何在实践中使用前,先理解NSQ队列的架构原理是非常值得的。它的设计很简单,可以通过几个核心概念来理解。Topic ——一个topic就是程序发布消息的一个逻辑键,当程序第一次发布消息时就会创建topic。Channels ——channel组与消费者相关,是消费者之间的负载均衡,channel在某种意义上来说是一个“队列”。每当一个发布者发送一条消息到一个topic,消息会被...
阅读全文
Go缓存DNS
摘要:Go里面的DNSclient没有带任何的缓存,语言层面没有任何的缓存,但是我们可以通过下面这样的代码来这样当我们调用http.Client的时候就会采用这个缓存的ip了,里面用到的dnscache是这个包https://github.com/viki-org/dnscache
阅读全文
如何使用Docker部署一个Go Web应用程序
摘要:熟悉Docker如何提升你在构建、测试并部署Go Web应用程序的方式,并且理解如何使用Semaphore来持续部署。简介大多数情况下Go应用程序被编译成单个二进制文件,web应用程序则会包括模版和配置文件。而当一个项目中有很多文件的时候,由于很多文件没有同步就会导致错误的发生并且产生很多的问题。在本教程中,你将学习如何使用Docker部署一个Go web应用程序,并且认识到Docker将如何改进...
阅读全文
打包前端WebSite到Go程序
摘要:打包前端WebSite到Go程序Coolpy5发布在即,新版本要求服务端程序只是一个运行文件,经历了go的template无数坑后,最后还是放弃了,所以还是要把前端独立开发一个纯前端程序,但是go程序直接build的话并不支持把前端程序编译到最终生成的文件中,所以须要一种方法把前端程序打包进最终生成的运行文件中。所用到的包 github.com/GeertJohan/go.rice下载或编译后会得...
阅读全文
too many open files linux服务器 golang java
摘要:1. 现象服务的cpu跑满(golang实现), 并大量报too many open files错误.服务使用systemd来运行,部署在阿里ecs上. 2.分析从日志来看,cpu的上升主要为到达文件数限制引起的,但之前已经更改过系统的文件数及所有用户的文件数,按道理是不应该出现这个问题的,后来查阅资料发现,文件数可以从三个维度限制分别为操作系统限制,用户态限制,以及进程限制,对于这三个维度选取最...
阅读全文
fasthttp 文档手册
摘要:fasthttp 文档手册貌似文章有最大长度限制,完整全文地址:https://github.com/DavidCai1993/my-blog/issues/35常量const ( CompressNoCompression = flate.NoCompression CompressBestSpeed = flate.BestSpeed Com...
阅读全文
syncer.go
摘要:package mirrorimport ( "github.com/coreos/etcd/clientv3" "golang.org/x/net/context")const ( batchLimit = 1000)// Syncer syncs with the key-value state of an etcd cluster.type Syncer interface...
阅读全文
grpc.go
摘要:package namingimport ( "encoding/json" etcd "github.com/coreos/etcd/clientv3" "golang.org/x/net/context" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/gr...
阅读全文
stm.go
摘要:package concurrencyimport ( v3 "github.com/coreos/etcd/clientv3" "golang.org/x/net/context")// STM is an interface for software transactional memory.type STM interface { // Get returns the va...
阅读全文
mutex.go
摘要:package concurrencyimport ( "fmt" "sync" v3 "github.com/coreos/etcd/clientv3" "golang.org/x/net/context")// Mutex implements the sync Locker interface with etcdtype Mutex struct { s *Se...
阅读全文
session.go
摘要:package concurrencyimport ( "time" v3 "github.com/coreos/etcd/clientv3" "golang.org/x/net/context")const defaultSessionTTL = 60// Session represents a lease kept alive for the lifetime of a c...
阅读全文
key.go
摘要:package concurrencyimport ( "fmt" v3 "github.com/coreos/etcd/clientv3" "github.com/coreos/etcd/mvcc/mvccpb" "golang.org/x/net/context")func waitDelete(ctx context.Context, client *v3.Clien...
阅读全文
election.go
摘要:package concurrencyimport ( "errors" "fmt" v3 "github.com/coreos/etcd/clientv3" "github.com/coreos/etcd/mvcc/mvccpb" "golang.org/x/net/context")var ( ErrElectionNotLeader = errors.Ne...
阅读全文
watch.go
摘要:package clientv3import ( "fmt" "sync" "time" v3rpc "github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes" pb "github.com/coreos/etcd/etcdserver/etcdserverpb" mvccpb "github.com/coreo...
阅读全文
txn.go
摘要:package clientv3import ( "sync" pb "github.com/coreos/etcd/etcdserver/etcdserverpb" "golang.org/x/net/context" "google.golang.org/grpc")// Txn is the interface that wraps mini-transactions...
阅读全文
sort.go
摘要:package clientv3type SortTarget inttype SortOrder intconst ( SortNone SortOrder = iota SortAscend SortDescend)const ( SortByKey SortTarget = iota SortByVersion SortByCreateRevision ...
阅读全文
retry.go
摘要:package clientv3import ( "github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes" pb "github.com/coreos/etcd/etcdserver/etcdserverpb" "golang.org/x/net/context" "google.golang.org/grpc" "...
阅读全文
maintenance.go
摘要:package clientv3import ( "io" pb "github.com/coreos/etcd/etcdserver/etcdserverpb" "golang.org/x/net/context" "google.golang.org/grpc")type ( DefragmentResponse pb.DefragmentResponse ...
阅读全文
op.go
摘要:package clientv3import pb "github.com/coreos/etcd/etcdserver/etcdserverpb"type opType intconst ( // A default Op has opType 0, which is invalid. tRange opType = iota + 1 tPut tDeleteRange)...
阅读全文
lease.go
摘要:package clientv3import ( "sync" "time" "github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes" pb "github.com/coreos/etcd/etcdserver/etcdserverpb" "golang.org/x/net/context" "google.g...
阅读全文
config.go
摘要:package clientv3import ( "crypto/tls" "crypto/x509" "io/ioutil" "time" "github.com/coreos/etcd/pkg/tlsutil" "github.com/ghodss/yaml")type Config struct { // Endpoints is a list of...
阅读全文
compare.go
摘要:package clientv3import ( pb "github.com/coreos/etcd/etcdserver/etcdserverpb")type CompareTarget inttype CompareResult intconst ( CompareVersion CompareTarget = iota CompareCreated CompareM...
阅读全文
compact_op.go
摘要:package clientv3import ( pb "github.com/coreos/etcd/etcdserver/etcdserverpb")// CompactOp represents a compact operation.type CompactOp struct { revision int64 physical bool}// CompactOption ...
阅读全文
client.go
摘要:package clientv3import ( "crypto/tls" "errors" "fmt" "net" "net/url" "strings" "time" "github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes" prometheus "github.com/grpc-ecos...
阅读全文
cluster.go
摘要:package clientv3import ( pb "github.com/coreos/etcd/etcdserver/etcdserverpb" "golang.org/x/net/context" "google.golang.org/grpc")type ( Member pb.Member MemberListResponse...
阅读全文
balancer.go
摘要:package clientv3import ( "net/url" "strings" "sync" "golang.org/x/net/context" "google.golang.org/grpc" "google.golang.org/grpc/codes")// ErrNoAddrAvilable is returned by Get() when ...
阅读全文
auth.go
摘要:package clientv3import ( "fmt" "strings" "github.com/coreos/etcd/auth/authpb" pb "github.com/coreos/etcd/etcdserver/etcdserverpb" "golang.org/x/net/context" "google.golang.org/grpc")...
阅读全文
kv.go
摘要:package clientv3import ( pb "github.com/coreos/etcd/etcdserver/etcdserverpb" //protobuffer "golang.org/x/net/context" "google.golang.org/grpc" //google rpc 框架)type ( CompactRespon...
阅读全文
阿里巴巴的开源项目Druid(关于数据库连接)
摘要:1 配置和dbcp类似,druid的常用配置项如下配置缺省值说明name 配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。如果没有配置,将会生成一个名字,格式是:"DataSource-" + System.identityHashCode(this)jdbcUrl 连接数据库的url,不同数据库不一样。例如:mysql : jdbc:mysql://10.20.15...
阅读全文
netty源码分析之揭开reactor线程的面纱(二)
摘要:如果你对netty的reactor线程不了解,建议先看下上一篇文章netty源码分析之揭开reactor线程的面纱(一),这里再把reactor中的三个步骤的图贴一下reactor线程我们已经了解到netty reactor线程的第一步是轮询出注册在selector上面的IO事件(select),那么接下来就要处理这些IO事件(process selected keys),本篇文章我们将一起来探讨...
阅读全文
Java 中的纤程库 – Quasar
摘要:来源:鸟窝,colobu.com/2016/07/14/Java-Fiber-Quasar/如有好文章投稿,请点击 → 这里了解详情最近遇到的一个问题大概是微服务架构中经常会遇到的一个问题:服务 A 是我们开发的系统,它的业务需要调用 B、C、D 等多个服务,这些服务是通过http的访问提供的。 问题是 B、C、D 这些服务都是第三方提供的,不能保证它们的响应时间,快的话十几毫秒,慢的话甚至1秒多...
阅读全文
fastjson使用中遇到的
摘要:二. fastjson 解析json字符串为四种类型 1. JavaBean Person person = JSON.parseObject(jsonString, Person.class); 2. List List listPerson =JSON.parseArray(jsonString, Person.class); ...
阅读全文
netty源码分析之揭开reactor线程的面纱(一)
摘要:netty最核心的就是reactor线程,对应项目中使用广泛的NioEventLoop,那么NioEventLoop里面到底在干些什么事?netty是如何保证事件循环的高效轮询和任务的及时执行?又是如何来优雅地fix掉jdk的nio bug?带着这些疑问,本篇文章将庖丁解牛,带你逐步了解netty reactor线程的真相[源码基于4.1.6.Final]reactor 线程的启动NioEvent...
阅读全文
Vert.x 线程模型揭秘
摘要:来源:鸟窝,colobu.com/2016/03/31/vertx-thread-model/如有好文章投稿,请点击 → 这里了解详情Vert.x是一个在JVM开发reactive应用的框架,可用于开发异步、可伸缩、高并发的Web应用(虽然不限于web应用)。其目的在于为JVM提供一个Node.js的替代方案。开发者可以通过它使用JavaScript、Ruby、Groovy、Java,甚至是混合语...
阅读全文
Java RESTful 框架的性能比较
摘要:来源:鸟窝,colobu.com/2015/11/17/Jax-RS-Performance-Comparison/如有好文章投稿,请点击 → 这里了解详情在微服务流行的今天,我们会从纵向和横向分解代码的逻辑,将一些独立的无状态的代码单元实现为微服务,可以将它们发布到一些分布式计算单元或者Docker中,并在性能需要的时候及时地创建更多的服务单元。微服务是一个概念,并没有规定服务的格式,但是很多厂...
阅读全文
理解 RxJava 的线程模型
摘要:来源:鸟窝,colobu.com/2016/07/25/understanding-rxjava-thread-model/如有好文章投稿,请点击 → 这里了解详情ReactiveX是Reactive Extensions的缩写,一般简写为Rx,最初是LINQ的一个扩展,由微软的架构师Erik Meijer领导的团队开发,在2012年11月开源,Rx是一个编程模型,目标是提供一致的编程接口,帮助开...
阅读全文
Java借助CountDownLatch完成异步回调
摘要:public class AsyncDemo { private static void doSomeTask() { System.out.println("Hello World"); } private static void onCompletion() { System.out.println("All tasks finish...
阅读全文
在 Java 中运用动态挂载实现 Bug 的热修复
摘要:大多数 JVM 具备 Java 的 HotSwap 特性,大部分开发者认为它仅仅是一个调试工具。利用这一特性,有可能在不重启 Java 进程条件下,改变 Java 方法的实现。典型的例子是使用 IDE 来编码。然而 HotSwap 可以在生产环境中实现这一功能。通过这种方式,不用停止运行程序,就可以扩展在线的应用程序,或者在运行的项目上修复小的错误。这篇文章中,我将演示动态绑定、应用运行期代码变化...
阅读全文
图解java中的bytebuffer
摘要:因何而写网上关于bytebuffer的文章真的很多,为何在此还要写一篇呢?主要是基于以下几点考虑很多人在使用t-io时,还不会bytebuffer,只会照着t-io提供的例子照猫画虎,不利于灵活运用网上搜到的一些相关文章,讲得不是太易懂,不利于初学者灵活运用bytebuffer本文旨在讲解灵活运用bytebuffer所需的最小知识,以帮助用户快速掌握bytebuffer用极易的方式认识一下byte...
阅读全文
Stackoverflow 最受关注的 10 个 Java 问题
摘要:Stack Overflow 是一个大型的编程知识库。在 Stack Overflow 中已经有数以百万计的问题,并且很多答案有着很高的质量。这就是为什么 Stack Overflow 的答案经常位于 Google 搜索结果的顶部。尽管 Stack Overflow 上很多问题已经有了答案,每天还是会有很多问题被提出,很多问题仍然没有被回答或者没有获得满意的答案。那么当 Stack Overflo...
阅读全文
对协程的一些理解
摘要:协程协程(coroutine)最早由Melvin Conway在1963年提出并实现,一句话定义:协程是用户态的轻量级的线程线程和协程线程和协程经常被放在一起比较;线程一旦被创建出来,编写者是无法决定什么时候获得或者放出时间片的,是由操作系统进行统一调度的;而协程对编写者来说是可以控制切换的时机,并且切换代价比线程小,因为不需要进行内核态的切换。协程避免了无意义的调度,由此可以提高性能,但也因此,...
阅读全文
面向对象六大原则
摘要:在此之前,有一点需要大家知道,熟悉这些原则并不是说你写出的程序就一定灵活、清晰,只是为你的优秀代码之路铺上了一层栅栏,在这些原则的指导下你才能避免陷入一些常见的代码泥沼,从而让你专心写出优秀的东西。下面我们就以Android网络框架SimpleNet为例来学习这六大面向对象的基本原则,体会这些原则在开发过程中带来的强大能量。1 单一职责原则单一职责原则的英文名称是Single Responsibi...
阅读全文
JUC中AQS简介
摘要:AQS,在java.util.concurrent.locks包中,AbstractQueuedSynchronizer这个类是并发包中的核心,了解其他类之前,需要先弄清楚AQS。在JUC的很多类中都会存在一个内部类Sync,Sync都是继承自AbstractQueuedSynchronizer,相信不用说就能明白AQS有多重要。AQS原理AQS就是一个同步器,要做的事情就相当于一个锁,所以就会有...
阅读全文
JUC中Lock和ReentrantLock介绍及源码解析
摘要:Lock框架是jdk1.5新增的,作用和synchronized的作用一样,所以学习的时候可以和synchronized做对比。在这里先和synchronized做一下简单对比,然后分析下Lock接口以及ReentrantLock的源码和说明。具体的其他的Lock实现的分析在后面会慢慢介绍。Lock框架和synchronized有关synchronized的作用和用法不在具体说明,应该都很熟悉了。...
阅读全文
Executor框架简介
摘要:Executor框架是在Java5中引入的,可以通过该框架来控制线程的启动,执行,关闭,简化并发编程。Executor框架把任务提交和执行解耦,要执行任务的人只需要把任务描述清楚提交即可,任务的执行提交人不需要去关心。通过Executor框架来启动线程比使用Thread更好,更易管理,效率高,避免this逃逸问题。Executor的实现还提供了对生命周期的支持,以及统计信息收集,应用程序管理机制和...
阅读全文
CountDownLatch简介
摘要:CountDownLatch是并发包中提供的一个可用于控制多个线程同时开始某动作的类,可以看做是一个计数器,计数器操作是院子操作,同时只能有一个线程去操作这个计数器。可以向CountDownLatch对象设置一个初始的数字作为计数值,任何调用这个对象上的await()方法都会阻塞,直到这个计数器的计数值被其他的线程减为0为止。CountDownLatch的一个非常典型的应用场景是:有一个任务想要往...
阅读全文
CyclicBarrier简介
摘要:CyclicBarrier简介CyclicBarrier和CountDownLatch不同,是当await的数量达到了设定的数量之后,才继续往下执行CyclicBarrier数的是调用了CyclicBarrier.await()进入等待的线程数,当线程数达到了CyclicBarrier初始时规定的数目时,所有进入等待状态的线程被唤醒并继续。 CyclicBarrier就象它名字的意思一样,可看成是...
阅读全文
Semaphore简介
摘要:Semaphore简介Semaphore是并发包中提供的用于控制某资源同时被访问的个数操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。Semaphore维护了当前访问的个数,提...
阅读全文
AtomicInteger简介
摘要:AtomicInteger简介支持原子操作的Integer类主要用于在高并发环境下的高效程序处理。使用非阻塞算法来实现并发控制。源码分析jdk1.7.0_71123456//在更新操作时提供“比较并替换”的作用private static final Unsafe unsafe = Unsafe.getUnsafe();//用来记录value本身在内存的偏移地址private static fin...
阅读全文
ThreadPoolExecutor简介
摘要:ThreadPoolExecutor简介并发包中提供的一个线程池服务线程池的工作过程线程池刚创建,里面没有线程.任务队列是作为参数传进来的.线程池不会立即执行任务.调用execute()方法添加一个任务,线程池会做如下判断:如果正在运行的线程数量小于corePoolSize,马上创建线程运行这个任务如果正在运行的线程数量大于或等于corePoolSize,这个任务放入队列如果队列满了,且正在运行的...
阅读全文
synchronized和volatile简介
摘要:简介volatile是一个变量修饰符,而synchronized是一个方法或块的修饰符。所以我们使用这两种关键字来指定三种简单的存取变量的方式。12345678int i1;int geti1() {return i1;}volatile int i2;int geti2() {return i2;}int i3;synchronized int geti3() {return i3;}geti1...
阅读全文
CopyOnWriteArrayList简介
摘要:CopyOnWriteArrayList,写数组的拷贝,支持高效率并发且是线程安全的,读操作无锁的ArrayList。所有可变操作都是通过对底层数组进行一次新的复制来实现。CopyOnWriteArrayList适合使用在读操作远远大于写操作的场景里,比如缓存。它不存在扩容的概念,每次写操作都要复制一个副本,在副本的基础上修改后改变Array引用。CopyOnWriteArrayList中写操作需...
阅读全文
ConcurrentHashMap简介
摘要:ConcurrentHashMap为了高并发而设计,相比于HashTable和HashMap有更多优势。HashTable是同步的,在多线程环境下,能保证程序执行的正确性,每次同步执行的时候都要锁住整个结构。HashMap不是同步的,在单线程情况下效率高。ConcurrentHashMap锁方式是稍微细粒度的,内部采用分离锁的设计。它默认将Hash表分为16个分段,get,put,remove等常...
阅读全文
ArrayBlockingQueue简介
摘要:ArrayBlockingQueue基于数组,先进先出,从尾部插入到队列,从头部开始返回。线程安全的有序阻塞队列,内部通过“互斥锁”保护竞争资源。指定时间的阻塞读写容量可限制定义ArrayBlockingQueue继承AbstractQueue,实现了BlockingQueue,Serializable接口,内部元素使用Object[]数组保存。初始化时候需要指定容量ArrayBlockingQu...
阅读全文
CopyOnWriteArraySet简介
摘要:基于CopyOnWriteArrayList实现,线程安全无需集合。add调用的是CopyOnWriteArraylist的addIfAbsent方法。CopyOnWriteArraySet每次add要进行遍历数组,性能略低于CopyOnWriteArrayList。适用于set大小一般很小,读操作远远多于写操作的场景。定义CopyOnWriteArraySet集成AbstractSet,实现Se...
阅读全文
LinkedBlockingQueue简介
摘要:LinkedBlockingQueue是一个单向链表实现的阻塞队列,先进先出的顺序。支持多线程并发操作。相比于数组实现的ArrayBlockingQueue的有界,LinkedBlockingQueue可认为是无界队列。多用于任务队列。定义LinkedBlockingQueue继承AbstractQueue,实现了BlockingQueue,Serializable接口。内部使用单向链表存储数据。...
阅读全文
ConcurrentLinkedQueue简介
摘要:ConcurrentLinkedQueue是一个基于链表的无界线程安全队列,非阻塞实现方式,先进先出,适合高并发的场景。非阻塞的性能较好,采用CAS,避免加锁的时间,保证数据一致性。采用“wait-free”算法实现。(此部分源码看的比较吃力,很多不懂的地方,还有很多不知道的地方,希望不要误导读者,有好的文章之类的,希望能推荐下,谢谢)定义ConcurrentLinkedQueue继承Abstra...
阅读全文
Java同步简介
摘要:Java同步Java中同步一直都是很重要的问题,对于初学者来说也是不太容易能理解的问题。特在此记录一下有关Java中同步和锁的知识。主要涉及到同步的概念以及Java中解决的办法和简单的例子。有关锁Lock中的内容不在此做说明。同步为什么需要同步这个问题不难回答。当牵扯到同步问题的时候,就离不开多线程了。简单举个例子,桌子上有一台2016新款MacBook pro,我和女朋友都想要去玩,我们俩同时伸...
阅读全文
Java多线程简介
摘要:Java多线程简介Java中内置了对多线程的支持,让多线程的开发方便很多,但同时也带来了另外的复杂,线程间的交互以及很多的不确定性让多线程又显得很复杂。在此只是针对Java中多线程的基础做些说明,有关线程和进程的区别,以及多线程的好处和更深层的暂不多说。线程的状态线程的状态定义在Thread类中一个State枚举类型:新建状态(NEW),通过new Thread新建的线程处于新建状态,通常会调用s...
阅读全文
java enum的用法详解
摘要:实际上,这个声明定义的类型是一个类,它刚好有四个实例,在此尽量不要构造新对象。因此,在比较两个枚举类型的值时,永远不需要调用equals方法,而直接使用"=="就可以了。(equals()方法也是直接使用==, 两者是一样的效果)Java Enum类型的语法结构尽管和Java类的语法不一样,应该说差别比较大。但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际...
阅读全文
Java - Instrumentation
摘要:使用JRebel启动工程时加上VM参数时有一个参数是"-javaagent:D:\jrebel_5.6.0\jrebel.jar"。javaagent是什么? java -help后看到如下信息: Java代理不是应用程序中的一部分,instrument支持Java以代理的形式监控或重新定义运行中的服务。我们可以在不修改程序代码的前提下通过Instrumentation API改变运行中的java...
阅读全文
Instrumentation(3)
摘要:摘要: Instrumentation 类加载过程 Instrumentation与Transformer Instrumentation与Transformer的关系 Instrumentation接口简介 触发字节码转换的途径 Transformer分类 Transformer调度过程...Instrumentation 类加载过程 Instrumentation与Transfo...
阅读全文
Instrumentation(1)
摘要:Instrumentation介绍:Java Instrumentation指的是可以用独立于应用程序之外的代理(agent)程序来监测和协助运行在JVM上的应用程序。这种监测和协助包括但不限于获取JVM运行时状态,替换和修改类定义等。 Java SE5中使用JVM TI替代了JVM PI和JVM DI。提供一套代理机制,支持独立于JVM应用程序之外的程序以代理的方式连接和访问JVM。Instru...
阅读全文
instrument(2)
摘要:学习了instrument之后试着自己写点东西,上一篇的例子中使用的是asm,毕竟是面向字节码的,api还是比较复杂的。其实有时候的需求很简单,无非就是看下类里的方法啊之类的。javassist是基于源码级别的API比基于字节码的ASM简单。下面就是对使用到的类打印出所有方法的Transformer:[java] view plain copypublic class TestTransforme...
阅读全文
Dubbo中订阅和通知解析
摘要:Dubbo中关于服务的订阅和通知主要发生在服务提供方暴露服务的过程和服务消费方初始化时候引用服务的过程中。服务引用过程中的订阅和通知在服务消费者初始化的过程中,会有一步是进行服务的引用,具体的代码是在RegistryProtocol的refer方法:12345678910111213141516171819public Invoker refer(Class type, URL url) thr...
阅读全文
Dubbo中Directory解析
摘要:Directory代表多个Invoker,可以把它看成List,但与List不同的是,它的值可能是动态变化的,比如注册中心推送变更。Cluster将Directory中的多个Invoker伪装成一个Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个。上面是文档上对Directory的解释。Directory接口Directory接口继承了Node接口:1234567publ...
阅读全文
Dubbo中集群Cluster,负载均衡,容错,路由解析
摘要:Dubbo中的Cluster可以将多个服务提供方伪装成一个提供方,具体也就是将Directory中的多个Invoker伪装成一个Invoker,在伪装的过程中包含了容错的处理,负载均衡的处理和路由的处理。这篇文章介绍下集群相关的东西,开始先对着文档解释下容错模式,负载均衡,路由等概念,然后解析下源码的处理。(稍微有点乱,心情不太好,不适合分析源码。)集群的容错模式Failover Cluster这...
阅读全文
Dubbo中服务消费者和服务提供者之间的请求和响应过程
摘要:服务提供者初始化完成之后,对外暴露Exporter。服务消费者初始化完成之后,得到的是Proxy代理,方法调用的时候就是调用代理。服务消费者经过初始化之后,得到的是一个动态代理类,InvokerInvocationHandler,包含MockClusterInvoker,MockClusterInvoker包含一个RegistryDirectory和FailoverClusterInvoker。J...
阅读全文
Dubbo中消费者初始化的过程解析
摘要:首先还是Spring碰到dubbo的标签之后,会使用parseCustomElement解析dubbo标签,使用的解析器是dubbo的DubboBeanDefinitionParser,解析完成之后返回BeanDefinition给Spring管理。服务消费者端对应的是ReferenceBean,实现了ApplicationContextAware接口,Spring会在Bean的实例化那一步回调s...
阅读全文
Dubbo中编码和解码的解析
摘要:(这里做的解析不是很详细,等到走完整个流程再来解析)Dubbo中编解码的工作由Codec2接口的实现来处理,回想一下第一次接触到Codec2相关的内容是在服务端暴露服务的时候,根据具体的协议去暴露服务的步骤中,在DubboProtocol的createServer方法中:1234567891011private ExchangeServer createServer(URL url) { 。。。 ...
阅读全文
Dubbo中暴露服务的过程解析
摘要:dubbo暴露服务有两种情况,一种是设置了延迟暴露(比如delay=”5000”),另外一种是没有设置延迟暴露或者延迟设置为-1(delay=”-1”):设置了延迟暴露,dubbo在Spring实例化bean(initializeBean)的时候会对实现了InitializingBean的类进行回调,回调方法是afterPropertySet(),如果设置了延迟暴露,dubbo在这个方法中进行服务...
阅读全文
Dubbo中SPI扩展机制解析
摘要:dubbo的SPI机制类似与Java的SPI,Java的SPI会一次性的实例化所有扩展点的实现,有点显得浪费资源。dubbo的扩展机制可以方便的获取某一个想要的扩展实现,每个实现都有自己的name,可以通过name找到具体的实现。每个扩展点都有一个@Adaptive实例,用来注入到依赖这个扩展点的某些类中,运行时通过url参数去动态判断最终选择哪个Extension实例用。dubbo的SPI扩展机...
阅读全文
C语言和go语言之间的交互
摘要:一、go语言中使用C语言go代码中使用C代码,在go语言的函数块中,以注释的方式写入C代码,然后紧跟import “C” 即可在go代码中使用C函数代码示例:go代码:testC.go1234567891011121314151617181 package main 2 3 /* 4 #include 5 #include 6 void c_print(char *str) { 7 p...
阅读全文
Elasticsearch笔记九之优化
摘要:Elasticsearch笔记九之优化优化从索引片段,内存设置,副本,分片,日志等方面入手。1:索引片段Es运行时会生成很多索引片段,执行查询时会打开这些索引片断。系统会限制打开索引片断的个数一旦超过这个个数限制就无法打开索引片断。我们可以通过命令来查看更改索引片断的限制数量。索引片断位置/usr/local/elasticsearch-1.4.4/data/elasticsearch/nodes...
阅读全文
Elasticsearch笔记八之脑裂
摘要:Elasticsearch笔记八之脑裂概述: 一个正常es集群中只有一个主节点,主节点负责管理整个集群,集群的所有节点都会选择同一个节点作为主节点所以无论访问那个节点都可以查看集群的状态信息。 而脑裂问题的出现就是因为从节点在选择主节点上出现分歧导致一个集群出现多个主节点从而使集群分裂,使得集群处于异常状态。 一般es集群会在内网部署,也可能在外网部署比如阿里云。原因:1:网络原因内网一般不会出...
阅读全文
Elasticsearch笔记七之setting,mapping,分片查询方式
摘要:Elasticsearch笔记七之setting,mapping,分片查询方式setting通过setting可以更改es配置可以用来修改副本数和分片数。1:查看,通过curl或浏览器可以看到副本分片信息curl -XGET http://192.168.79.131:9200/shb01/_settings?prettyhttp://192.168.79.131:9200/shb01/_sett...
阅读全文
Elasticsearch笔记六之中文分词器及自定义分词器
摘要:中文分词器在lunix下执行下列命令,可以看到本来应该按照中文”北京大学”来查询结果es将其分拆为”北”,”京”,”大”,”学”四个汉字,这显然不符合我的预期。这是因为Es默认的是英文分词器我需要为其配置中文分词器。curlHTTP://192.168.79.131:9200/shb01/_analyze?pretty=true -d'{"text":"北京大学"}'Es整合ik不直接用ik官网的...
阅读全文
Elasticsearch笔记四之配置参数与核心概念
摘要:在es根目录下有一个config目录,在此目录下有两个文件分别是elasticsearch.yml和logging.yml。 logging.yml是日志文件,es也是使用log4j来记录日志的,我在此文件中配置日志级别。 elasticsearch.yml是es的基本配置文件es的参数都在这个文件中,我们这里结合此文件来介绍es的核心概念和参数。1:集群 nod...
阅读全文
Elasticsearch笔记二之Curl工具基本操作
摘要:Elasticsearch笔记二之Curl工具基本操作简介:Curl工具是一种可以在命令行访问url的工具,支持get和post请求方式。-X指定http请求的方法,-d指定要传输的数据。创建索引:Put创建curl -XPUThttp://localhost:9200/shb01/student/1-d'{"name":"jack","age":30,"info":"Ilove you"}'{"...
阅读全文
Elasticsearch笔记三之版本控制和插件
摘要:版本控制1:关系型数据库使用的是悲观锁,数据被读取后就被锁定其他的线程就无法对其进行修改。2:ex使用的是乐观锁,数据被读取后其他程序还可以对其进行修改,而执行修改时发现此数据已经被修改则修改就会失败,之后则由程序对此进行下一步处理。 先通过-XGETD得到数据的版本号version 然后在-XPUT时将版本号作为参数传递过去,比对版本号与当前数据的版本号是否一致,一直则修改不一致报错。 ...
阅读全文
Elasticsearch笔记五之java操作es
摘要:Java操作es集群步骤1:配置集群对象信息;2:创建客户端;3:查看集群信息1:集群名称 默认集群名为elasticsearch,如果集群名称和指定的不一致则在使用节点资源时会报错。2:嗅探功能 通过client.transport.sniff启动嗅探功能,这样只需要指定集群中的某一个节点(不一定是主节点),然后会加载集群中的其他节点,这样只要程序不停即使此节点宕机仍然可以...
阅读全文
基于ELK5.1(ElasticSearch, Logstash, Kibana)的一次整合测试
摘要:前言开源实时日志分析ELK平台(ElasticSearch, Logstash, Kibana组成),能很方便的帮我们收集日志,进行集中化的管理,并且能很方便的进行日志的统计和检索,下面基于ELK的最新版本5.1进行一次整合测试。ElasticSearch1.概述:ElasticSearch是一个高可扩展的开源的全文搜索分析引擎。它允许你快速的存储、搜索和分析大量数据。ElasticSearch通...
阅读全文
|
|