五、网络编程

OSI模型:https://blog.csdn.net/cmyh100/article/details/82768804

  1、OSI的来源:OSI(Open System Interconnect),即开放式系统互联。 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互连模型。

        ISO为了更好的使网络应用更为普及,推出了OSI参考模型。其含义就是推荐所有公司使用这个规范来控制网络。这样所有公司都有相同的规范,就能互联了。

  2、OSI七层模型的划分

       OSI定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层),即ISO开放互连系统参考模型。如下图。

        每一层实现各自的功能和协议,并完成与相邻层的接口通信。OSI的服务定义详细说明了各层所提供的服务。某一层的服务就是该层及其下各层的一种能力,它通过接口提供给更高一层。各层所提供的服务与这些服务是怎么实现的无关。

    

常见协议:

UDP(User Datagram Protocol):用户数据报协议,它是定义用来在互连网络环境中提供包交换的计算机通信的协议

TCP(Transmission Control Protocol):传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议  log转发:开启一个协议:tcp(连接三次握手和断开四次挥手) 

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。HTTP是应用层协议,位于HTTP协议之下是传输协议TCP。TCP负责传输,HTTP则定义了数据如何进行包装,在HTTP跟TCP中间加多了一层加密层TLS/SSL,SSL是个加密套件,负责对HTTP的数据进行加密。TLS是SSL的升级版。现在提到HTTPS,加密套件基本指的是TLS。

分布式调用技术 RPC VS REST

REST(Representational State Transfer):

  1. REST(Representational State Transfer):表述性状态转移
  2. Rest是基于HTTP协议的一种web服务架构风格,比如查询都是GET请求,新增都是POST,修改是PUT,删除是DELETE等。

REST的主要原则有:

用URL表示资源。资源就像商业实体一样,是我们希望作为API实体呈现的一部分。通常是一个名词,每个资源都用一个独一无二的URL来表示。

HTTP方法表示操作。REST充分利用了HTTP的方法,特别是GET、POST、PUT和DELETE。

Rest架构的主要原则:

1.   网络上的所有事物都被抽象为资源

2.   每个资源都有一个唯一的资源标识符

3.   同一个资源具有多种表现形式(xml,json等)

4.   对资源的各种操作不会改变资源标识符

5.   所有的操作都是无状态的

符合REST约束条件和原则的架构方式即可称为RESTful,遵守了rest风格的web服务

RPC(Remote Procedure Call ):一种进程间通信方式,它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。

一个基本的RPC架构里面应该至少包含以下4个组件

1、客户端(Client):服务调用方(服务消费者)

2、客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端

3、服务端存根(Server Stub):接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理

4、服务端(Server):服务的真正提供者

RPC框架实现原理:主要有三个角色:Provider、Consumer和Registry:

    * Server: 暴露服务的服务提供方。

    * Client: 调用远程服务的服务消费方。

    * Registry: 服务注册与发现的注册中心。

要解决的两个问题:

  1. 解决分布式系统中,服务之间的调用问题。
  2. 远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。

使用到的技术

1、动态代理

生成 client stub和server stub需要用到 Java 动态代理技术 ,我们可以使用JDK原生的动态代理机制,可以使用一些开源字节码工具框架 如:CgLib、Javassist等。

2、序列化

为了能在网络上传输和接收 Java对象,我们需要对它进行 序列化和反序列化操作。

* 序列化:将Java对象转换成byte[]的过程,也就是编码的过程;

* 反序列化:将byte[]转换成Java对象的过程;

可以使用Java原生的序列化机制,但是效率非常低,推荐使用一些开源的、成熟的序列化技术,例如:protobuf、Thrift、hessian、Kryo、Msgpack

3、NIO

当前很多RPC框架都直接基于netty这一IO通信框架,比如阿里巴巴的HSF、dubbo,Hadoop Avro,推荐使用Netty 作为底层通信框架。

4、服务注册中心:Dubbo+ZK与Eureka注册中心比较

当向注册中心查询服务注册列表时,可以容忍注册中心返回的是几分钟以前的注册信息,但是不能接受服务直接down掉不可用。服务注册功能对可用性的要求高于一致性。在zk选举的时候,整个集群不可用,这样就导致注册服务瘫痪,漫长的选举期间导致整个注册服务长期不可用。

在设计的时候优先保证可用性。eureka的各个节点都是平等的,几个节点down掉不会影响其他节点的提供注册和查询服务的功能。

可选技术:

* Redis

* Zookeeper

* Consul

* Etcd

RPC框架:Dubbo、gRPC、eureka

Retrofit、okhttp、netty

2. Nginx:一个高性能的 HTTP 服务器,web服务器和反向代理服务器,异步非阻塞

Nginx的负载均衡算法都有哪些

nginx 的 upstream目前支持 4 种方式的分配
0)、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,Nginx的健康检查功能会自动剔除。
1)、weight
对不同的后端服务器指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
2)、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
3)、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
4)、url_hash(第三方)
按照请求url的hash结果来将不同请求分配到不同服务器,使用这种方式每个url的请求都会由同一个后端服务器进行处理,后端服务器为缓存时效率会更高。

负载均衡配置

upstream myapp {

    server192.168.20.1:8080; # 应用服务器1

    server192.168.20.2:8080; # 应用服务器2

}

server {

    listen80;

    location / {

        proxy_pass http://myapp;

    }

}

为什么要做动静分离?

在日常开发中,前端请求静态文件比如图片资源是不需要经过后端服务器的,但是调用API这些类型的就需要后端进行处理请求,所以为了提高对资源文件的响应速度,我们应该使用动静分离的策略去做架构。我们可以将静态文件放到Nginx中,将动态资源的请求转发到后端服务器去进行进一步的处理。

静态http服务器配置:可以将服务器上的静态文件(如HTML、图片)通过HTTP协议展现给客户端。

server {

    listen80; # 端口号

    location / {

        root /usr/share/nginx/html; # 静态文件路径

    }

Nginx正向代理

正向代理代理的是客户端,是一个位于客户端和服务器之间的服务器,为了从服务器取得数据,客户端向代理服务器发送一个请求并指定目标(服务器),然后代理向原始服务器转交请求并将获得的数据返回给客户端。总结正向代理的几个作用:

  • 访问国外无法访问的网站做缓存,加速访问资源
  • 对客户端访问授权,上网进行认证代理
  • 可以记录用户访问记录(上网行为管理),对外隐藏用户信息

Nginx反向代理:

反向代理代理的是服务端,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。总结下反向代理的两个作用:

  • 保证内网的安全,通常将反向代理作为公网访问地址,Web服务器是内网
  • 负载均衡,通过反向代理服务器来优化网站的负载
  • 解决跨域问题

反向代理配置:

客户端本来可以直接通过HTTP协议访问某网站应用服务器,网站管理员可以在中间加上一个Nginx,客户端请求Nginx,Nginx请求应用服务器,然后将结果返回给客户端,此时Nginx就是反向代理服务器。

server {

    listen80;

    location / {

        proxy_pass http://192.168.20.1:8080; # 应用服务器HTTP地址

    }

常见状态码

499:服务端处理时间过长,客户端主动关闭了连接。

Nginx常用优化配置

  1. 调整worker_processes指定Nginx需要创建的worker进程数量,刚才有提到worker进程数一般设置为和CPU核心数一致。
  2. 调整worker_connections设置Nginx最多可以同时服务的客户端数。结合worker_processes配置可以获得每秒可以服务的最大客户端数。
  3. 启动gzip压缩,可以对文件大小进行压缩,减少了客户端http的传输带宽,可以大幅度提高页面的加载速度。
  4. 启用缓存,如果请求静态资源,启用缓存是可以大幅度提升性能的。关于启用缓存可以观看Nginx缓存这篇文章:Nginx缓存原理及机制

nginx和apache的区别

轻量级,同样起web 服务,比apache 占用更少的内存及资源
抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
高度模块化的设计,编写模块相对简单
最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程

使用Nginx的优势点

  • Nginx由于使用了epoll和kqueue网路I/O模型,在实际生产环境能够支撑3万左右并发连接。
  • Nginx内存消耗低。
  • Nginx跨平台,而且配置相对来说难度较低。
  • Nginx内置健康检查功能,如果负载均衡其中一个服务器宕机了,则接受到的请求会发送给其他服务器去处理。
  • 支持Gzip压缩,可以添加浏览器本地缓存的Header头。
  • Nginx支持热部署,可以在不间断服务的情况下平滑进行配置的更改。
  • Nginx异步接收用户请求,减轻了Web服务器的压力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值