杂记

网络通信

1. TCP/IP HTTP

2. BIO NIO
传统阻塞I/O服务模型
在这里插入图片描述

特点

采用阻塞式I/O模型获取输入数据
每个连接都需要独立的线程完成数据输入,业务处理,数据返回的完整操作

存在问题

当并发数较大时,需要创建大量线程来处理连接,系统资源占用较大
连接建立后,如果当前线程暂时没有数据可读,则线程就阻塞在read操作上,造成线程资源浪费

在NIO中, 抛弃了传统的 I/O流, 而是引入了Channel和Buffer的概念. 在NIO中, 只能从Channel中读取数据到Buffer中或将数据 Buffer 中写入到 Channel。
事件驱动方式 发生事件,主线程把事件放入事件队列,在另外线程不断循环消费事件列表中的事件,调用事件对应的处理逻辑处理事件。事件驱动方式也被称为消息通知方式,其实是设计模式中观察者模式的思路。

主要包括4个基本组件:

事件队列(event queue):接收事件的入口,存储待处理事件
分发器(event mediator):将不同的事件分发到不同的业务逻辑单元
事件通道(event channel):分发器与处理器之间的联系渠道
事件处理器(event processor):实现业务逻辑,处理完成后会发出事件,触发下一步操作

Netty 深度好文 https://juejin.im/post/5bea1d2e51882523d3163657
作为异步事件驱动的网络,高性能之处主要来自于其I/O模型和线程处理模型,前者决定如何收发数据,后者决定如何处理数据

I/O模型 ------NIO

线程处理模型-----主从Reactors多线程模型

Netty线程模型
Netty主要基于主从Reactors多线程模型(如下图)做了一定的修改,其中主从Reactor多线程模型有多个Reactor:MainReactor和SubReactor:

MainReactor负责客户端的连接请求,并将请求转交给SubReactor
SubReactor负责相应通道的IO读写请求
非IO请求(具体逻辑处理)的任务则会直接写入队列,等待worker threads进行处理

Reactor线程模型 深度好文 https://www.jianshu.com/p/2965fca6bb8f
Reactor是反应堆的意思,Reactor模型,是指通过一个或多个输入同时传递给服务处理器的服务请求的事件驱动处理模式。 服务端程序处理传入多路请求,并将它们同步分派给请求对应的处理线程,Reactor模式也叫Dispatcher模式,即I/O多了复用统一监听事件,收到事件后分发(Dispatch给某进程),是编写高性能网络服务器的必备技术之一。

方案说明
Reactor对象通过select监控客户端请求事件,收到事件后通过dispatch进行分发
如果是建立连接请求事件,则由Acceptor通过accept处理连接请求,然后创建一个Handler对象处理连接完成后的后续业务处理
如果不是建立连接事件,则Reactor会分发调用连接对应的Handler来响应
Handler会完成read->业务处理->send的完整业务流程
在这里插入图片描述
Reactor模型有3个变种

  1. 单Reactor单线程(客户端的数量有限,业务处理非常快速,比如Redis,业务处理的时间复杂度O(1))
    在这里插入图片描述
  2. 单Reactor多线程
    在这里插入图片描述
  3. 主从Reactor多线程
    在这里插入图片描述
    可以这样理解,Reactor就是一个执行while (true) { selector.select(); …}循环的线程,会源源不断的产生新的事件,称作反应堆很贴切。

3. 长连接 短连接

TCP 的长连接需要自己去维护一套心跳策略
socket是对TCP/IP协议的封装和应用(程序员层面上),它提供了一组基本的函数接口(比如:create、listen、accept等),使得程序员更方便地使用TCP/IP协议栈。

Netty的对JDK自带的NIO的API进行封装,解决上述问题,主要特点有:

设计优雅
适用于各种传输类型的统一API - 阻塞和非阻塞Socket
基于灵活且可扩展的事件模型,可以清晰地分离关注点
高度可定制的线程模型 - 单线程,一个或多个线程池
真正的无连接数据报套接字支持(自3.1起)
使用方便
详细记录的Javadoc,用户指南和示例
没有其他依赖项,JDK 5(Netty 3.x)或6(Netty 4.x)就足够了
高性能
吞吐量更高,延迟更低
减少资源消耗
最小化不必要的内存复制
安全
完整的SSL / TLS和StartTLS支持

3PL(third-party logistics)
第三方物流即合同物流的意思,是指在物流渠道中由中间商提供的服务。服务包含中间商以合同的形式在一定期限内,提供企业所需的全部或部分物流服务。
所谓3PL是指生产经营企业为集中精力搞好主业,把原来属于自己处理的物流活动,以合同方式委托给专业物流服务企业,同时通过信息系统与物流服务企业保持密切联系,以达到对物流全程的管理和控制的一种物流运作与管理方式。

BeanFactory和FactoryBean
IOC----DefaultListableBeanFactory
工厂模式实例化bean的创建

SpringBean注入的三种方式
bean配置有三种方法: beandefintions---->>>>> getbean()---->>>>>createBean()

  1. 基于xml配置Bean
  2. 使用注解定义Bean
  3. 基于java类提供Bean定义信息

依赖注入的方式有两种 populateBean()

  1. 在XML中配置,此时分别有属性注入、构造函数注入和工厂方法(static getObeject 静态和实例化工厂)注入;
  2. 使用注解的方式注入 @Autowired,@Resource,@Required。

通过动态代理注册bean AOP编程
FeignClient

领域驱动设计 DDD

贫血模型VS充血模型
读完上面的两种分层架构方式,可能很多人会有疑问,这些是什么?为什么我之前一直都没听到过这种分法?确实是这样,DDD和面向对象、设计模式等等理论有千丝万缕的联系,如果不熟悉OOA、OOD,那么DDD可能也会理解不了。因为我们大部分从开发生涯开始之初接触的都是「Action层、Service层、Dao层、DB层」这样的MVC分层理论。并且在21中设计模式中,「行为型」的设计模式,我们几乎没有什么机会使用,导致这些问题的原因是J2EE经典分层的开发方式是「贫血模型」。
Martin Fowler(对,就是提出微服务的那位大牛)曾经提出了两种开发方式,即:

以「贫血模型」为基础的「事务脚本」的开发方式
以「充血模型」为基础的「领域驱动」的开发方式

贫血模型
贫血模型是指对象只用于在各层之间传输数据使用,只有数据字段和Get/Set方法,没有逻辑在对象中。而「事务脚本」可以理解为业务是由一条条增删改查的SQL组织而成,是面向过程的编程。
充血模型是面向对象设计的本质,一个对象是拥有状态和行为的。将大多数业务逻辑和持久化放在领域对象中,业务逻辑只是完成对业务逻辑的封装、事务、权限、校验等的处理。
举例,用户管理模块大概是这样的两种实现:

// 贫血模型下的实现
public class User{
	private Integer id;
	private String name;
	...
	// 省略get/set方法

}

public class UserManager{
	public void save(User user){
		
		// 持久化操作....
	
	}
}

// 保存用户的操作可能是这样
userManager.save(user);

复制代码// 充血模型下的实现
public class User{
	private Integer id;
	private String name;
	...
	// 省略get/set方法
	
	public void save(){
	
		// 持久化操作....
	
	}

}

// 保存用户的操作可能是这样
user.save();

复制代码Martin Fowler定义的「贫血模型」是反模式,面对简单的小系统用事务脚本方式开发没问题;稍微大一些的系统使用事务脚本方式会扩大维护成本,业务逻辑、各种状态散布在大量的函数中,哪怕就是要用户对象中增加一个字段,可能都会涉及到几个类的调整…
希望领域对象能够准确地表达出业务意图,但是多数时候,我们所看到的却是充满getter和setter的领域对象,此时的领域对象已经不是领域对象了,反模式的贫血对象了。其实在贫血模型和充血模型模型之外,还有失血模型和胀血模型,但后者两个基本是实际开发中不会去使用,因为走的是两个极端。

java io读写

//读取文件(字节流)
        InputStream in = new FileInputStream("d:\\1.txt");
        //写入相应的文件
        OutputStream out = new FileOutputStream("d:\\2.txt");
        //读取数据
        //一次性取多少字节
        byte[] bytes = new byte[2048];
        //接受读取的内容(n就代表的相关数据,只不过是数字的形式)
        int n = -1;
        //循环取出数据
        while ((n = in.read(bytes,0,bytes.length)) != -1) {
            //转换成字符串
            String str = new String(bytes,0,n,"GBK"); #这里可以实现字节到字符串的转换,比较实用
            System.out.println(str);
            //写入相关文件
            out.write(bytes, 0, n);
        }
        //关闭流
        in.close();
        out.close();
python基于django框架航空订票管理系统设计与实现mysql数据库(项目源码+文档说明),含有代码注释,新手也可看懂,个人手打98分项目,导师非常认可的高分项目,毕业设计、期末大作业和课程设计高分必看,下载下来,简单部署,就可以使用。该项目可以直接作为毕设、期末大作业使用,代码都在里面,系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值,项目都经过严格调试,确保可以运行! python基于django框架航空订票管理系统设计与实现mysql数据库(项目源码+文档说明)python基于django框架航空订票管理系统设计与实现mysql数据库(项目源码+文档说明)python基于django框架航空订票管理系统设计与实现mysql数据库(项目源码+文档说明)python基于django框架航空订票管理系统设计与实现mysql数据库(项目源码+文档说明)python基于django框架航空订票管理系统设计与实现mysql数据库(项目源码+文档说明)python基于django框架航空订票管理系统设计与实现mysql数据库(项目源码+文档说明)python基于django框架航空订票管理系统设计与实现mysql数据库(项目源码+文档说明)python基于django框架航空订票管理系统设计与实现mysql数据库(项目源码+文档说明)python基于django框架航空订票管理系统设计与实现mysql数据库(项目源码+文档说明)python基于django框架航空订票管理系统设计与实现mysql数据库(项目源码+文档说明)python基于django框架航空订票管理系统设计与实现mysql数据库(项目源码+文档说明)python基于django框架航空订票管理系统设计与实现mysql数据库(项目源码+文档说明)python基于django框架航空
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值