Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

一些后端基础概念整理 #12

Open
AnnVoV opened this issue May 27, 2018 · 0 comments
Open

一些后端基础概念整理 #12

AnnVoV opened this issue May 27, 2018 · 0 comments
Labels

Comments

@AnnVoV
Copy link
Owner

AnnVoV commented May 27, 2018

好文更新

谁说前端不需要懂-Nginx反向代理与负载均衡
https://juejin.im/post/5b01336af265da0b8a67e5c9?utm_source=wechat

整体结构图

IMAGE

Tomcat

tomcat 是一个web container(或者叫Servlet容器)生成动态web内容

Tomcat 作为容器做了什么

  • Communications Support
    容器使得Servlet与Web Server 之间的交流更加方便,Servlet主要注重自身逻辑,不用考虑Server Socket, 监听端口等其他事情
  • Lifecycle Management
    容器管理了Servlet的生命周期
  • Multithreading Support
    多线程支持
  • Declarative Security

With a Container, you
get to use an XML deployment descriptor to configure (and modify) security without having to hard-code it into your servlet (or any other) class code. Think about that! You can manage and change your security without touching and recompiling your Java source files.
应该是指通过xml的Deploy Description 方便灵活配置

Apache 与 Nginx 的优缺点对比

参考:https://www.cnblogs.com/huangye-dream/p/3550328.html
nginx优点:
轻量级,同样起web 服务,比apache 占用更少的内存及资源。
抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下,nginx 能保持低资源低消耗高性能。

apache 相对于nginx 的优点:
rewrite ,比nginx 的rewrite 强大
模块超多,基本想到的都可以找到
少bug ,nginx 的bug 相对较多
超稳定
存在就是理由,一般来说,需要性能的web 服务,用nginx 。如果不需要性能只求稳定,那就apache 吧。目前我们用Nginx作为web 服务器

端口的作用?

A port represents a logical connection to a particular piece of software running on the server hardware
如果没有端口号的话, server 就不知道client 要连哪个应用

web server 与 web contaienr app 之间如何关联的

IMAGE

Tomcat 如何找到请求url对应的servlet

servlet 有3种name

  • .class 具体文件名(开发知道的)
  • 部署应用名 internal name(开发知道的)
  • url名(用户知道的)

通过Deployment Descriptor(DD即web.xml配置文件)去做Servlet和URL的映射

IMAGE

  • 将部署应用名internal name与java 编译后的class文件名映射
  • 将部署应用名internal name与public url 对应

tomcat 主要目录结构

java应用build后会生成webapp目录,通过脚本,我们会把生成的webapp放在tomcat文件夹下,大致结构为
IMAGE

  • classes 下方编译后的java文件
  • lib 下放第3方库
  • web.xml 放配置文件

开发时,java 文件一般就放在工程目录的src文件夹下没什么特别

分布式服务

既然每一个应用系统都需要执行许多相同的业务操作,比如用户管理、商品管理等,那么可以将这些共用的业务提取出来,独立部署。由这些可复用的业务连接数据库,提供共用业务服务,而应用系统只需要管理用户界面,通过分布式服务调用共用业务服务完成具体业务操作
IMAGE

RPC(Remote Procedure Call) 远程服务调用

参考:https://zhuanlan.zhihu.com/p/36427583
因为分布式,我们把一些相同业务抽离出来了形成Service B,那么显然Service A 需要调用Service B.
IMAGE

这下问题来了,服务A里头并没有CalculatorImpl这个类,那它要怎样调用服务B的CalculatorImpl的add方法呢?
有同学会说,可以模仿B/S架构的调用方式呀,在B服务暴露一个Restful接口,然后A服务通过调用这个Restful接口来间接调用CalculatorImpl的add方法。
很好,这已经很接近RPC了,不过如果是这样,那每次调用时,是不是都需要写一串发起http请求的代码呢?比如httpClient.sendRequest…之类的,能不能像本地调用一样,去发起远程调用,让使用者感知不到远程调用的过程呢?

所以RPC 主要需要解决两个问题:
1.解决分布式系统中,服务之间的调用问题。
2.远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。使用代理模式,代理本地方法,由代理去发请求
目前我们的后端用的是dubbo,阿里的分布式服务框架 来进行远程调用。既然是分布式了,那么一个服务可能有多个实例,你在调用时,要如何获取这些实例的地址呢?这时候就需要一个服务注册中心,比如在Dubbo里头,就可以使用Zookeeper作为注册中心,在调用时,从Zookeeper获取服务的实例列表,再从中选择一个进行调用。

IMAGE

集群

对于用户访问集中的模块(比如网站的首页),需要让多台服务器部署相同应用构成一个集群,通过负载均衡设备共同对外提供服务,提供更好的并发特性。

缓存

反向代理:

反向代理属于网站前端架构的一部分,部署在网站的前端,当用户请求到达网站的数据中心时,最先访问到的就是反向代理服务器,这里缓存网站的静态资源,无需将请求继续转发给应用服务器就能返回给用户(我们的活动落地页shtml结尾的,就是用了varnish缓存的)

本地缓存:(用很少)

在应用服务器本地缓存着热点数据,应用程序可以在本机内存中直接访问数据,而无需访问数据库。

分布式缓存:

将数据缓存在一个专门的分布式缓存集群中,应用程序通过网络通信访问缓存数据

Memcached分布式缓存集群的访问模型

Memcached采用一种集中式的缓存集群管理,也被称作互不通信的分布式架构方式。缓存与应用分离部署,缓存系统部署在一组专门的服务器上,应用程序通过一致性Hash等路由算法选择缓存服务器远程访问缓存数据

如何理解不通信?
缓存服务器不只一台比如有十台 那么 以名字以1开头的缓存 我放在第一台, 以2开头的我放在第二台。。。。 这样子每台的数据都不一样 也不用去同步, 但是对于应用方来说 还是都一样的
IMAGE

异步消息队列

不用实时处理的内容,可以塞在队列里异步处理

HTTP vs Socket

  • HTTP 只是一个传输协议,本身不具备传输能力,它只是一个在socket之上的协议。它是一种text request

With HTTP you use high-level HTTP protocol(that works on top of a socket). It's session-less which means you send text request like GET google.com and receive text or binary data in return, after that connection is closed(in HTTP 1.1 persistent connections are available)

  • Socket 是对 TCP/IP 协议的封装,Socket 只是个接口不是协议,通过 Socket 我们才能使用 TCP/IP 协议,除了 TCP,也可以使用 UDP 协议来传递数据。
    很多情况下,都是需要服务器端向客户端主动推送数据,保持客户端与服务端的实时同步。

  • 若双方是 Socket连接,可以由服务器直接向客户端发送数据。若双方是 HTTP 连接,则服务器需要等客户端发送请求后,才能将数据回传给客户端。

因此,客户端定时向服务器端发送请求,不仅可以保持在线,同时也询问服务器是否有新数据,如果有就将数据传给客户端。
参考资料:
1.http://www.cnblogs.com/xclidongbo/p/4032904.html?utm_source=tuicool&utm_medium=referral
2.https://stackoverflow.com/questions/10765897/whats-the-memcached-server

目前中间层职责

IMAGE

参考资料:
1.zookeeper是什么
https://www.zhihu.com/question/37564946
2. web 前后端分离的意义大吗?
https://www.zhihu.com/question/28207685/answer/39893889
3.精读前后端渲染之争
camsong/blog#8
4.淘宝前后端分离实践
http://2014.jsconf.cn/slides/herman-taobaoweb/index.html#/
5.《大型网站技术架构》
6.《深入浅出ServletandJSP》
7.Apache与Nginx比较
https://www.cnblogs.com/huangye-dream/p/3550328.html
8.Http与Socket对比
http://www.cnblogs.com/xclidongbo/p/4032904.html?utm_source=tuicool&utm_medium=referral
https://stackoverflow.com/questions/10765897/whats-the-memcached-server
9.如何通俗解释RPC?
https://zhuanlan.zhihu.com/p/36427583

@AnnVoV AnnVoV added the 概念 label May 27, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant