原创: PalletOne Pallet 8月24日
讲师简介:
王立刚:PalletOne高级开发工程师,底层链数据API及钱包服务模块负责人,中国石油大学(北京)硕士,拥有数据通信、大数据、区块链、微服务相关开发经验,并投身于经济学研究。
一、环境
1.1CDH集群
Pallet区块解析实时处理所需要的CDH版本为CDH5.14.2,Kaka为3.0.0-1.3.0.0.p0.40,Spark版本为:2.3.0.cloudera3-1.cdh5.13.3.p0.458809。到目前为止,是CDH最新的版本。
1.1.1集群服务
1.1.2主机监控
1.2ETH全节点
1.2.1硬件情况:4核8G硬盘80G
1.2.2ETH解析
#(1)启动Spark Streaming
#./spark-submit--class com.palletone.KSBlock --master yarn --num-executors 2 --driver-memory1g --executor-memory 1g --executor-cores 2 /var/lib/hadoop-hdfs/block_spark.jarethtopic 10 false 10
其中运行的部分日志截图为:
#(2)启动区块解析客户端
#bin/PalletBlock
(3)通过数据库查看发送了哪些区块数据
(4)查看Hbase入库了多少数据
备注:截图有时间偏差
1.2.3Rest API服务
(1)启动Eurekaserver
#nohup java -jar./ptn_center-0.1.jar --spring.profiles.active=peer01
>> ./ptn_center_peer01.log2>&1 &
#nohup java -jar./ptn_center-0.1.jar --spring.profiles.active=peer02
>> ./ptn_center_peer02.log 2>&1&
#nohup java -jar./ptn_center-0.1.jar --spring.profiles.active=peer03
>> ./ptn_center_peer03.log2>&1 &
(2)运行ptn_apipro
#nohup java -jar./ptn_apipro-0.1.jar >> ./ptn_apipro.log2>&1 &
(3)运行ptn_config
#nohup java -jar./ptn_config-0.1.jar >> ./ptn_config.log2>&1 &
(4)运行ptn_apicon
#nohup java -jar./ptn_apicon-0.1.jar >> ./ptn_apicon.log2>&1 &
(5)运行ptn_gateway
#nohup java -jar./ptn_getway-0.1.jar >> ./ptn_gateway.log2>&1&
(6)运行ptn_turbin
#nohup java -jar./ptn_turbin-0.1.jar >> ./ptn_turbin.log2>&1 &
(7)运行ptn_montor
#nuhup java -jar./ptn_montor-0.1.jar >> ./ptn_montor.log2>&1&
(8)运行ptn_zipkin
#nohup java -jar./ptn_zipkin-0.1.jar >> ./ptn_zipkin.log2>&1&
(9)服务列表
(10)在浏览器进行测试
#http://124.251.111.61:8766/api/eth0/1
二、流程
2.1工程管理
区块解析部分使用C++进行开发,并使用CMake进行管理;Rest API部分使用Java进行开发,并使用Maven进行管理;实时处理处理使用Java和Scala进行开发,并使用Maven进行管理。
2.1.1CMake
CMake是cross platform make的缩写,用于跨平台的工程构建和编译。它在make基础上,使用比make更加简单的语法来构建软件工程。cmake能感知系统和平台,生成不同的工程文件,比如unix的Makefile,Windows的sln或者苹果系统的XCode工程。
2.1.2Maven
Maven是一个项目管理和综合工具。Maven提供了开发人员构建一个完整的生命周期框架。开发团队可以自动完成项目的基础工具建设,Maven使用标准的目录结构和默认构建生命周期。在多个开发团队环境时,Maven可以设置按标准在非常短的时间里完成配置工作。由于大部分项目的设置都很简单,并且可重复使用,Maven让开发人员的工作更轻松,同时创建报表,检查,构建和测试自动化设置。
2.2ETH解析
ETH解析内部架构:
ETH区块解析的线程池框架内部使用事件通知机制,可以实时监控线程池的使用情况;写入数据库模块采用队列排队机制进行入库,不会遗漏执行语句;此外,该模块借鉴了比特币、以太坊、Facebook、Intel TBB等开源框架。
2.3Rest解析
2.3.1微服务
在传统的IT行业软件大多都是各种独立系统的堆砌,这些系统的问题总结来说就是扩展性差,可靠性不高,维护成本高。到后面引入了SOA服务化,但是,由于 SOA 早期均使用了总线模式,这种总线模式是与某种技术栈强绑定的,比如:J2EE。这导致很多企业的遗留系统很难对接,切换时间太长,成本太高,新系统稳定性的收敛也需要一些时间。最终 SOA 看起来很美,但却成为了企业级奢侈品,中小公司都望而生畏。
微服务与单体架构区别:(1)单体架构所有的模块全都耦合在一块,代码量大,维护困难,微服务每个模块就相当于一个单独的项目,代码量明显减少,遇到问题也相对来说比较好解决。(2)单体架构所有的模块都共用一个数据库,存储方式比较单一,微服务每个模块都可以使用不同的存储方式(比如有的用redis,有的用mysql等),数据库也是单个模块对应自己的数据库。(3)单体架构所有的模块开发所使用的技术一样,微服务每个模块都可以使用不同的开发技术,开发模式更灵活。
微服务与SOA区别:微服务,从本质意义上看,还是 SOA 架构。但内涵有所不同,微服务并不绑定某种特殊的技术,在一个微服务的系统中,可以有 Java 编写的服务,也可以有 Python编写的服务,他们是靠Restful架构风格统一成一个系统的。所以微服务本身与具体技术实现无关,扩展性强。
微服务设计原则:(1)单一职责原则:意思是每个微服务只需要实现自己的业务逻辑就可以了,比如订单管理模块,它只需要处理订单的业务逻辑就可以了,其它的不必考虑。(2)服务自治原则:意思是每个微服务从开发、测试、运维等都是独立的,包括存储的数据库也都是独立的,自己就有一套完整的流程,我们完全可以把它当成一个项目来对待。不必依赖于其它模块。(3)轻量级通信原则:首先是通信的语言非常的轻量,第二,该通信方式需要是跨语言、跨平台的,之所以要跨平台、跨语言就是为了让每个微服务都有足够的独立性,可以不受技术的钳制。(4)接口明确原则:由于微服务之间可能存在着调用关系,为了尽量避免以后由于某个微服务的接口变化而导致其它微服务都做调整,在设计之初就要考虑到所有情况,让接口尽量做的更通用,更灵活,从而尽量避免其它模块也做调整。
2.3.2项目概况
架构摘要
服务鉴权:通过JWT的方式来加强服务之间调度的权限验证,保证内部服务的安全性。参考博客:https://blog.csdn.net/a82793510/article/details/53509427
监控:利用Spring Boot Admin 来监控各个独立Service的运行状态;利用Hystrix Dashboard来实时查看接口的运行状态和调用频率等。
负载均衡:将服务保留的rest进行代理和网关控制,除了平常经常使用的node.js、nginx外,Spring Cloud系列的zuul和ribbon,可以帮我们进行正常的网关管控和负载均衡。其中扩展和借鉴国外项目的扩展基于JWT的Zuul限流插件,方面进行限流。
服务注册与调用:基于Eureka来实现的服务注册与调用,在Spring Cloud中使用Feign, 我们可以做到使用HTTP请求远程服务时能与调用本地方法一样的编码体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求。
熔断机制:因为采取了服务的分布,为了避免服务之间的调用“雪崩”,采用了Hystrix的作为熔断器,避免了服务之间的“雪崩”。
参考更多:
PalletOne技术讲堂之BitShares 2.0 多节点私链部署PalletOne技术讲堂之区块链与比特币特辑(一)
区块链世界的IP协议高性能分布式账本
更多有价值的悄悄话,欢迎加入PalletOne社群
添加PalletOne小红微信
加入社区,咨询更多消息
官网:https://pallet.one/
官方邮箱:contact@pallet.one
Telegram:http://t.me/PalletOneOfficialEN
Github:https://github.com/PalletOne
Twitter:https://twitter.com/PalletOne_org
Medium:https://medium.com/palletone
更多官方咨询,关注公众号获得
网友评论