项目整理

目录

  • 1 基于Thrift的RPC框架的开发和维护
    • 项目介绍
    • RPC及实现RPC需要的技术
      • 1 动态代理
      • 2 序列化和反序列化
      • 3 NIO通信组件
      • 4 注册中心
    • 为什么使用RPC
      • RPC和HTTP
    • Thrift简介
    • Thrift整体架构
    • Thrift 三大重要组件:Transport、Protocol和 Server
      • 传输方式Transport
      • 传输协议Protocol(编码方式)
        • 二进制协议 VS 文本协议
      • 服务模型Server(Java)
        • 1 TSimpleServer模式
        • 2 TNonblockingServer模式
        • 3 THsHaServer模式(半同步半异步)
        • 4 TThreadPoolServer模式
        • 5 TThreadedSelectorServer模式
      • 服务模型Server(Python)
        • 1 TSimpleServer
        • 2 TThreadPoolServer
  • 2 数仓
    • 数据仓库概念
    • 数仓分层概念
    • 数据仓库的输入数据源和输出系统
    • 维、维度、维度表和事实表
      • 0 来自知乎的一个简单解释
      • 1 维
      • 2 维度
      • 3 维度表
      • 4 事实表
      • 5 星型模式结构示意图
    • 数据湖 VS 数据仓库
      • 1 本质区别
      • 2 存储位置
      • 3 数据源
      • 4 用户
      • 5 数据质量
      • 6 数据模式
      • 7 敏捷扩展性
      • 8 应用
  • 2 基于Spring Boot的个人博客系统
    • 项目介绍
  • 3 基于Servlet和JSP的 上书城
    • 0 项目介绍
    • 1 什么是Servlet
    • 2 Tomcat容器等级
    • 3 手工编写一个Servlet
    • 4 测试题
    • 5 Servlet执行流程
    • 6 Servlet生命周期
    • 7 Tomcat装载Servlet的三种情况
    • 8 Servlet与JSP的区别
    • 9 Spring MVC和Servlet
    • 10 转发和重定向的区别
    • Servlet是线程安全的吗/li>
  • 4 僵尸企业画像及分类
  • 5 降低汽油精制过程中的辛烷值损失模型
  • 6 天然气股份有限公司场站智能化分析及控制软件开发
    • 异常检测研发目标
    • 异常检测设计方案
      • 单点检测
      • 多点检测

1 基于Thrift的RPC框架的开发和维护

项目介绍

公司项目整体架构是基于分布式的:以Java集成各功能模块作为客户端,以Python提供机器学习算法支持作为服务端,以RPC保证高效稳定通信。Thrift作为一种典型的CS结构,且支持跨语言,故以此进行RPC开发。在Thrift的技术选型上,使用TFramedTransport作为传输方式、TCompactProtocol作为传输协议(编码方式),TForkingServer作为服务模型;同时,为了保证服务的稳定性,客户端启用一个心跳机制来维护长连接,服务端建立一个管理进程监测维护各服务进程。

分布式系统是由一组通过 络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。

RPC及实现RPC需要的技术

  1. RPC(Remote Procedure Call Protocol,远程过程调用协议):是一种通过 络从远程服务器上请求服务,而不需要了解底层 络技术的协议;RPC使得客户端在远程调用时,能够像本地调用一样方便,而感知不到远程调用的逻辑;
  2. 关键技术包括:通信协议、序列化、接口描述、服务框架、性能和语言支持等;
  3. RPC可以使用TCP作为传输协议,也可以使用HTTP(如gRPC),但一般都是TCP;
  4. RPC = socket + 动态代理

动态代理发生在服务调用方,RPC 框架需要解决的是:像调用本地接口一样调用远程接口。于是如何组装数据 文、如何经过 络传输发送至服务提供方,以及如何屏蔽远程接口调用的细节,便是动态代理需要做的工作。

一个完整的RPC架构包含5个核心组件,分别是:客户端、客户端存根、 络传输模块、服务端存根、服务端:

  • 客户端(Client):服务调用方;
  • 客户端存根(Client Stub):存放服务端的地址信息,将客户端的请求参数打包成 络消息,再通过 络传输发送给服务方;
  • 络传输模块(Network Service):底层传输,可以是TCP或HTTP;
  • 服务端存根(Server Stub):接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理;
    1. HTTP是RPC的一种;
    2. HTTP是在接口不多、系统与系统交互较少的情况下,解决信息孤岛初期使用的一种通信手段,接口可能返回一个JSON字符串或XML文档,然后客户端再去处理这个返回的信息。优点就是简单直接、开发方便;
    3. 如果一个系统内部子系统较多、接口非常多,RPC框架的优势就显示出来了:1 RPC用到了动态代理模式,能解耦服务;2 RPC调用是面向服务的封装,针对服务的可用性和效率等都做了优化(传输方式、传输协议、服务模型等),单纯使用HTTP调用则缺少了这些特性;3 RPC框架一般都有注册中心,有丰富的监控管理、发布和下线接口等;4 长连接:不必每次通信都要像HTTP一样去3次握手,减少了 络开销;

    Thrift简介

    1. Thrift是用于实现RPC通信的一种框架,支持跨语言,包括C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml, Delphi等;
    2. Thrift是一种典型的CS(客户端/服务端)结构,客户端和服务端可以使用不同的语言开发。既然客户端和服务端能使用不同的语言开发,就一定要有一种中间语言来关联客户端和服务端的语言,这种语言就是IDL(Interface Description Language);

    Thrift整体架构

    1. TSimpleServer的工作模式下只有一个工作线程,循环监听新请求的到来并完成对请求的处理,它只是在简单的演示时候使用;
    2. TSimpleServer的工作模式采用最简单的阻塞IO,实现方法简洁明了,便于理解,但是一次只能接收和处理一个socket连接,效率比较低,主要用于演示Thrift的工作过程,在实际开发过程中很少用到它。

    2 TNonblockingServer模式

    THsHaServer的优点

    与TNonblockingServer模式相比,THsHaServer在完成数据读取之后,将业务处理过程交由一个线程池来完成,主线程直接返回进行下一次循环操作,效率大大提升。

    THsHaServer的缺点

    主线程需要完成对所有socket的监听以及数据读写的工作,当并发请求数较多,且发送数据量较大时,监听socket上新连接请求不能被及时接收。

    4 TThreadPoolServer模式

    1. 一个AcceptThread线程对象,专门用于处理监听socket上的新连接;
    2. 若干个SelectorThread线程对象专门用于处理业务socket的 络I/O操作,所有 络数据的读写均是由这些线程来完成;
    3. 一个负载均衡器SelectorThreadLoadBalancer对象,主要用于AcceptThread线程接收到一个新socket连接请求时,决定将这个新连接请求分配给哪个SelectorThread线程;
    4. 一个ExecutorService类型的工作线程池,在SelectorThread线程中,监听到业务socket中有调用请求过来,则将请求读取之后,交给ExecutorService线程池中的线程完成此次调用的具体执行;

    TThreadedSelectorServer模式中有一个专门的线程AcceptThread用于处理新连接请求,因此能够及时响应大量并发连接请求;另外它将 络I/O操作分散到多个SelectorThread线程中来完成,因此能够快速对 络I/O进行读写操作,能够很好地应对 络I/O较多的情况;TThreadedSelectorServer对于大部分应用场景性能都不会差,因此,如果实在不知道选择哪种工作模式,使用TThreadedSelectorServer就可以。

    链接: Python服务端源码解析.

    服务模型Server(Python)

    1 TSimpleServer

    TSimpleServer的工作模式采用最简单的阻塞IO,实现方法简洁明了,便于理解,但是一次只能接收和处理一个socket连接,效率比较低。

    1. 设置TServerSocket的listen()方法启动连接监听;
    2. 以阻塞的方式接受客户端的连接请求,每进入一个连接即为其创建一个TSocket对象(封装socket连接);
    3. 为客户端创建输入传输通道对象、输出传输通道对象、输入协议对象和输出协议对象;
    4. processor对象为服务模型创建之前创建的,用来处理具体的业务请求;

    2 TThreadPoolServer

    服务启动时先创建好self.threads个线程,每个线程负责从队列clients中获取客户端连接TSocket对象。而主线程负责accept客户端的连接并创建TSocket对象,放入clients队列。

    3 TNonblockingServer
    类似于Java版Thrift中的THsHaServer,思路是服务启动时创建threads个线程负责处理task队列中的任务消息。而主线程利用I/O多路复用技术将准备好的可读消息放入task队列供业务线程处理,同时在处理结束后可写时直接将结果返回给客户端。

    4 TForkingServer VS TProcessPoolServer

    1. 由于Python的GIL锁,所以Python没有真正的多线程,无法实现并行运作,多任务场景下效率低下,因此引入了两个多进程模型;
    2. 其中TForkingServer,服务端每次监听到client请求,会os.fork一个子进程进行业务处理;

    1 维

    维是关于一个组织想要记录的视角或观点。

    参考: 维的百度百科.

    2 维度

    1. 维度是对数据进行分析时采取的一个角度。比如分析产品销售情况,可以按类别来分析,也可以按区域来分析,于是类别和区域就构成了两个维度;
    2. 每个维度可以有子维度;

    3 维度表

    1. 维度表是对每个维至少使用一个表来存放维的层次、成员类别等维的描述信息;
    2. 维度表和事实表通过主键和外键联系在一起,形成星型,也称为“星型模式”;
    3. 对层次复杂的维,为避免冗余数据占用过大的存储空间,可以使用多个表描述,即“雪花型模式”;
    4. 维度表示例(产品维度表):Prod_ID,Product_Name,Category,Color,Size,Price

    特性

  1. 大量数据行,存储TB级;
  2. 主要是数值,少量文字或多媒体;
  3. 有和维度表连接的外键;
  4. 主要是静态数据和聚集数据;

5 星型模式结构示意图

3 数据源

  1. 数据仓库的数据很多时候是从OLTP应用的结构化数据库中提取的,用于支持内部的业务部门(销售、市场、运营等)进行业务分析;

4 用户

  1. 数据仓库主要是对业务系统对大量业务数据进行统计分析,所以会应用数据分析的部门是数据仓库的主要用户,例如:销售部、市场部、运营部、总裁办等;
  2. 数据湖中的数据都是原始数据,是未经整理的,更适合数据科学家,通过应用模型、技术发掘数据中的价值,去解决企业中的业务问题;

5 数据质量

  1. 数据仓库非常重视数据质量,数据都是经过处理的,像数据中台有很大一块是数据质量管理、数据资产管理等;
  2. 数据湖中数据可靠性较差,这些数据可能是任意状态、任意形态的数据;

6 数据模式

  1. 数据仓库在数据写入前就要定义好模式(schema),例如:先建立模型、建立表结构,然后导入数据,我们称之为write-schema;
  2. 数据湖中的数据没有没有模式,直到用户要访问数据、使用数据才会建立schema,我们称之为read-schema;

3 手工编写一个Servlet

  1. 继承HttpServlet;
  2. 重写doGet()或doPost()方法;
  3. 在web.xml中注册Servlet;
  4. 部署运行;

6 Servlet生命周期

7 Tomcat装载Servlet的三种情况

  1. Servlet容器启动时自动装载某些Servlet,实现它只需要在web.xml中的之间添加如下代码:,数字越小优先级越高;
  2. Servlet容器启动后,客户端首次向Servlet发送请求;
  3. Servlet类文件被更新后,会自动重新装载Servlet;

8 Servlet与JSP的区别

  1. Servlet是一个Java类,是在服务器上运行以处理客户端请求并作出响应的程序;
  2. JSP是一种动态页面技术,它的主要目的是将表示逻辑从Servlet中分离出来;
  3. SUN 公司推出 JSP 技术的同时,也推出了两种 Web 应用程序的开发模式。即 JSP+JavaBean 和 Servlet+JSP+JavaBean;
  4. JSP+JavaBean 中 JSP 用于处理用户请求,JavaBean 用于封装和处理数据。该模式只有视图和模型,一般把控制器的功能交给视图来实现,适合业务流程比较简单的 Web 程序。JSP+JavaBean 模式在一定程度上实现了 MVC,即 JSP 将控制层和视图层合二为一,JavaBean 为模型层;

项目整理
  1. Servlet+JSP+JavaBean 中 Servlet 用于处理用户请求,JSP 用于数据显示,JavaBean 用于数据封装,适合复杂的 Web 程序。Servlet+JSP+JavaBean很好地实现了MVC,即Servlet担当控制层,JSP为视图层,JavaBean为模型层;

9 Spring MVC和Servlet

Spring MVC简化了写Servlet类,由一个前端调度器接收所有请求,后台写相应的Controller就好,而Servlet就是一个请求一个映射一个Servlet。

10 转发和重定向的区别

forward(转发)

是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容从哪里来的,因为这个跳转过程是在服务器实现的,并不是在客户端实现的,所以客户端并不知道这个跳转动作,所以它的地址栏还是原来的地址。

redirect(重定向)

是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.

转发是服务器行为,重定向是客户端行为。

区别

  1. 从地址栏显示来说

    forward是服务器请求资源,服务器直接访问目标地址的UR

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年6月17日
下一篇 2021年6月17日

相关推荐