diff --git a/工作日志/2021年8月19日-今日计划.md b/工作日志/2021年8月19日-今日计划.md index cf245ec8..419e715a 100644 --- a/工作日志/2021年8月19日-今日计划.md +++ b/工作日志/2021年8月19日-今日计划.md @@ -10,8 +10,18 @@ ### 知识复习——基础 * [ ] 操作系统 + * [ ] 文件 + * [ ] 并发 * [ ] 数据库 + * [ ] 基础知识 + * [ ] MySQL + * [ ] Redis * [ ] 计算机网络 + * [ ] 应用层 + * [ ] 网络层 + * [ ] 通信层 + * [ ] 链路层 + * [ ] 物理层 ### 并发总结 > 包括各种语言(C++、Java、Python、Go、JS等)、各种操作系统(Linux、Windows)的并发方式的总结。 @@ -23,7 +33,7 @@ ### 刷题 * [x] 每天五个中等题(做好总结) -* [ ] 每天五个中等题(做好总结) +* [x] 每天五个中等题(做好总结) ## 收获 diff --git a/工作日志/2021年8月20日-今日计划.md b/工作日志/2021年8月20日-今日计划.md index a803d24b..99f8c4e1 100644 --- a/工作日志/2021年8月20日-今日计划.md +++ b/工作日志/2021年8月20日-今日计划.md @@ -2,13 +2,13 @@ * [x] 简历修改。项目内容和实习经历 * [x] 项目介绍、主要职责、主要成果。各用一句话完成。 * [x] 实习经历丰富。主要内容,技术难点,最后成果。 - * [ ] 项目和实习详细介绍。把每一部分说的更详细一点,细节搞懂,基础知识搞懂。 + * [x] 项目和实习详细介绍。把每一部分说的更详细一点,细节搞懂,基础知识搞懂。 * [x] ~~准备一份用于算法岗位的简历。~~) * [x] ~~添加tensorflow框架修改的毕业设计。(提高性能)~~发现这个算法真的就是糊弄人。 * [x] ~~添加本次联邦学习与恶意软件检测的毕业设计。~~ ### 投递(上午) -* [ ] 完成一期的简历投递工作 +* [x] 完成一期的简历投递工作 ### 成为一个幽默的人(下午) diff --git a/工作日志/2021年8月21日-今日计划.md b/工作日志/2021年8月21日-今日计划.md index b9b38199..d09deaac 100644 --- a/工作日志/2021年8月21日-今日计划.md +++ b/工作日志/2021年8月21日-今日计划.md @@ -1,4 +1,11 @@ ## 任务 -* [ ] 算法(总结的内容,挨个回顾一下。上次用了两周,这次用一晚上???) - * [ ] 枚举 - * [ ] \ No newline at end of file +* [ ] 算法(理论知识+经典例题) + * [ ] 枚举法 + * [ ] 分治法 + * [ ] 动态规划 + * [ ] 贪心 + * [ ] 分支限界 + * [ ] 回溯 + * [ ] 随机化 + * [ ] 启发式 +* [ ] 基于数据结构的算法复习(理论知识+经典例题。可以每一个部分找一个类似的做一遍。每天也能做10来个了) \ No newline at end of file diff --git a/工作日志/2021年8月22日-今日计划.md b/工作日志/2021年8月22日-今日计划.md index 6f085bc9..4b98c86a 100644 --- a/工作日志/2021年8月22日-今日计划.md +++ b/工作日志/2021年8月22日-今日计划.md @@ -7,4 +7,12 @@ * [ ] go语言的优势。 * [ ] 并发编程(协程,相关内容的了解)。 * [ ] 网络编程 - * [ ] web开发 \ No newline at end of file + * [ ] web开发 + +* [ ] 简历复习 + * [ ] 简历中提到的项目,重新复习项目和相关的专业知识。并整理。 + * [ ] 简历中提到的实习,对实习内容进行重新回顾。相关知识进行整理。(包括Spring、Redis、Grpc、Thrift微服务那一套) + +## 收获 + +* 飞书文档,不可能了。别想了。 \ No newline at end of file diff --git a/工作日志/2021年8月24日-今日计划.md b/工作日志/2021年8月24日-今日计划.md new file mode 100644 index 00000000..924d87e0 --- /dev/null +++ b/工作日志/2021年8月24日-今日计划.md @@ -0,0 +1,19 @@ +## 计划 + +今天(周二) + +* [ ] 阅读他人的中期报告、完成中期报告的架构工作,想好每一部分些什么。 +* [ ] 阅读自己的开题报告、毕业设计、工作规划。补充每一部分已经完成的成果。 + + +明天(周三) + + +* [ ] 查阅相关的算法、技术。对报告内容进行完善。包括完成算法的描述、公式的输入输出和论证、技术的描述(参考学弟的论文) +* [ ] 查阅软件设计绘图的资料。画完所有系统图、技术图。设计好系统和技术。 + + + + + +## 收获 \ No newline at end of file diff --git a/工作日志/2021年9月1日-简历说明.md b/工作日志/2021年9月1日-简历说明.md new file mode 100644 index 00000000..5c7f4a65 --- /dev/null +++ b/工作日志/2021年9月1日-简历说明.md @@ -0,0 +1,179 @@ +# 简历说明 + +* [ ] 需要在面试开始前,花一天时间对简历说明进行整理 +* [ ] 项目和实习经历再熟悉。必须重新阅读一边原先的文档。 + + +## 1 教育经历 +你好。我叫殷康龙,现就读于北京航空航天大学计算机学院,主要研究联邦学习在恶意软件检测领域的应用。本科就读于西北工业大学软件与微电子学院,主修软件工程。 + +在学校主要学习了数据结构与算法、C++程序设计、JavaEE企业级开发、面向对象程序设计、编译原理等课程,综合测评成绩在250人中排名第8。 + +## 2 校园经历 + +在学校里积极参加社团和活动。曾任软微学院科创部干事,参与组织一行代码大赛和程序设计比赛。曾任西工大新闻中心副部长,负责开发新文中心的功能网站,培训技术人员,维护西工大官方微信。 + + +## 4 主要成果 + +* 两次学校一等奖学金,一次华为奖学金,一次国家励志奖学金,一次电子工业出版社助学金,“优秀共青团员”称号 +* 2016-2017年连续两届FIRA机器人世界杯SimuRoSot项目国际特等奖(冠军),Air Challenge项目国际一等奖(亚军) +* 2017中国机器人大赛空中机器人-无人机大战水果项目一等奖 +* 2019年获得国家级大学生创新项目《基于超宽带定位技术的无人机目标追踪系统》和《基于网络爬虫和数据分析的高校信息整合系统》优秀结题 +* 获得《面向学生的校园信息交流系统V1.0》《基于scrapy框架的校园信息爬虫系统》《基于网络爬虫和数据分析的高校信息整合系统》计算机软件著作权 + +## 3 项目经历 + +> 项目概述、主要工作、最终成果 + +### 竞技策略开发——仿真5VS5SimuRosot(√上传) +* 项目概述:15个人的开发团队,长期开发项目,C++、JAVA。工程项目主要包括数据处理模块、前场、后场、边路、底线、特殊策略、定位球策略等,主要用于参加5V5 simurosot的国内比赛和国外比赛。 +* 主要工作:负责开发前场的相关策略,主要包括策略选择模块(优势前场、保守前场、边路前场)、角色选择和切换模块(角色的稳定性,进入退出分开控制。)、目标计算模块(保持相对的阵型,减少阵型的抖动)、移动跑位模块、射门模块。使用PID控制方法对机器人控制,增强了前场的稳定性。使用JAVA为团队开发了数据测试平台,实现了对数据仿真、策略测试、可视化。。搭建团队开发的SVN版本控制系统,方便整个团队项目开发和维护。 +* 关键技术:开发测试平台主要使用java swing开发跨平台图形界面,提供了一系列GUI组件。主要包括数据导入模块、动态演示模块、数据显示模块。使用java io random_accessfile读取并解析file文件。使用java thread实现数据加载与数据展示的并行过程。通过事件监听与响应机制,实现对数据仿真动态演示过程的控制,包括仿真速度调节和仿真进度调节。使用javadoc生成标准的java文档供后续开发使用,方便开发维护。 +![](image/2021-04-06-21-33-39.png) +* 最终成果:暑假期间带领团队前往日照参加了2017中国机器人大赛,前往台湾 参加了FIRA机器人世界杯,取得多项冠军。 + +### 大创项目——基于网络爬虫和数据分析的高校信息整合系统 + +* 项目概述:5个人,Python、MySQL。带领团队申请了《基于超宽带定位技术的无人机目标追踪系统》《基于网络爬虫和数据分析的高校信息整合系统》两个国家级大创项目,后者主要是利用爬虫综合网络信息,搭建web服务器,对数据进行二次处理,使用机器学习算法提供面向用户提供文章推荐功能、标签云索引功能和分类浏览功能,面向信息发布者提供了热点倾向功能、数据分析功能。 +* 主要工作:项目架构、服务器搭建,包括爬虫模块(数据解析模块xpath、URL获取与去重模块)、服务器模块(MySQL数据库设计、Json数据封装)、Android客户端(数据请求模块HTTP请求、数据展示)、数据处理模块。通过Scrapy完成网络信息爬虫,构建了Mysql数据库,使用Django后端框架和Bootstrap前端框架开发了项目网站,使用大数据的算法对信息分析处理,并将整个项目部署到腾讯云提供的CentOS服务器上。使用Github进行代码管理。 + +![](image/2021-04-06-21-18-56.png) +* 关键技术:scrapy框架介绍。使用request模块进行爬虫,通过调度去缓存下一条URL,控制网站访问的频率;使用xpath解析数据内容并将数据存储到mysql数据库中。 +> * (1)Scrapy引擎打开,向爬虫模块请求其需要爬取的起始URLs +> * (2)Scrapy引擎从爬虫模块那里获取到需要爬取的起始URLs,将它们放入调度器模块,作为待爬取的URL Requests; +> * (3)Scrapy 引擎向调度器模块发出请求,获取下一个待爬取页面的URL; +> * (4)调度器模块返回下一个待爬取页面的URL给Scrapy 引擎,Scrapy 引擎则将该 URL 经下载中间件模块(请求方向)转发给下载器; +> * (5)当下载器模块完成页面下载后,会生成一个该页面所对应的 HTTP Response,并将其经下载中间件(响应方向)发送给Scrapy 引擎; +> * (6)Scrapy 引擎从下载器模块处接收到HTTP Response 后,会将其经爬虫中间件模块(输入方向)发送给爬虫模块处理; +> * (7)爬虫模块处理接收到的 HTTP Response,并返回从中爬取到的Items及需要跟进的新的 URLs 给 Scrapy 引擎; +> * (8)Scrapy 引擎将(爬虫模块返回的)Items 转发给数据流水线模块,同时将(爬虫模块返回的)URLs 转发给调度器; +> * (9)以上 2~8 的过程会一直重复执行,直到调度器模块中没有 URL Requests 时,Scrapy 引擎关闭,爬虫停止。 + +![](image/2021-04-06-21-06-32.png) +* 关键技术:Django框架。使用Apache服务器,处理http请求。Django框架,MVC(model-view-control)的代码架构模式。从数据库中获取数据,封装成json格式,最后将响应的数据传递给android客户端。 +![](image/2021-04-06-21-17-24.png) +![](image/2021-04-06-21-58-13.png) +* 关键技术:数据处理算法。 + * 标签计算算法:jieba分词统计词频,TF-IDF算法进行词频统计,去除无关词汇,字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。 + * 分类算法:学科竞赛、科研信息、行政信息、招生信息、招聘就业、校园活动、升学留学、生活娱乐这八类,使用朴素贝叶斯分类器进行分类。(基于贝叶斯公式,可以试图讲解贝叶斯公式) + * 混合推荐算法:基于协同过滤算法提取项目的基本特征(人,文章的特征,通过人阅读的其他文章给出特征,通过相似的人看的其他电影打上相似的标签)。系统采用的KNN算法目的在于匹配项目中K个相似度最高的项目,作为预测推荐输出到用具接口。 +* 最终成果:两个国家级大创项目均获得优秀结题。 + + +### 无人机通信和加密 + +* 项目概述:无人机加密通信项目开发。 +* 主要工作:主要是在Android平台(DJ无人机的地面站android手机开发),使用Java多线程和Socket编程,实现无人机之间的通信连接。主要通过UDP网络通信、心跳测试保持连接、回调处理等方式实现线程通信。在加密通信过程中,使用C++开发加密仿真环境。使用nodejs+electron对通信过程进行可视化。使用网页技术HTML、CSS、JavaScript做前端,使用C++做为本地的后端。通过封装C++通信的代码,提供C++通信接口,供nodejs调用。(代码的封装,接口提供,) +* 主要成果:完成实验室项目验收。 + + + +### TensorFlowIO优化 + +* 项目概述:分析TensorFlow源代码,对源代码进行修改重新编译。使用mmap方法,优化TensorFlow数据加载过程中的IO操作。 +* 主要工作:阅读源代码分析TensorFlow架构,使用多线程以流的方式读取多个文件。mmap封装大文件读取过程。编译并测试TensorFlow最后的优化效果。 + +![](image/2021-04-06-23-26-50.png) +1. 首先阅读了TensorFlow的源代码以及相关的研究资料,对TensorFlow的代码架构进行分析。 +2. 第一层设备通信层,负责网络通信和设备管理。设备管理模块可以实现TensorFlow的异构性,提供了对不同平台不同设备的支持,统一封装成相同的接口,使得上层模块在调用过程中,不必考虑具体的底层实现。通信模块主要通过两种协议实现不同设备之间的通信过程,分别是gRPC协议和RDMA协议。 +3. 第二层内核实现层,实现了核心算子(Operation)与张量(Tensor)的操作。所有的算子都是以张量为操作对象,依赖底层实现张量的内存分配和计算。 +4. 第三层图计算层,实现了计算图(Graph),包括本地计算流图和分布式的计算流图的实现。主要实现了计算图的创建、编译、优化和执行的细节。计算图中的每个节点都是内核实现层中的算子,计算图中的每条边代表内核实现层中的张量。 +5. 第四层API接口层,TensorFlow提供了原始的C API的实现,方便其他语言和平台进行调用。通过C API进一步实现其他语言的API,方便不同语言开发者选择熟悉的语言构建计算图。 +6. 第五层应用层,不同的编程语言通过API接口层调用TensorFlow的内核,实现相关的模型和应用。 + +![](image/2021-04-06-23-28-22.png) + +1. 使用linux的mmap方法申请内存空间,建立内存映射。 +2. 使用platform模块,对底层方法进行封装,实现异常情况处理,并记录内存映射的地址及相关信息,提供上层接口 +3. 利用platform模块提供的内存映射接口,创建读取器,复写父类中的数据读取方法。创建一个读取数据的算子,并注册到内核当中,提供其他语言的接口。 +4. 编写前端,调用内核新方法,使用MmapReader模型进行数据读取。 +5. 重新编译 + +* 最终成果:毕业答辩顺利完成。 + + +## 实习经历 +### 电子钱包JavaEE企业及开发项目 + +* 项目概述:在中科金财上市公司参与电子钱包项目的实习。 +* 主要负责使用Java从合作方获取并解析数据,使用MyBatis存储到MySQL数据库中,并使用Redis做一级数据缓存。使用Spring框架提供信息访问的服务。 +* 2.4 Spring框架应用实践 + * 本项目后端的主要开发框架,是基于java的Spring框架。Spring框架主要依赖与两个重要的特性——控制反转和依赖注入。控制反转(IOC),即控制权的转移,将我们创建对象的方式反转了,以前对象的创建是由我们开发人员自己维护,包括依赖关系也是自己注入。使用了spring之后,对象的创建以及依赖关系可以由spring完成创建以及注入,反转控制就是反转了对象的创建方式,从我们自己创建反转给了程序创建。依赖注入(DI)spring这个容器中,替你管理着一系列的类,前提是你需要将这些类交给spring容器进行管理,然后在你需要的时候,不是自己去定义,而是直接向spring容器索取,当spring容器知道你的需求之后,就会去它所管理的组件中进行查找,然后直接给你所需要的组件。 + * 基于这两种思想实现的Spring容器有许多好处,如降低组件之间的耦合度,实现软件各层之间的解耦。可以使容器提供众多服务如事务管理消息服务处理等等。当我们使用容器管理事务时,开发人员就不需要手工 控制事务,也不需要处理复杂的事务传播。容器提供单例模式支持,开发人员不需要自己编写实现代码。容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能。容器提供众多的辅佐类,使这些类可以加快应用的开发。Spring作为一个容器,可以管理对象的生命周期、对象与对象之间的依赖关系。可以通过配置文件,来定义对象,以及设置与其他对象的依赖关系。 + * 在实践过程中,使用静态工厂方法创建了一系列的java Bean对象,通过配置XML文件,将对象注入到具体执行的类当中。Spring框架本身还保证了事务的原子性、一致性、隔离性和持久性。Spring boot是Spring体系下,为了快速创建应用而提供的一套脚手架服务,用于快速创建网络应用。Spring AOP框架基于代理模式,同时运行时可配置;AOP框架主要针对模块之间的交叉关注点进行模块化。通过maven工具简单的创建Spring boot应用,通过starter中整合了该场景下各种可能用到的依赖,只需要在Maven中引入starter依赖,框架就能自动扫描到要加载的信息并启动相应的默认配置。Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,其本身就是 Spring 框架的一部分,可以与 Spring 无缝集成,性能方面具有先天的优越性,是当今业界最主流的 Web 开发框架之一。Spring boot创建一款开源框架,它提供了 spring-boot-starter-web来为 Web 开发予以支持。spring-boot-starter-web为我们提供了嵌入的Servlet容器以及Spring MVC的依赖,并为Spring MVC提供了大量自动配置,可以适用于大多数 Web 开发场景。 + * 为了使Spring boot应用能够快速加载配置,使用YAML文件快速配置Spring项目的依赖。使用YAML作为属性配置文件,YAML语法使用缩进表示层级关系,对大小写敏感。YAML支持对象、数组、字面量三种数据结构。同时Spring boot通过大量的注解实现配置的绑定和容器的注入。 + * 在部署过程中主要使用了WebJars,WebJars可以将Web前端资源(JS,CSS 等)打成一个个的Jar包,然后将这些Jar包部署到Maven中央仓库中进行统一管理,当 Spring Boot项目中需要引入Web前端资源时,只需将所需资源的pom依赖导入到项目中即可。 + * 在开发前端的时候,开发框架主要使用了基于nodejs的vuejs框架,用于获取并渲染数据到前端页面。使用bootstrap作为模板,构建基于H5的应用页面,能够动态自适应页面的大小,并将页面扁平化。 +* 2.5 数据存储技术 + * 在开发过程中主要使用MySQL关系型数据库存储数据,使用Redis非关系型数据库做数据缓存,使用Spring-MyBatis框架,封装对数据库的增删查改操作。数据操作主要包括两部分,第一部分是从远程接口请求数据,存储到关系型数据库中。第二部分是从关系型数据库中访问数据,返回前端,渲染到页面上。对于第二部分需要Redis做一级缓存,为了加快数据访问。 + * 为了能够进行事务管理,MySQL的数据库引擎选择InnoDB。所有的表都保存在同一个数据文件中,InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。需要更多的内存和存储,会在内存中简历专用的缓冲池用于高速缓冲数据和索引。索引和数据紧密捆绑,索引无压缩,所以体积相对比较大。InnoDB引擎支持外键和索引,支持事务管理和数据库锁。能够保证数据库事务的原子性、一致性等,在三级锁协议下能够保证数据库的串行化访问。MySQL的数据类型主要包括三种:数值类型、字符串类型和时间日期类型。在设计过程中要特别注意,符合BNF范式,保证子段不可分,且不存在冗余。 + * 主要在数据库中创建了各种各样的表格,包括商品表(商品名称、类型、编号、价格、供应商、数量等子段)、订单表(订单类型、订单编号、父订单编号、支付单号、创建时间、当前状态、用户、商户、税费等子段)、用户表(用户名称、用户编号、平台金额、用户身份等子段)。每一张表格代表多个独立的实体,多个表格之间通过外键进行关联。 + * 为了加快数据的访问速度,在MySQL的数据表上创建了各种类型的索引。MySQL中常用的索引结构有:B+树索引和哈希索引两种。目前建表用的B+树索引就是BTREE索引。在MySQL中,MyISAM和InnoDB两种存储引擎都不支持哈希索引。只有HEAP/MEMORY引擎才能显示支持哈希索引。所以主要包括五种类型:唯一索引、主键索引、外键索引、普通索引,复合索引。通过建立索引能够有效的加快访问速度。B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接。在B+树上的常规检索,从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动,而且基于索引的顺序扫描时,也可以利用双向指针快速左右移动,效率非常高MySQL 由连接池、SQL 接口、解析器、优化器、缓存、存储引擎等组成,可以分为三层,即 MySQL Server 层、存储引擎层和文件系统层。MySQL Server 层又包括连接层和 SQL 层。 + * 使用Spring访问数据库的时候,需要手动创建SQL语句,或者通过Spring提供的jdbc链接数据库,根据orm映射规则,自己封装数据库语句。我们在开发的时候,选择了比较流行的MyBatis框架。MyBatis是一个半自动化的 ORM 框架,支持定制化 SQL、存储过程以及高级映射。支持将数据库查出的数据映射到POJO实体类上,而实体到数据库的映射则需要我们自己编写SQL语句实现,相较于Hibernate 这种完全自动化的框架,Mybatis 更加灵活,我们可以根据自身的需求编写sql语句来实现复杂的数据库操作。支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。它消除 了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和 Java 的 POJOs映射成数据库中的记录。利用动态语句的特性,方便快速的拼接访问数据库的SQL语句。 + * Mybatis的功能架构分为三层。API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。 + * 我们首先需要在Spring框架中导入Mybatis的配置在Spring Boot的配置文件中进行配置,指定mapper.xml的位置、实体类的位置、是否开启驼峰命名法等。然后配置数据库链接的信息。在MySQL数据库中创建了多张表,并创建了mapper文件,建立sql语句到java环境的映射,用来访问MySQL数据库。然后在配置文件中注册数据库访问xml,在Spring的java文件中引用该配置,完成对数据库的访问。 + * 为了提升用户的体验,加快前端的访问速度,解决MySQL数据库存储和访问的瓶颈。使用Redis数据库提供了以及数据缓存。使得系统能够快速相应用户的数据存储和访问操作。redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。与MySQL关系型数据库不同,它没有持久话的文件,是暂存在内存中的数据库,没有固定的表结构。Redis数据库作为缓存数据库有许多优势。Redis主要用于以下两种场景:高性能场景,需要执行耗时特别久,且结果不频繁变动的 SQL,就特别适合将运行结果放入Redis缓存。后面的请求就去缓存中读取,使得请求能够迅速响应;高并发场景,在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用 Redis 做一个缓冲操作,让请求先访问到 Redis,然后逐步同步到关系型数据库中。 + * Redis支持丰富的数据类型,包括string,list,set,sorted set,hash。主要由以下几种底层数据类型实现:动态字符串类型,保存字符串的长度、字符串的每个元、buf 数组中未使用的字节数量,能够动态的增加长度,并减少重新分配内存的次数;双向链表,通过多个节点结构就可以组成双向链表。字典又称为符号表或者关联数组、或映射,是一种用于保存键值对的抽象数据结构。跳跃表是一种有序数据结构,它通过在每个节点中维持多个指向其它节点的指针,从而达到快速访问节点的目的。 + * Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。Redis以内存作为数据存储介质,所以读写数据的效率极高,远远超过数据库。以设置和获取一个256字节字符串为例,它的读取速度可高达110000次/s,写速度高达81000次/s。它速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)。支持事务,操作都是原子性。可用于缓存、消息、设置过期时间。Redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。为了解决读写分离模型的缺陷,可以将数据分片模型应用进来。可以将每个节点看成都是独立的master,然后通过业务实现数据分片。 + * Redis有多种持久化方法,RDB方式在指定的时间间隔内,将内存中的数据集快照写入到磁盘。AOF方式以日志的形式记录服务器处理的每一个操作,服务器启动之初,读取文件,重新构建数据库。 + * Redis的底层架构决定了它的性能优势。内部实现采用epoll机制和简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性, 降低IO过程的延迟。 + + +### 字节跳动财经业务部 + +* 项目概述:实现担保交易的系统。 +* 主要负责财经退款业务。完成支付营销预计算、分账后退款等业务需求。基于Kite框架设计实现多个微服务的接口和逻辑,进行项目管理、版本控制、联调测试、报警处理等工作。 + +* 基于gRpc的微服务技术 + * 在开发后期,为了能够更好的适应项目夸大的需求,公司制定新的发展计划,基于grpc重构后端框架,将后端拆解为多个独立的微服务,并行建设发展。很好地保证了各个模块的独立性,提高了开发效率,同时又由于微服务的弹性部署方式,使得系统的鲁棒性增强,服务的效率增高。 + * 微服务一种软件开发技术,面向服务的体系结构(SOA)架构样式的一种变体,将应用程序构造为一组松散耦合的服务。在微服务体系结构中,服务是细粒度的,协议是轻量级的。使得应用系统具备快速响应、灵活部署、敏捷交付、持续演进的特性成为可能。微服务是由以单一应用程序构成的小服务,自己拥有自己的行程与轻量化处理,服务依业务功能设计,以全自动的方式部署,同时服务会使用最小的规模的集中管理能力,服务可以用不同的编程语言与数据库等组件实现 。 + * 微服务架构与敏捷研发流程一脉相承。微服务是将一个完整的系统分割成若干微小的、具备独立性的功能单元,每个功能单元是可以具备一个实际意义的小功能集。各个功能单元之间尽量是解耦或松耦合的,可以实现独立开发而不依赖其他功能单元。而敏捷保证微服务架构能够更好地适应需求的变化,保持团队的高效沟通,敏捷利用小型工作增量、频繁迭代与原型设计等手段,可以使我们摆脱大规模单体软件开发的风险。微服务架构更多地从技术的角度提升开发和运维的效率,而敏捷方法论贯穿了软件工程的整个流程,它重视流程、沟通、协作。可以说,敏捷在管理流程上是对微服务架构落地的有益补充和保障。微服务的开发大致遵循DevOps的流程和原则,一个软件从零开始到最终交付,大概包括以下几个阶段:规划、编码、构建、测试、发布、部署和维护。DevOps是一组过程、方法与系统的统称,用于促进开发、技术运营和质量保障(QA)部门之间的沟通、协作与整合。通过自动化流程来使得软件整体过程更加快捷和可靠。用于实现敏捷开发的目标。 + * 我们研究了微服务主要面临的问题,主要是故障的排查,通过多方考虑建立了微服务的故障排查系统。首先是微服务的监控系统(指标接口),实时监控流量的运转,尽量能够快速的发现存在的潜在问题,包括一些设定的报警规则,如网络流量异常、内存占用异常、数据库链接异常、响应延迟异常、qps导致某个节点不堪重负等。让各个组件提供报告自己当前状态的接口(metrics接口),这个接口输出的数据格式应该是一致的。然后部署一个指标采集器组件,定时从这些接口获取并保持组件状态,同时提供查询服务。最后还需要一个UI,从指标采集器查询各项指标,绘制监控界面或者根据阈值发出告警。我们最终使用RedisExporter和MySQLExporter,这两个组件分别提供了Redis缓存和MySQL数据库的指标接口。微服务则根据各个服务的业务逻辑实现自定义的指标接口。然后采用Prometheus作为指标采集器,Grafana配置监控界面和邮件告警。 + * 然后是通过链路跟踪系统,定位问题出现的位置。使用Zipkin工具,实现链路的跟踪过程,实现每一个节点的日志收集。为了能够快速的实现日志分析,使用ELK日志分析组件。包括一个日志搜索引擎、日志收集存储器和UI组件。为了能够控制微服务的访问权限,进行服务治理,搭建了一套网关系统。在调用者和被调用者中间加一层网关,每次调用时进行权限校验。另外,网关也可以作为一个提供服务接口文档的平台。能够进行各个微服务的接口管理,通过页面访问和调试微服务。 + * 由于微服务的扩充速度比较快速,最终搭建了一个微服务的注册和发现系统。每当有新的微服务或者微服务的某个新节点出现的时候,完成服务信息发布、存活检测、客户端负载均衡等任务。各个应用服务在启动时自动将自己注册到服务发现服务上。并且应用服务启动后会实时(定期)从服务发现服务同步各个应用服务的地址列表到本地。服务发现服务也会定期检查应用服务的健康状态,去掉不健康的实例地址。服务发现系统还会进行服务之间的负载均衡,防止某一个服务流量过大,称为微服务链路上的流量瓶颈。 + * 在实现微服务系统的时候,还考虑了大量的其他安全性可靠性内容。包括建立链路上的熔断机制,当多次访问一个服务失败时,应熔断,标记该服务已停止工作,直接返回错误。直至该服务恢复正常后再重新建立连接。建立了微服务的多级测试系统,服务本地的单元测试,整个服务的测试,端到端测试(覆盖这个服务调用链的测试)。 + * 在构建微服务系统的核心关键技术是gRpc。gRPC是由Google公司开源的一款高性能的远程过程调用(RPC)框架,可以在任何环境下运行。该框架提供了负载均衡,跟踪,智能监控,身份验证等功能,可以实现系统间的高效连接。另外,在分布式系统中,gRpc框架也有有广泛应用,实现移动端、浏览器等和服务器的连接。gRPC支持多种语言的实现,因此gRPC支持客户端与服务器在多种语言环境中部署运行和互相调用。gRPC使用ProtoBuf来定义服务,ProtoBuf是由Google开发的一种数据序列化协议(类似于XML、JSON、hessian)。ProtoBuf能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面。压缩和传输效率高,语法简单,表达力强。 + * gRPC 的协议设计上使用了HTTP2。HTTP2 提供了连接多路复用、双向流、服务器推送、请求优先级、首部压缩等机制。可以节省带宽、降低TCP链接次数、节省CPU,帮助移动设备延长电池寿命等。gRPC主流分布式方案有以下三个etcd, zookeeper, consul,最终选择使用consul实现服务的注册与负载均衡的实现。 + * 我们通过proto文件定义了数据结构和服务接口。可以通过流模式实现服务器和客户端的调用。集成了TLS验证方法,用于识别客户端和服务器,增强通信的安全性。使用SSL/TLS协议对通信连接进行安全加密,是通过非对称加密的方式来实现的。在加密过程中:客户端想要向服务器发起链接,首先会先向服务端请求要加密的公钥。获取到公钥后客户端使用公钥将信息进行加密,服务端接收到加密信息,使用私钥对信息进行解密并进行其他后续处理,完成整个信道加密并实现数据传输的过程。客户端调用服务时,客户端gRPC库使用协议缓冲区,并编组(marshal)远程过程调用,该调用随后通过HTTP2来发送。在服务器端,请求解组(un-marshalled),使用协议缓冲区执行相应的过程调用。响应遵循从服务器到客户端的类似的执行流程。 +* 支付与退款逻辑处理 + * 作为电子钱包财经部分的核心业务,其最大的困难点在于业务场景的理解和负责业务需求的实现,技术上的难点通过之前的分析已经实现了。 + * 首先最大的难点是建立后端的订单子系统,实现后端订单的数据流图。业务方可能会产生多种类型的订单,例如在购物的时候,会生成shop单、商户单、商品单,退款的时候根据退款创建的时间不同,可能产生各种类型的退款单,通过区分是否在售后内或者超售后,是否满足优质用户的急速退款条件,订单是否已经分账,产生不同类型的退款单。在财经部分,根据业务方的需求,建立财经部分的订单系统,该系统主要融合了业务方订单和支付方订单。业务方订单包括shop单、sku单、商品单等,财经部分订单包括四种主要的类型,商品单、支付单、分账单、退分账单、补贴单、推补贴单、退款单等。退款中会生成退款单包括多种类型,如退款子单、急速退款单、退分账单、退补贴单、退税单等。由于支付场景负责,各种订单的准确性必须要有保证。 + * 财经部分最重要的是对金额和流水的保证。建立了从上到下的对账系统,通过流水信息、数据库信息、日志信息等,进行不间断的对账,保证了交易金额的准确性。杜绝发生严重的金融风险。同时增强开发人员的金融管控意识。防止出现资金安全问题。在技术上,使用GO语言重构了后端的微服务,包括一系列配套的微服务工具的应用。如上一节提到的微服务的技术选型:服务注册与发现机制(consul)、敏捷开发流程(devops)、远程调用方式(thrift)、服务监控平台(Grafana)、数据分析平台(Hive)、链路系统跟踪平台、服务网关(Gateway)等。实现一系列微服务开发、部署、运维任务。 + * 在担保交易系统中,总的业务流可以分为四个部分:支付、分账、退款、提现。当用户付款后(自有支付、第三方支付),不能立即存到商家的账户中,需要暂存到商家的待结算户中,防止出现资金安全问题。当用户点击确认收款后,资金从商家的待结算户,分账到商家账户和其他分账方的账户(达人带货分账、平台营销分账等),其中还涉及到平台的营销问题。当用户发起退款是,会根据不同的情况,走完全不同的退款流程,主要包括普通退款、分账前退款、分账后退款、超售后退款和急速退款。其中每一种业务都被划分为一个独立的微服务,可能部署在不同的虚拟机上,存在大量远程调用过程。 + * 当时负责支付营销预计算和分账后退款两个业务,涉及担保退款、退款请求、财经核心微服务,整个服务链包括十几个业务,我负责其中的三个。担保退款业务负责接收来自其他应用的退款请求,查询数据库中的订单,校验请求的准确性,同时通过幂等校验对重复的请求进行处理。退款请求业务,接收担保退款微服务的请求,对请求进一步校验,根据订单状态、支付状态、业务方的需求将退款业务划分为不同的退款方式(急速退款、普通退款、分账后退款、超售后退款等),然后执行不同的退款逻辑。每一种退款都实现了统一的接口,需要校验大量的请求参数和订单内容,保证请求和订单的一致性,需要调用电商接口,计算每一个分账方的分账金额,根据分账方的分分钟金额校验账单系统中的分账单,针对每一个分账单,生成分账的退款单,然后请求支付核心,将商家待结算户中的金额退给用户。如果已经部分分账,需要将所有分账的金额退到商家现金户,推进分账进程,然后从商家的现金户,将金额退还给支付账户,并将平台补贴金额退回。每次退款过程前,需要事先请求计算支付营销金额,如果保证金额正确才可以进行后续的退款,否则返回退款失败。 + +## 5 个人能力 + +1. C++后端开发、Java/Go/Python/Nodejs后端开发、Mysql数据库 +2. 主要关于项目开发中某一方面的知识经验总结 + + +* 网络编程(各种语言的实现方法。异步并发,并发通信方式。) + +* web开发(自己所开发过的web网站。主要用到的框架和技术。) + +* 并行编程(各种语言实现并发编程的手段和方式,例如协程、多线程、多进程等) + +## 6 个人性格 + +1. 乐观开朗,心里素质较强,喜欢积极的应对生活中的困难。待人友善,团结合作,有较强的领导能力、组织能力和团队精神。勤奋好学,思维敏捷,自学能力强。 +2. 具有良好的专业能力,基础知识扎实。参与了多个项目的开发过程,具有丰富的项目开发经验。对软件工程领域的知识有很高的热情,希望通过自己的努力,创作完美的作品。 + + +## 7 补充项目 + +### ~~补充项目——软件与微电子学院学生信息系统。PHPweb开发~~(----丢失) +* 项目概述:20个人组成的团队,PHP、MySQL。系统主要包括任务管理系统、证书认证系统、请销假平台、项目管理、活动,会议记录、党建系统、文件管理系统、就业记录等子系统。使用PHP作为后端开发脚本,使用MVCyii框架进行开发。 +* 主要工作:构建数据库。使用yii框架实现请销假平台,包括表单管理和MySQL数据库访问。yii框架是MVC结构。由controller处理逻辑内容,model封装数据库访问,view视图作为界面,用来渲染数据,发送到前端。 +![](image/2021-04-06-20-19-05.png) +* 最终成果:开发完成暑期项目实践,项目成功验收。 + + +### ~~补充项目——企业级开发JavaEE项目考试系统~~(√上传) +> 因为是java项目,等日后学完java再写 + +### ~~补充项目——windows通信编程。多人聊天室~~(√上传) +* 项目概述:单人项目开发。 +* 主要工作:MFC开发界面、windows网络通信。 +* 主要成果:课设。 \ No newline at end of file diff --git a/毕业设计/2021-01-05-20-08-00.png b/工作日志/image/2021-01-05-20-08-00.png similarity index 100% rename from 毕业设计/2021-01-05-20-08-00.png rename to 工作日志/image/2021-01-05-20-08-00.png diff --git a/工作日志/image/2021-08-24-19-24-32.png b/工作日志/image/2021-08-24-19-24-32.png new file mode 100644 index 00000000..d526790b Binary files /dev/null and b/工作日志/image/2021-08-24-19-24-32.png differ diff --git a/工作日志/image/2021-08-24-19-31-58.png b/工作日志/image/2021-08-24-19-31-58.png new file mode 100644 index 00000000..d17a85ac Binary files /dev/null and b/工作日志/image/2021-08-24-19-31-58.png differ diff --git a/工作日志/中期报告.md b/工作日志/中期报告.md index 22feb31c..0e5354bd 100644 --- a/工作日志/中期报告.md +++ b/工作日志/中期报告.md @@ -1,3 +1,61 @@ +1 论文研究计划 +研究背景和意义以及存在的问题(毕设第一章,前三节) + Android恶意软件迫在眉睫深度学习算法非常好用隐私保护提上日程数据和隐私矛盾不可调和。联邦学习提出解决矛盾。但在恶意软件检测中,存在很大问题(例如数据梯度导致的隐私泄露、数据非独立同分布导致的准确率下降)。 +研究目标(毕设第一章,第四节) + 对于联邦学习应用在恶意软件检测中的数据的隐私保护问题和非独立同分布问题(这样描述问题要比原来的清晰),我们分别提出了解决方案。并将这两个问题的解决方案融合成一个可扩展的、可复用的基于联邦学习的恶意软件模型训练和检测系统。 +研究内容(毕设第一章,第五节) + 基于差分隐私的联邦学习框架主要包括三部分。首先建立恶意软件模型训练过程的威胁模型。然后将差分隐私应用到联邦学习的梯度保护当中,构建基于差分隐私的联邦学习框架。最后通过隐私计算和实验研究,验证隐私保护的效力和模型训练过程的鲁棒性。 + 基于贡献度的联邦元学习框架主要包括三部分。首先对恶意软件中的独立同分布问题进行建模,分析产生非独立同分布的原因,并提出了一种衡量非独立同分布的方案,通过理论分析和实验验证,数据非独立同分布对恶意软件检测模型的训练,会造成重大影响。然后将元学习的思想应用到联邦学习的训练过程中,构建一个个性化的联邦元学习框架。提出了一种衡量模型贡献度的方案,在联邦元学习的基础上,在客户端基于用户的贡献度进行聚合,实现基于贡献度的联邦元学习框架。然后通过理论分析和实验验证,该框架的有效性。 + 基于联邦学习的恶意软件模型训练和检测系统,主要包括三部分。核心层的建设和实现,主要包括各种算法核心、隐私保护方法核心等等。基于gRpc微服务的联邦学习系统。业务流层的创建和定制。算法控制、过程监测和结果分析的可视化实现。创新点:将云端的微服务系统用于边缘学习的联邦学习系统的构建。将客户端视作提供知识的微服务,向服务器注册自己的服务类型,服务器根据需求,创建服务的业务流,与客户端一同协作,完成训练过程。 + +论文的研究计划 + 粘贴之前的研究成果。 +预期的研究成果(毕设第一章,第六节论文组织与安排) + 小论文或者使用微服务系统发表专利。 + +2 已完成的相关工作 +研究现状(毕设第一章,国内外研究现状) +理论研究(关于恶意软件、联邦学习、非独立同分布等问题的理论分析)(毕设第二章,相关技术和理论研究中的理论部分) +恶意软件数据预处理 +算法提出(基于差分隐私的隐私保护算法、基于联邦元学习的非独立同分布算法)(毕设第三章、第四章) +实验研究(各种算法的复现工作、算法的实现工作、实验结果的对比工作)(毕设第五章) +系统构建(基于微服务架构的联邦学习框架和恶意软件检测系统)(毕设第六章) + + + +(图:联邦学习框架图、恶意软件检测系统架构图) +(算法:主要算法) +(公式:非独立同分布的建模公式、算法的推导公式) + +3 关键技术或难点(参考开题的内容,把系统各个模块拆解放到这里)(毕设第二章,相关理论和技术中的技术部分,以及三个研究点的三个难点部分,存在的挑战) +恶意软件特征提取技术 +威胁模型和隐私计算方法 +面向非独立同分布问题的联邦学习算法 +基于微服务架构的系统构建 + +4 下一阶段的工作计划 +存在的问题 + 系统构建中的问题 + 算法的稳定性存在问题。收敛速度较慢,需要进一步调试,找到合适的参数。 +尚未完成的工作 + 威胁模型和隐私计算的实践。隐私保护问题的 +后期工作的设想和安排 + 九月份实现基于差分隐私的隐私保护方法。 + 十月份完成实验和系统。 + 十一月份完成最终的论文。 + + +参考文献 + + + + + 按照毕业论文的水准来写研究背景、研究目标、研究内容。把引用的文献写清楚。 + 已经完成的工作尽量详细点。按照毕业论文理论和实验部分的要求来写。 + 每一个技术或者内容的名字现在应该固定下来。不应该这么随意了。 + 对框架和系统部分进行区分。(是算法框架,是一种模式。系统是对这种模式的实现。) + 命名规范确定一下(基于联邦学习的恶意软件检测系统?面向恶意软件检测的联邦学习系统)搞明白啊,术语不统一自己也很凌乱。 +  l 开题报告中确定的论文研究计划,按计划应该完成的工作; @@ -5,17 +63,37 @@ l 已完成的论文研究工作和取得的阶段性成果; l 存在的问题、尚未完成的工作及后期工作的设想和安排。 - - - - 截止时间为2021年8月30日 分组,学生才能打印中期检查表 报告时间15分钟左右,其中学生汇报不超过10分钟,专家提问不超过5分钟。 +![](image/2021-08-24-19-31-58.png) +![](image/2021-08-24-19-24-32.png) + + gRPC中默认支持两种授权方式,分别是:SSL/TLS认证方式、基于Token的认证方式。 + +1.1 SSL/TLS认证方式 +  SSL全称是Secure Sockets Layer,又被称之为安全套接字层,是一种标准安全协议,用于在通信过程中建立客户端与服务器之间的加密链接。 + +  TLS的全称是Transport Layer Security,TLS是SSL的升级版。在使用的过程中,往往习惯于将SSL和TLS组合在一起写作SSL/TLS。 + +  简而言之,SSL/TLS是一种用于网络通信中加密的安全协议。 + +1.1.1 SSL/TLS工作原理 +  使用SSL/TLS协议对通信连接进行安全加密,是通过非对称加密的方式来实现的。所谓非对称加密方式又称之为公钥加密,密钥对由公钥和私钥两种密钥组成。私钥和公钥成对存在,先生成私钥,通过私钥生成对应的公钥。公钥可以公开,私钥进行妥善保存。 + +  在加密过程中:客户端想要向服务器发起链接,首先会先向服务端请求要加密的公钥。获取到公钥后客户端使用公钥将信息进行加密,服务端接收到加密信息,使用私钥对信息进行解密并进行其他后续处理,完成整个信道加密并实现数据传输的过程。 +服务端启动并且向注册中心发送服务信息,注册中心收到后会定时监控服务状态(常见心跳检测); +客户端需要开始调用服务的时候,首先去注册中心获取服务信息; +客户端创建远程调用连接,连接后服务端返回处理信息; +1.1.2 制作证书 +  可以自己在本机计算机上安装openssl,并生成相应的证书。 + +openssl ecparam -genkey -name secp384r1 -out server.key +openssl req -new -x509 -sha256 -key server.key -out server.pem -days 3650 1. 面向恶意软件的联邦元学习算法 2. 融合差分隐私的隐私保护技术 diff --git a/工作日志/实践报告.md b/工作日志/实践报告.md new file mode 100644 index 00000000..f2cba1b8 --- /dev/null +++ b/工作日志/实践报告.md @@ -0,0 +1,100 @@ + + + + +全日制专业学位研究生 +专业实习环节总结报告 + + + +学 院 计算机学院 +姓 名 殷康龙 +学 号 ZY1906614 +导 师 吕良双 + + + + +北京航空航天大学研究生院 +2020年 8月 24 日 +  +一、实习目的 +深入公司内部,更广泛的接触公司的开发人员。切身地参与到开发团队中,了解如何与团队中的其他人沟通,大家之间通过什么样的方式相互合作共同促进,向其他人学习专业技术和工作方式,从而能与周围人一起成长,成为公司中需要的人才。同时学习大家如何进行高效的沟通,在会议或者协商过程中,如何快速表达自己的意图,同时又理解别人的观点,大家如何通过相互合作完成一个项目,从项目需求的提出、需求开发、本地测试、联调测试、项目上线、报警处理等一系列工作流程的学习。 +了解公司部门的构成和职能。了解企业内部行政工作的工作流程,包括绩效考核、日常考勤、资金申请等过程,适应公司的工作环境,从而确立自己在公司中的工作定位,为自己的职业生涯规划起到关键作用。同时了解一个企业的文化魅力,通过领导和同事的交流沟通,发现公司的价值所在,从而对工作和未来有所期待。 +将学习到的理论知识应用到实践当中。反过来检验计算机书本上知识的正确性。在学校期间学习了数据库、计算机网络、操作系统等理论知识,还学习了C++、Python、Java等变成语言,积累了大量的编程思想,虽然也做过一些小项目小demo,但是距离企业生产的实际要求还相差甚远。希望在这一次专业实践中,能够尽量将理论知识应用到时间过程中,检验日常学习的效果,加强自己平时学习到的内容。 +了解当前的发展前沿。计算机是一个发展迅速的行业,每年每天都会产生一堆新技术,淘汰一堆旧技术,在课本上学到的,可能与社会上技术的版本相差了好几代。需要切身地投入到实际的生产生活中,学习一些新技术、新方法、新思想。从而用最先进的观点武装自己,让自己在后续的就业中更有竞争力。 +二、实习内容 +2.1 专业实践单位介绍 +北京中科金财科技股份有限公司成立于2003年12月,是国内领先的区块链技术与金融科技综合服务商,致力于打造领先的产业互联网科技赋能平台。2012年2月28日公司在深圳证券交易所成功上市。中科金财一直以来为人民银行、银保监会、证监会、银联、银行间交易商协会、支付清算协会及上百家银行及金融机构客户提供金融科技综合服务及转型综合服务,是国内领先的金融科技综合服务商和数据中心综合服务商。 +2.2 专业实践项目介绍 +本次专业实践的项目为“基于微服务系统的电子钱包”项目。本项目主要涉及三个领域,包括区块链技术、数字金融和开放银行。 +基于区块链技术搭建中科金链平台,由北京中科金财科技股份有限公司研发的企业级区块链基础平台。为客户提供区块链基础平台及应用开发服务降低客户使用区块链的技术门槛,为客户提供区块链技术产品、解决方案、业务软件开发等全流程服务。通过不断的突破创新,累积了大量的区块链核心技术,并与多领域的重要龙头合作伙伴携手共建“区块链平台+金融/监管/民生领域”的区块链生态系统。中科金财致力于成为领先的产业互联网科技赋能平台,公司面向政府监管部门、金融机构、产业互联网、工业互联网用户提供基于区块链BaaS(区块链即服务)平台与多方安全计算平台的技术服务,以解决防篡改、隐私保护、可追溯等痛点。始于金融科技,放眼价值互联。未来,中科金财将以区块链BAAS服务平台、多方安全计算平台、区块链公共服务平台为基础,继续以科技服务金融和监管,携手合作伙伴,深耕行业场景,帮助产业客户实现从IT到DT到AT的技术升级 +数字金融平台。帮助传统银行进行数字化转型,数字化时代市场需求在变化,数字化将成为银行业下阶段的最不可忽视的战略重点。金融服务模式在不断革新,传统银行的数字化转型势在必行,数字化将成为银行业下阶段的最不可忽视的战略重点。数字化风暴给银行业带来了机遇,同时也带来了新的挑战。 +开放银行系统。银行把自己的金融服务,通过安全的Open API或SDK等技术开放给高频场景和客户。其本质是银行放弃单一的成本较高的直销获客方式,转为与线上线下高频大流量场景方合作,通过输出账户、支付、存款、交易、融资产品、投资产品等金融服务能力,以更快速、更高频、更低成本获得客户,并提供极其便捷的场景化、个性化的金融服务。 +该项目涉及多个领域多种技术的融合。包括前后端的开发人员、隐私计算与区块链的专业技术人员、与大型银行公司合作的对接人员,项目开发人员的规模超过百人,是大型的创新立项项目,旨在打造一套全平台的,融合银行、企业的数字生态系统。为传统的银行提供数字化赋能。 +2.3 实践工作岗位介绍 +本次实践的岗位为电子钱包组后端开发人员。该工作岗位涉及到与前后端的沟通,融合数据存储和业务处理两部分内容,访问其他企业提供的远端接口,根据用户的请求完成业务逻辑处理,根据前端的展示需求提供数据访问服务。 +主要的工作内容,基于微服务框架,构建后端的微服务系统。首先根据业务需求,与前端对接,提供必要的数据访问和业务处理接口。然后与其他企业对接,从开发的接口中,获取其他企业的对接数据,对数据进行初步处理,并存储到后端数据库中。然后根据用户的支付下单需求和退款等业务需求,完成相应的业务逻辑处理。 +2.4 Spring框架应用实践 +本项目后端的主要开发框架,是基于java的Spring框架。Spring框架主要依赖与两个重要的特性——控制反转和依赖注入。控制反转(IOC),即控制权的转移,将我们创建对象的方式反转了,以前对象的创建是由我们开发人员自己维护,包括依赖关系也是自己注入。使用了spring之后,对象的创建以及依赖关系可以由spring完成创建以及注入,反转控制就是反转了对象的创建方式,从我们自己创建反转给了程序创建。依赖注入(DI)spring这个容器中,替你管理着一系列的类,前提是你需要将这些类交给spring容器进行管理,然后在你需要的时候,不是自己去定义,而是直接向spring容器索取,当spring容器知道你的需求之后,就会去它所管理的组件中进行查找,然后直接给你所需要的组件。 +基于这两种思想实现的Spring容器有许多好处,如降低组件之间的耦合度,实现软件各层之间的解耦。可以使容器提供众多服务如事务管理消息服务处理等等。当我们使用容器管理事务时,开发人员就不需要手工 控制事务,也不需要处理复杂的事务传播。容器提供单例模式支持,开发人员不需要自己编写实现代码。容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能。容器提供众多的辅佐类,使这些类可以加快应用的开发。Spring作为一个容器,可以管理对象的生命周期、对象与对象之间的依赖关系。可以通过配置文件,来定义对象,以及设置与其他对象的依赖关系。 +在实践过程中,使用静态工厂方法创建了一系列的java Bean对象,通过配置XML文件,将对象注入到具体执行的类当中。Spring框架本身还保证了事务的原子性、一致性、隔离性和持久性。Spring boot是Spring体系下,为了快速创建应用而提供的一套脚手架服务,用于快速创建网络应用。Spring AOP框架基于代理模式,同时运行时可配置;AOP框架主要针对模块之间的交叉关注点进行模块化。通过maven工具简单的创建Spring boot应用,通过starter中整合了该场景下各种可能用到的依赖,只需要在Maven中引入starter依赖,框架就能自动扫描到要加载的信息并启动相应的默认配置。Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,其本身就是 Spring 框架的一部分,可以与 Spring 无缝集成,性能方面具有先天的优越性,是当今业界最主流的 Web 开发框架之一。Spring boot创建一款开源框架,它提供了 spring-boot-starter-web来为 Web 开发予以支持。spring-boot-starter-web为我们提供了嵌入的Servlet容器以及Spring MVC的依赖,并为Spring MVC提供了大量自动配置,可以适用于大多数 Web 开发场景。 +为了使Spring boot应用能够快速加载配置,使用YAML文件快速配置Spring项目的依赖。使用YAML作为属性配置文件,YAML语法使用缩进表示层级关系,对大小写敏感。YAML支持对象、数组、字面量三种数据结构。同时Spring boot通过大量的注解实现配置的绑定和容器的注入。 +在部署过程中主要使用了WebJars,WebJars可以将Web前端资源(JS,CSS 等)打成一个个的Jar包,然后将这些Jar包部署到Maven中央仓库中进行统一管理,当 Spring Boot项目中需要引入Web前端资源时,只需将所需资源的pom依赖导入到项目中即可。 +在开发前端的时候,开发框架主要使用了基于nodejs的vuejs框架,用于获取并渲染数据到前端页面。使用bootstrap作为模板,构建基于H5的应用页面,能够动态自适应页面的大小,并将页面扁平化。 +2.5 数据存储技术 +在开发过程中主要使用MySQL关系型数据库存储数据,使用Redis非关系型数据库做数据缓存,使用Spring-MyBatis框架,封装对数据库的增删查改操作。数据操作主要包括两部分,第一部分是从远程接口请求数据,存储到关系型数据库中。第二部分是从关系型数据库中访问数据,返回前端,渲染到页面上。对于第二部分需要Redis做一级缓存,为了加快数据访问。 +为了能够进行事务管理,MySQL的数据库引擎选择InnoDB。所有的表都保存在同一个数据文件中,InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。需要更多的内存和存储,会在内存中简历专用的缓冲池用于高速缓冲数据和索引。索引和数据紧密捆绑,索引无压缩,所以体积相对比较大。InnoDB引擎支持外键和索引,支持事务管理和数据库锁。能够保证数据库事务的原子性、一致性等,在三级锁协议下能够保证数据库的串行化访问。MySQL的数据类型主要包括三种:数值类型、字符串类型和时间日期类型。在设计过程中要特别注意,符合BNF范式,保证子段不可分,且不存在冗余。 +主要在数据库中创建了各种各样的表格,包括商品表(商品名称、类型、编号、价格、供应商、数量等子段)、订单表(订单类型、订单编号、父订单编号、支付单号、创建时间、当前状态、用户、商户、税费等子段)、用户表(用户名称、用户编号、平台金额、用户身份等子段)。每一张表格代表多个独立的实体,多个表格之间通过外键进行关联。 +为了加快数据的访问速度,在MySQL的数据表上创建了各种类型的索引。MySQL中常用的索引结构有:B+树索引和哈希索引两种。目前建表用的B+树索引就是BTREE索引。在MySQL中,MyISAM和InnoDB两种存储引擎都不支持哈希索引。只有HEAP/MEMORY引擎才能显示支持哈希索引。所以主要包括五种类型:唯一索引、主键索引、外键索引、普通索引,复合索引。通过建立索引能够有效的加快访问速度。B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接。在B+树上的常规检索,从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动,而且基于索引的顺序扫描时,也可以利用双向指针快速左右移动,效率非常高MySQL 由连接池、SQL 接口、解析器、优化器、缓存、存储引擎等组成,可以分为三层,即 MySQL Server 层、存储引擎层和文件系统层。MySQL Server 层又包括连接层和 SQL 层。 +使用Spring访问数据库的时候,需要手动创建SQL语句,或者通过Spring提供的jdbc链接数据库,根据orm映射规则,自己封装数据库语句。我们在开发的时候,选择了比较流行的MyBatis框架。MyBatis是一个半自动化的 ORM 框架,支持定制化 SQL、存储过程以及高级映射。支持将数据库查出的数据映射到POJO实体类上,而实体到数据库的映射则需要我们自己编写SQL语句实现,相较于Hibernate 这种完全自动化的框架,Mybatis 更加灵活,我们可以根据自身的需求编写sql语句来实现复杂的数据库操作。支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。它消除 了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和 Java 的 POJOs映射成数据库中的记录。利用动态语句的特性,方便快速的拼接访问数据库的SQL语句。 +Mybatis的功能架构分为三层。API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。 +我们首先需要在Spring框架中导入Mybatis的配置在Spring Boot的配置文件中进行配置,指定mapper.xml的位置、实体类的位置、是否开启驼峰命名法等。然后配置数据库链接的信息。在MySQL数据库中创建了多张表,并创建了mapper文件,建立sql语句到java环境的映射,用来访问MySQL数据库。然后在配置文件中注册数据库访问xml,在Spring的java文件中引用该配置,完成对数据库的访问。 +为了提升用户的体验,加快前端的访问速度,解决MySQL数据库存储和访问的瓶颈。使用Redis数据库提供了以及数据缓存。使得系统能够快速相应用户的数据存储和访问操作。redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。与MySQL关系型数据库不同,它没有持久话的文件,是暂存在内存中的数据库,没有固定的表结构。Redis数据库作为缓存数据库有许多优势。Redis主要用于以下两种场景:高性能场景,需要执行耗时特别久,且结果不频繁变动的 SQL,就特别适合将运行结果放入Redis缓存。后面的请求就去缓存中读取,使得请求能够迅速响应;高并发场景,在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用 Redis 做一个缓冲操作,让请求先访问到 Redis,然后逐步同步到关系型数据库中。 +Redis支持丰富的数据类型,包括string,list,set,sorted set,hash。主要由以下几种底层数据类型实现:动态字符串类型,保存字符串的长度、字符串的每个元、buf 数组中未使用的字节数量,能够动态的增加长度,并减少重新分配内存的次数;双向链表,通过多个节点结构就可以组成双向链表。字典又称为符号表或者关联数组、或映射,是一种用于保存键值对的抽象数据结构。跳跃表是一种有序数据结构,它通过在每个节点中维持多个指向其它节点的指针,从而达到快速访问节点的目的。 +Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。Redis以内存作为数据存储介质,所以读写数据的效率极高,远远超过数据库。以设置和获取一个256字节字符串为例,它的读取速度可高达110000次/s,写速度高达81000次/s。它速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)。支持事务,操作都是原子性。可用于缓存、消息、设置过期时间。Redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。为了解决读写分离模型的缺陷,可以将数据分片模型应用进来。可以将每个节点看成都是独立的master,然后通过业务实现数据分片。 +Redis有多种持久化方法,RDB方式在指定的时间间隔内,将内存中的数据集快照写入到磁盘。AOF方式以日志的形式记录服务器处理的每一个操作,服务器启动之初,读取文件,重新构建数据库。 +Redis的底层架构决定了它的性能优势。内部实现采用epoll机制和简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性, 降低IO过程的延迟。 +2.6 基于gRpc的微服务技术 +在开发后期,为了能够更好的适应项目夸大的需求,公司制定新的发展计划,基于grpc重构后端框架,将后端拆解为多个独立的微服务,并行建设发展。很好地保证了各个模块的独立性,提高了开发效率,同时又由于微服务的弹性部署方式,使得系统的鲁棒性增强,服务的效率增高。 +微服务一种软件开发技术,面向服务的体系结构(SOA)架构样式的一种变体,将应用程序构造为一组松散耦合的服务。在微服务体系结构中,服务是细粒度的,协议是轻量级的。使得应用系统具备快速响应、灵活部署、敏捷交付、持续演进的特性成为可能。微服务是由以单一应用程序构成的小服务,自己拥有自己的行程与轻量化处理,服务依业务功能设计,以全自动的方式部署,同时服务会使用最小的规模的集中管理能力,服务可以用不同的编程语言与数据库等组件实现 。 +微服务架构与敏捷研发流程一脉相承。微服务是将一个完整的系统分割成若干微小的、具备独立性的功能单元,每个功能单元是可以具备一个实际意义的小功能集。各个功能单元之间尽量是解耦或松耦合的,可以实现独立开发而不依赖其他功能单元。而敏捷保证微服务架构能够更好地适应需求的变化,保持团队的高效沟通,敏捷利用小型工作增量、频繁迭代与原型设计等手段,可以使我们摆脱大规模单体软件开发的风险。微服务架构更多地从技术的角度提升开发和运维的效率,而敏捷方法论贯穿了软件工程的整个流程,它重视流程、沟通、协作。可以说,敏捷在管理流程上是对微服务架构落地的有益补充和保障。微服务的开发大致遵循DevOps的流程和原则,一个软件从零开始到最终交付,大概包括以下几个阶段:规划、编码、构建、测试、发布、部署和维护。DevOps是一组过程、方法与系统的统称,用于促进开发、技术运营和质量保障(QA)部门之间的沟通、协作与整合。通过自动化流程来使得软件整体过程更加快捷和可靠。用于实现敏捷开发的目标。 +我们研究了微服务主要面临的问题,主要是故障的排查,通过多方考虑建立了微服务的故障排查系统。首先是微服务的监控系统(指标接口),实时监控流量的运转,尽量能够快速的发现存在的潜在问题,包括一些设定的报警规则,如网络流量异常、内存占用异常、数据库链接异常、响应延迟异常、qps导致某个节点不堪重负等。让各个组件提供报告自己当前状态的接口(metrics接口),这个接口输出的数据格式应该是一致的。然后部署一个指标采集器组件,定时从这些接口获取并保持组件状态,同时提供查询服务。最后还需要一个UI,从指标采集器查询各项指标,绘制监控界面或者根据阈值发出告警。我们最终使用RedisExporter和MySQLExporter,这两个组件分别提供了Redis缓存和MySQL数据库的指标接口。微服务则根据各个服务的业务逻辑实现自定义的指标接口。然后采用Prometheus作为指标采集器,Grafana配置监控界面和邮件告警。 +然后是通过链路跟踪系统,定位问题出现的位置。使用Zipkin工具,实现链路的跟踪过程,实现每一个节点的日志收集。为了能够快速的实现日志分析,使用ELK日志分析组件。包括一个日志搜索引擎、日志收集存储器和UI组件。 +为了能够控制微服务的访问权限,进行服务治理,搭建了一套网关系统。在调用者和被调用者中间加一层网关,每次调用时进行权限校验。另外,网关也可以作为一个提供服务接口文档的平台。能够进行各个微服务的接口管理,通过页面访问和调试微服务。 +由于微服务的扩充速度比较快速,最终搭建了一个微服务的注册和发现系统。每当有新的微服务或者微服务的某个新节点出现的时候,完成服务信息发布、存活检测、客户端负载均衡等任务。各个应用服务在启动时自动将自己注册到服务发现服务上。并且应用服务启动后会实时(定期)从服务发现服务同步各个应用服务的地址列表到本地。服务发现服务也会定期检查应用服务的健康状态,去掉不健康的实例地址。服务发现系统还会进行服务之间的负载均衡,防止某一个服务流量过大,称为微服务链路上的流量瓶颈。 +在实现微服务系统的时候,还考虑了大量的其他安全性可靠性内容。包括建立链路上的熔断机制,当多次访问一个服务失败时,应熔断,标记该服务已停止工作,直接返回错误。直至该服务恢复正常后再重新建立连接。建立了微服务的多级测试系统,服务本地的单元测试,整个服务的测试,端到端测试(覆盖这个服务调用链的测试)。 +在构建微服务系统的核心关键技术是gRpc。gRPC是由Google公司开源的一款高性能的远程过程调用(RPC)框架,可以在任何环境下运行。该框架提供了负载均衡,跟踪,智能监控,身份验证等功能,可以实现系统间的高效连接。另外,在分布式系统中,gRpc框架也有有广泛应用,实现移动端、浏览器等和服务器的连接。gRPC支持多种语言的实现,因此gRPC支持客户端与服务器在多种语言环境中部署运行和互相调用。gRPC使用ProtoBuf来定义服务,ProtoBuf是由Google开发的一种数据序列化协议(类似于XML、JSON、hessian)。ProtoBuf能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面。压缩和传输效率高,语法简单,表达力强。 +gRPC 的协议设计上使用了HTTP2。HTTP2 提供了连接多路复用、双向流、服务器推送、请求优先级、首部压缩等机制。可以节省带宽、降低TCP链接次数、节省CPU,帮助移动设备延长电池寿命等。gRPC主流分布式方案有以下三个etcd, zookeeper, consul,最终选择使用consul实现服务的注册与负载均衡的实现。 +我们通过proto文件定义了数据结构和服务接口。可以通过流模式实现服务器和客户端的调用。集成了TLS验证方法,用于识别客户端和服务器,增强通信的安全性。使用SSL/TLS协议对通信连接进行安全加密,是通过非对称加密的方式来实现的。在加密过程中:客户端想要向服务器发起链接,首先会先向服务端请求要加密的公钥。获取到公钥后客户端使用公钥将信息进行加密,服务端接收到加密信息,使用私钥对信息进行解密并进行其他后续处理,完成整个信道加密并实现数据传输的过程。客户端调用服务时,客户端gRPC库使用协议缓冲区,并编组(marshal)远程过程调用,该调用随后通过HTTP2来发送。在服务器端,请求解组(un-marshalled),使用协议缓冲区执行相应的过程调用。响应遵循从服务器到客户端的类似的执行流程。 +2.7 支付与退款逻辑处理 +作为电子钱包财经部分的核心业务,其最大的困难点在于业务场景的理解和负责业务需求的实现,技术上的难点通过之前的分析已经实现了。 +首先最大的难点是建立后端的订单子系统,实现后端订单的数据流图。业务方可能会产生多种类型的订单,例如在购物的时候,会生成shop单、商户单、商品单,退款的时候根据退款创建的时间不同,可能产生各种类型的退款单,通过区分是否在售后内或者超售后,是否满足优质用户的急速退款条件,订单是否已经分账,产生不同类型的退款单。在财经部分,根据业务方的需求,建立财经部分的订单系统,该系统主要融合了业务方订单和支付方订单。业务方订单包括shop单、sku单、商品单等,财经部分订单包括四种主要的类型,商品单、支付单、分账单、退分账单、补贴单、推补贴单、退款单等。退款中会生成退款单包括多种类型,如退款子单、急速退款单、退分账单、退补贴单、退税单等。由于支付场景负责,各种订单的准确性必须要有保证。 +财经部分最重要的是对金额和流水的保证。建立了从上到下的对账系统,通过流水信息、数据库信息、日志信息等,进行不间断的对账,保证了交易金额的准确性。杜绝发生严重的金融风险。同时增强开发人员的金融管控意识。防止出现资金安全问题。在技术上,使用GO语言重构了后端的微服务,包括一系列配套的微服务工具的应用。如上一节提到的微服务的技术选型:服务注册与发现机制(consul)、敏捷开发流程(devops)、远程调用方式(thrift)、服务监控平台(Grafana)、数据分析平台(Hive)、链路系统跟踪平台、服务网关(Gateway)等。实现一系列微服务开发、部署、运维任务。 +在担保交易系统中,总的业务流可以分为四个部分:支付、分账、退款、提现。当用户付款后(自有支付、第三方支付),不能立即存到商家的账户中,需要暂存到商家的待结算户中,防止出现资金安全问题。当用户点击确认收款后,资金从商家的待结算户,分账到商家账户和其他分账方的账户(达人带货分账、平台营销分账等),其中还涉及到平台的营销问题。当用户发起退款是,会根据不同的情况,走完全不同的退款流程,主要包括普通退款、分账前退款、分账后退款、超售后退款和急速退款。其中每一种业务都被划分为一个独立的微服务,可能部署在不同的虚拟机上,存在大量远程调用过程。 +当时负责支付营销预计算和分账后退款两个业务,涉及担保退款、退款请求、财经核心微服务,整个服务链包括十几个业务,我负责其中的三个。担保退款业务负责接收来自其他应用的退款请求,查询数据库中的订单,校验请求的准确性,同时通过幂等校验对重复的请求进行处理。退款请求业务,接收担保退款微服务的请求,对请求进一步校验,根据订单状态、支付状态、业务方的需求将退款业务划分为不同的退款方式(急速退款、普通退款、分账后退款、超售后退款等),然后执行不同的退款逻辑。每一种退款都实现了统一的接口,需要校验大量的请求参数和订单内容,保证请求和订单的一致性,需要调用电商接口,计算每一个分账方的分账金额,根据分账方的分分钟金额校验账单系统中的分账单,针对每一个分账单,生成分账的退款单,然后请求支付核心,将商家待结算户中的金额退给用户。如果已经部分分账,需要将所有分账的金额退到商家现金户,推进分账进程,然后从商家的现金户,将金额退还给支付账户,并将平台补贴金额退回。每次退款过程前,需要事先请求计算支付营销金额,如果保证金额正确才可以进行后续的退款,否则返回退款失败。 +三、实习表现 +在实习过程中积极主动与他人沟通,学习工作的流程和沟通的技巧,掌握了大量新技术,巩固了原有的知识。获得了导师和领导的一致认可。能够独立完成一个需求的开发,掌握了与他人合作开发的技巧,学会了如何进行联调测试,如何在线上线下环境寻找存在的问题。在遇到问题时,能够提出自己的见解和思考,能够将自己的想法正确的表达给其他人。工作积极主动、高效,学习认真,待人诚恳,实习期间主动加班,学习掌握工作中需要的技术和知识。热爱自己的岗位,工作能力比较强,能跟同事友好相处。在短时间内取得了相对不错的成果。 +四、主要成果 +实习期间的有效代码量超过十万行。主要完成了以下需求: +电子钱包数据库 使用MySQL构建了电子钱包系统的数据库,符合BNF范式,用来存储从合作方获取的金融数据。 +Mybatis数据读写 使用MyBatis访问MySQL数据库,完成了大量的MySQL命令,实现了数据的存储和展示。 +Spring Boot电子钱包服务 通过java http请求,获取第三方金融数据,对数据内容进行拆解和校验,并存储到自己的数据库中。 +Redis缓存 在系统中添加了Redis缓存,大大提升了系统的性能,数据访问的QPS提升了两倍。 +gRpc微服务框架 使用grpc微服务框架,重构后端服务,形成为了更高性能的微服务系统。 +支付营销预计算 对支付过程的营销金额进行计算。并在退款的时候进行校验,保证了退款的准确性。 +分账后退款 针对分账完成后的退款业务,实现退款的流程,校验退款参数,实现退分账过程。 +五、收获体会 +在实践期间,我深刻的感受到,企业文化的重要性。整个团队是一个完整的一体的团体,大家有这共同的目标,团结、上进、充满活力。每天大家都笑脸相迎,即使面临巨大的压力,办公室内外依旧能够听到笑声。面对同事,大家总是热情真诚,面对工作上的困难,大家总是互帮互助,直到解决苦难,整个机体和睦相处,气氛很和谐很亲切。领导与下属之间、同事与同事之间非常团结、凝聚,就像一个温馨的大家庭,领导就是这个大家庭的家长,给每个人很大的发挥空间。从他们身上,我体会到什么是爱岗敬业,体会到了劳动的快乐,体会到了什么是求真务实。特别令我感动的是,每当我遇到技术和生活上的困难,需要别人支持我的工作的时候,大家都会很热情的协助我。我对能在这样的单位实习感到荣幸和字号。 +通过这次实习,我的个人能力得到飞速的提升。巩固计算机开发的基本知识,又了解了行业的前沿,学到了很多新技术。更多的是,尝试去适应了一个伟大的开发团队,从生活上、从习惯上,开始接触真正创造价值的工作,自己的动手能力有很大的提升。相信自己可以在未来的工作中,能够利用好这次实习的经验,学以致用,能够实现自我的人生价值。 + + + + + + +填写《北京航空航天大学全日制专业学位研究生专业实习环节考核表》,并给出考核成绩 + +全日制专业学位研究生专业实习环节总成绩 =(单位评价平均成绩 + 学院考核成绩)/2,并按优、良、中、及格、不及格五级定级。90以上为优,80-90为良,65-79为中,60-64为及格,60以下为不及格。学院同一年级学生专业实习环节成绩,优的比例不超过15%,中、及格与不及格的比例不少于10%。 +学生的<专业实习总结报告>以学号为文件名的word文档由班长收齐电子版提交学院教学部门,成绩符合要求资料齐全者给予三个学分。 +截止时间为2021年8月30日,请各单位自行确定学生和导师分组名单以及考核的具体时间和地点 diff --git a/毕业设计/恶意软件处理方法.md b/工作日志/恶意软件.md similarity index 98% rename from 毕业设计/恶意软件处理方法.md rename to 工作日志/恶意软件.md index 7747443d..5447b424 100644 --- a/毕业设计/恶意软件处理方法.md +++ b/工作日志/恶意软件.md @@ -3,7 +3,7 @@ ### 隐私保护 * 可以用来论证Android隐私保护的总要性。 * [隐私权限进行重大更新,采取的措施](https://developer.android.google.cn/privacy/best-practices#minimize_your_use_of_location) -![](2021-01-05-20-08-00.png) +![](image/2021-01-05-20-08-00.png) ## 2 数据集搜集 diff --git a/工作日志/毕业设计.md b/工作日志/毕业设计.md index d23f50c9..cd31c332 100644 --- a/工作日志/毕业设计.md +++ b/工作日志/毕业设计.md @@ -62,17 +62,22 @@ ### 论文结构 -## 第二章:理论基础 +## 第二章:理论基础和相关技术 ### 1 恶意软件检测原理 > 恶意软件主要分类、恶意软件主要分类的依据和数学表示(接口、行为?)、恶意软件主要的检测方法利用到的原理。 -### 2 特征提取技术 +### 2 恶意软件特征提取技术 > 特征提取技术,特征降维方法。动静态特征的提取方法。 + +* 静态特征的提取 +* 动态特征的提取 +* 特征降维方法 + ### 3 联邦学习 > 联邦学习的基础原理。联邦学习的实现方案。联邦学习的分类和数学表示。联邦学习中的开放问题。 @@ -88,46 +93,43 @@ > 对非独立同分布的数学的描述。 -## 第三章:恶意软件特征提取方法 -### 静态特征的提取 +## 第三章:针对恶意软件非独立同分布问题的联邦学习框架 +### 非独立同分布问题的建模 -### 动态特征的提取 - - -## 第四章:针对非独立同分布问题的联邦学习框架 ### 联邦学习框架的算法框架 -### 针对非独立同分布问题的联邦元学习算法 +### 针对恶意软件非独立同分布问题的联邦元学习算法 * 能够衡量用户的贡献度的方法 -## 第五章:基于差分隐私和联邦学习的恶意软件检测算法 +## 第四章:基于差分隐私和联邦学习的恶意软件检测算法 -### 隐私保护的原理(数学公式推导) -### 隐私保护的框架(算法,加入到整体的联邦学习框架中) +### 威胁模型的简历和隐私保护的原理(数学公式推导) +### 基于差分隐私的隐私保护框架(算法,加入到整体的联邦学习框架中) ### 隐私计算(从理论上证明,隐私保护的准确性) -## 第六章:恶意软件检测仿真系统构建 +## 第五章:恶意软件检测仿真系统构建 ### 系统架构图 ### 各个模块的设计方案 -1. 训练控制模块 -2. 网络通信模块 -3. 训练展示模块 -4. 实验结果对比模块 +1. 特征提取模块 +2. 训练控制模块 +3. 网络通信模块 +4. 训练展示模块 +5. 实验结果对比模块 -## 第七章:恶意软件检测算法的实验与结果 +## 第六章:恶意软件检测算法的实验与结果 -## 结论 +## 第七章 结论 diff --git a/数据库/MySQL/12 索引.md b/数据库/MySQL/12 索引.md index 90daddd5..b35a7e16 100644 --- a/数据库/MySQL/12 索引.md +++ b/数据库/MySQL/12 索引.md @@ -17,6 +17,8 @@ --单列索引,一个字段上的索引INDEX in_test1(test1) --多列索引,多个字段上的索引INDEX 多列索引的名称(字段1,字段2,字段3...) --空间索引,SPACIAL INDEX spa_test(test1); + + @@ -62,4 +64,28 @@ ALTER tbl_name DROP INDEX 索引名称 --通过客户端管理MySQL +``` + +MySQL中常用的索引结构有:B+树索引和哈希索引两种。目前建表用的B+树索引就是BTREE索引。 + +在MySQL中,MyISAM和InnoDB两种存储引擎都不支持哈希索引。只有HEAP/MEMORY引擎才能显示支持哈希索引。 + +创建索引: +```sql +CREATE TABLE userInfo( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `username` varchar(3) NOT NULL COMMENT '用户名', + `age` int(10) NOT NULL COMMENT '年龄', + `addr` varchar(40) NOT NULL COMMENT '地址', +PRIMARY KEY (`id`), +``` + +```sql +KEY `ind_user_info_username` (`username`) USING BTREE, --此处普通索引 +key 'ind_user_info_username_addr' ('username_addr') USING BTREE, --此处联合索引 +unique key(uid) USINGBTREE, --此处唯一索引 +key 'ind_user_info_addr' (addr(12)) USINGBTREE —-此处 addr列只创建了最左12个字符长度的部分索引 +)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表'; + + ``` \ No newline at end of file diff --git a/数据库/MySQL/附录2 MySql性能优化.md b/数据库/MySQL/附录2 MySql性能优化.md index e5bdbe07..103e873c 100644 --- a/数据库/MySQL/附录2 MySql性能优化.md +++ b/数据库/MySQL/附录2 MySql性能优化.md @@ -262,3 +262,10 @@ B-TREE 仍然是最高效的索引之一,所有 MYSQL 仍然不会过时。 4. PHP 的建立连接速度非常快,所有可以不用连接池,否则可能会造成超过连接数。当然不用连接池 PHP 程序也可能将 5. 连接数占满比如用了 @ignore_user_abort(TRUE); 6. 使用 IP 而不是域名做数据库路径,避免 DNS 解析问题 + + + + +”建立合理索引”(什么样的索引合理?) “ +分表分库”(用什么策略分表分库?) +“主从分离”(用什么中间件?) \ No newline at end of file diff --git a/数据库/MySQL/附录3 MySQL索引类型.md b/数据库/MySQL/附录3 MySQL索引类型.md new file mode 100644 index 00000000..74befdaa --- /dev/null +++ b/数据库/MySQL/附录3 MySQL索引类型.md @@ -0,0 +1,100 @@ +MySQL中常用的索引结构有:B+树索引和哈希索引两种。目前建表用的B+树索引就是BTREE索引。 + +在MySQL中,MyISAM和InnoDB两种存储引擎都不支持哈希索引。只有HEAP/MEMORY引擎才能显示支持哈希索引。 + +创建索引: + +CREATE TABLE userInfo( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `username` varchar(3) NOT NULL COMMENT '用户名', + `age` int(10) NOT NULL COMMENT '年龄', + `addr` varchar(40) NOT NULL COMMENT '地址', +PRIMARY KEY (`id`), +KEY `ind_user_info_username` (`username`) USING BTREE, --此处普通索引 +key 'ind_user_info_username_addr' ('username_addr') USING BTREE, --此处联合索引 +unique key(uid) USINGBTREE, --此处唯一索引 +key 'ind_user_info_addr' (addr(12)) USINGBTREE —-此处 addr列只创建了最左12个字符长度的部分索引 +)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表'; +———————————————— +版权声明:本文为CSDN博主「yanweihpu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 +原文链接:https://blog.csdn.net/yanweihpu/article/details/80254066 + + +## 索引类型: + +唯一索引、主键索引、外键索引、普通索引,复合索引 + +## 索引优化查询: + +A、关联查询时,保证关联的字段都建立索引,并且字段类型一致,这样才能两个表都使用索引。如果字段类型不一样,至少一个表不能使用索引。 + +B、索引列如果使用like条件进行查询,那么 like 'xxx%' 可以使用索引,like '%xxx' 不能使用索引。 + +C、复合索引,如果创建了一个(username,age,addr)的复合索引,那么相当于创建了(username,age,addr),(username,age),(username)三个索引,所以在创建复合索引的时候应该将最常用的限制条件的列放在最左边,依次递减。 + +D、索引列的值最好不要有null值。列中只要包含null,则不会被包含到索引中,复合索引中只要有一列为null值,则这个复合索引失效的。所以创建索引列不要设置默认值null + +E、字符串列加索引最好加短索引,即对前该列的前xx个字符,例如:key 'ind_user_info_addr' (addr(10)) USINGBTREE代表对addr列的前10个字符家索引。 + +F、如果where条件中使用了一个列的索引,那么后面order by 在用这个列进行排序时,便不会再使用索引。 + + + +## 数据库优化 + +6、数据库优化 + +关联查询中的inner join 和左连接、右连接、子查询 +A、inner join 内连接也叫做等值连接,left/right join 是外连接。能用inner join连接的尽量用inner join连接 + +B、尽量使用外连接来替换子查询。 + +C、在使用on和where的时候,先用on,在用where。 + +D、使用join时,用小的结果驱动大的结果(left join左表结果尽量小,如果有条件,先放左边处理,right join同理反向)。 + +E、多表联合查询尽量拆分多个简单的sql语句进行查询。 + +建立索引,加快查询性能 +A、where条件用到复合索引中的字段时,最好把该字段放在复合索引的左端,这样才能使用索引提高查询。 + +B、保证连接的索引是相同类型。即a.age = b.age,a表的和b表的age字段类型保证一样,并且都建立了索引。 + +C、在使用like一个字段的索引时,like 'xxx%'能用到索引,like '%xxx'不能用到索引。 + +D、复合索引的使用:如果我们建立了一个(name,age,addr)的复合索引,那么相当于创建了(name,age,addr)、(name,age)、(name)三个索引。这样就把常用的限制条件放到最左边,依次递减。 + +E、索引列不要包含NULL值的列。所以数据库设计时,尽量不让字段默认为NULL。 + +F、使用短索引,对于字符串的索引,应指定一个前缀长度,体积高查询速度并且可以节省磁盘空间和I/O操作。 + +G、排序索引。尽量不要使用包含多个列的排序,如果需要则给这些列加上复合索引。 + +limit千万级分页优化 +A、select * from A order by id limit 1000000,10; 查询更换成select * from A where id between 1000000 and 1000010; + +尽量避免select * 的查询 +尽量不要使用BY RAND()命令 +利用limit 1取得唯一行。使用limit 1可以终止数据库引擎继续扫描整个表或者索引 +减少排序order by +少用OR +避免类型转换,也就是转入的参数类型要和字段类型一致 +不要在列上进行运算。 +尽量不要使用not in 和<> 操作 +A、not in 和<>操作都不会使用索引,而是进行全表扫描。 + +B、把not in 转化为 left join 操作。 + +使用批量插入操作代替一个一个插入 +对于多表查询可以建立视图。 +7、数据库原则 + +(1)不在数据库做运算:cpu计算务必移至业务层 + +(2)控制单表数据量:单表记录控制在1000w + +(3)控制列数量:字段数控制在20以内 + +(4)平衡范式与冗余:为提高效率牺牲范式设计,冗余数据 + +(5)拒绝3B:拒绝大sql,大事物,大批量 \ No newline at end of file diff --git a/数据库/Redis/image/2021-08-24-16-39-38.png b/数据库/Redis/image/2021-08-24-16-39-38.png new file mode 100644 index 00000000..a0c46ceb Binary files /dev/null and b/数据库/Redis/image/2021-08-24-16-39-38.png differ diff --git a/数据库/Redis/image/2021-08-24-16-39-58.png b/数据库/Redis/image/2021-08-24-16-39-58.png new file mode 100644 index 00000000..b0f847c1 Binary files /dev/null and b/数据库/Redis/image/2021-08-24-16-39-58.png differ diff --git a/数据库/Redis/附录4 Redis常见性能问题.md b/数据库/Redis/附录4 Redis常见性能问题.md new file mode 100644 index 00000000..a72529cc --- /dev/null +++ b/数据库/Redis/附录4 Redis常见性能问题.md @@ -0,0 +1,141 @@ + +https://zhuanlan.zhihu.com/p/65180667 + +我们在碰到需要执行耗时特别久,且结果不频繁变动的 SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。 +![](image/2021-08-24-16-39-38.png) + + +在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用 Redis 做一个缓冲操作,让请求先访问到 Redis,而不是直接访问数据库。 +![](image/2021-08-24-16-39-58.png) + +1. 使用Redis有哪些好处? + +(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) +(2) 支持丰富数据类型,支持string,list,set,sorted set,hash +(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除 + + +2. redis相比memcached有哪些优势? + +(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型 +(2) redis的速度比memcached快很多 +(3) redis可以持久化其数据 +3.redis常见性能问题和解决方案: + +(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件 +(2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次 +(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内 +(4) 尽量避免在压力很大的主库上增加从库 +(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3... + + +4. MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据 +相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。 + +redis 提供 6种数据淘汰策略: + +voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰 +volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰 +volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰 +allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰 +allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰 +no-enviction(驱逐):禁止驱逐数据 + + +6. Redis 常见的性能问题都有哪些?如何解决? + +1).Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。 +2).Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。 +3).Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。 +4). Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内 +7, redis 最适合的场景 + +Redis最适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就会有疑问,似乎Redis更像一个加强版的Memcached,那么何时使用Memcached,何时使用Redis呢? + +如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点: + +1 、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。 +2 、Redis支持数据的备份,即master-slave模式的数据备份。 +3 、Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。 +(1)、会话缓存(Session Cache) + +最常用的一种使用Redis的情景是会话缓存(session cache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗? + +幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用Redis来缓存会话的文档。甚至广为人知的商业平台Magento也提供Redis的插件。 + +(2)、全页缓存(FPC) + +除基本的会话token之外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC。 + +再次以Magento为例,Magento提供一个插件来使用Redis作为全页缓存后端。 + +此外,对WordPress的用户来说,Pantheon有一个非常好的插件 wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。 + +(3)、队列 + +Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。 + +如果你快速的在Google中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用Redis创建非常好的后端工具,以满足各种队列需求。例如,Celery有一个后台就是使用Redis作为broker,你可以从这里去查看。 + +(4)、排行榜/计数器 + +Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。所以,我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“user_scores”,我们只需要像下面一样执行即可: + +当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行: + +ZRANGE user_scores 0 10 WITHSCORES + +Agora Games就是一个很好的例子,用Ruby实现的,它的排行榜就是使用Redis来存储数据的,你可以在这里看到。 + +(5)、发布/订阅 + +最后(但肯定不是最不重要的)是Redis的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统!(不,这是真的,你可以去核实)。 + +Redis提供的所有特性中,我感觉这个是喜欢的人最少的一个,虽然它为用户提供如果此多功能。 + + + + +7.4、缓存预热 + +缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据! + +解决方法: +1、直接写个缓存刷新页面,上线时手工操作下 +2、数据量不大,可以在项目启动的时候自动进行加载 +3、定时刷新缓存 + + + +7.5、缓存降级 +当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然需要保证服务还是可用的,即使是有损服务。系统可以根据一些关键数据进行自动降级,也可以配置开关实现人工降级。 + +降级的最终目的是保证核心服务可用,即使是有损的。而且有些服务是无法降级的(如加入购物车、结算)。 + +在进行降级之前要对系统进行梳理,看看系统是不是可以丢卒保帅;从而梳理出哪些必须誓死保护,哪些可降级 + + + + + +8、Redis 常见性能问题和解决方案? +(1) Master 最好不要做任何持久化工作,如 RDB 内存快照和 AOF 日志文件 +(2) 如果数据比较重要,某个 Slave 开启 AOF 备份数据,策略设置为每秒同步一次 +(3) 为了主从复制的速度和连接的稳定性, Master 和 Slave 最好在同一个局域网内 +(4) 尽量避免在压力很大的主库上增加从库 +(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即: Master <- Slave1 <- Slave2 <-Slave3… + + + +9、为什么Redis的操作是原子性的,怎么保证原子性的? +对于Redis而言,命令的原子性指的是:一个操作的不可以再分,操作要么执行,要么不执行。 +Redis的操作之所以是原子性的,是因为Redis是单线程的。 +Redis本身提供的所有API(单个命令)都是原子操作,Redis中的事务其实是要保证批量操作的原子性。 + +多个命令在并发中也是原子性的吗? +不一定, 举例:1、将get和set改成单命令操作;2、incr + +如何解决:使用Redis的事务,或者使用Redis+Lua的方式实现 +———————————————— +版权声明:本文为CSDN博主「波波的小书房」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 +原文链接:https://blog.csdn.net/xl_1803/article/details/107901645 \ No newline at end of file diff --git a/项目经历/说明.md b/项目经历/说明.md deleted file mode 100644 index 6482955e..00000000 --- a/项目经历/说明.md +++ /dev/null @@ -1,19 +0,0 @@ -## 项目经历 -> 主要对自己参与的项目进行详细的文字图片介绍 - -* 项目内容 -* 负责内容 -* 关键技术及难点 -* 最终的成果 - - -## 开发经验 - -> 主要关于项目开发中某一方面的知识经验总结 - - -* 网络编程(各种语言的实现方法。异步并发,并发通信方式。) - -* web开发(自己所开发过的web网站。主要用到的框架和技术。) - -* 并行编程(各种语言实现并发编程的手段和方式,例如协程、多线程、多进程等) \ No newline at end of file