n.netService, err = nebnet.NewNebService(n)
if err != nil {
logging.CLog().WithFields(logrus.Fields{
"err": err,
}).Fatal("Failed to setup net service.")
}
netservice有两个成员
type NebServicestruct {
node *Node
dispatcher *Dispatcher
}
跳出stup()函数
先进入start()函数看一看
if err := n.netService.Start()err != nil {
logging.CLog().WithFields(logrus.Fields{
"err": err,
}).Fatal("Failed to start net service.")
}
进入netservice.start()
func (ns *NebService) Start() error {
logging.CLog().Info("Starting NebService...")
// start dispatcher.
ns.dispatcher.Start()
// start node.
if err := ns.node.Start()err != nil {
ns.dispatcher.Stop()
logging.CLog().WithFields(logrus.Fields{
"err": err,
}).Error("Failed to start NebService.")
return err
}
logging.CLog().Info("Started NebService.")
return nil
}
可以看到第一个start()的函数是dispatcher.start()
进入dispatch.start()
func (dp *Dispatcher) Start() {
logging.CLog().Info("Starting NebService Dispatcher...")
go dp.loop()
}
然后就出现一个新的线程、goruntime
go dp.loop()
进入该线程,看它干了些什么
timerChan := time.NewTicker(time.Second).C
for {
select {
case <-timerChan:
metricsDispatcherCached.Update(int64(len(dp.receivedMessageCh)))
case <-dp.quitCh:
logging.CLog().Info("Stoped NebService Dispatcher.")
return
case msg := <-dp.receivedMessageCh:
msgType := msg.MessageType()
v, _ := dp.subscribersMap.Load(msgType)
if v == nil {
continue
}
m, _ := v.(*sync.Map)
m.Range(func(key, valueinterface{}) bool {
select {
case key.(*Subscriber).msgChan <- msg:
default:
logging.VLog().WithFields(logrus.Fields{
"msgType": msgType,
}).Warn("timeout to dispatch message.")
}
return true
})
}
}
一个有点长的循环
metricsDispatcherCached.Update(int64(len(dp.receivedMessageCh)))一秒钟刷新一次缓冲区
case msg := <-dp.receivedMessageCh:
msgType := msg.MessageType()如果能取出dp.receivedMessageCh
msgType := msg.MessageType()首先判断取出的信息类型
v, _ := dp.subscribersMap.Load(msgType)
if v == nil {
continue
}
根据类型取出相应的map
如果取不出,那么使用continue结束这个case
m, _ := v.(*sync.Map)
断言
m.Range(func(key, valueinterface{}) bool {
select {
case key.(*Subscriber).msgChan <- msg:
default:
logging.VLog().WithFields(logrus.Fields{
"msgType": msgType,
}).Warn("timeout to dispa+tch message.")
}
return true
})
将msg推入其他管道里面去。其他goruntime会循环等待该
建立一个P2P平台需要哪些流程基本流程如下:
1、公司注册(无线下基础的初创业者)
开一家普通公司的手续目前并不严格,截止到2015年9月,P2P监管细则暂未出台,因此,即使是注册一家属于互联网金融性质的企业,跟普通公司注册仍然没有太大区别。大部分只要根据《公司登记管理条例》在当地工商管理部门进行注册,根据《互联网信息服务管理办法》和《互联网站管理工作细则》的规定,在当地工信管理部门进行备案即可。
2、网站注册
网站域名注册,如:WWW(和谐)JZHI(和谐)COM(和谐)CN
3、购买服务器或者租用
建立网站后,便需要购买例如阿里云的云服务器,好比你买了一些心仪的家具,现在需要一个家来安置,有了这个家,便可以更好的展示你的家具。
4、域名备案
根据国家相关规定,所有的网站上线,都需要献给域名进行备案,说明域名属于谁,是谁在运营等等,相关部门便会免费给予备案,时间大约在半个月左右。
5、网站建设
有资本和技术支持的公司,可以选择自行研发一套网贷系统,或者选择一家优质的P2P/P2C网贷系统定制公司,如 迪蒙 极致科技这些知名的金融系统开发商。
6、团队组建
还没有线下基础的除了网贷平台必须具备的各部门核心招募,技术、产品、运营、推广、客服、财务、风控等外,还有一般公司需要做的工作:办公场地、人员培训;了解行业、了解系统、定制运营方案、宣传方案等等这类的工作。