后端技术杂谈

http://www.rowkey.me/blog/2016/06/27/java-backend-study/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io 

 

 

1、Web Server,Web container和Application Server区别。
  Web Server,Web服务器,同上面所说,Web服务器是指能够为发出请求的浏览器提供文档的程序。服务器是一种被动程序,只有浏览器发出请求的时候才会响应。应用层使用的是HTTP协议。目前最主流的三个Web服务器是Apache Nginx IIS。
  Web容器是一种服务器程序,在服务器端口就有一个提供相应服务的程序。所以现在知道为什么Tomcat有默认的端口——8080。一个服务器可以有多个容器。
如Tomcat,收到浏览器的请求之后还会解析Servlet,然后再把Servlet处理后的结果返回给浏览器。其实Tomcat既是Web服务器也是Web容器。为什么这样说,第三点会讲到。
而应用服务器,这里有个区分它与Web服务器的答案:
  What is the difference between application server and web server?
  Web服务器设计服务于HTTP内容,应用服务器不只限于HTTP。Web服务器服务于静态内容,有插件支持动态语言,
  应用服务器也具有Web服务器的这些东西,除此它还支持程序级的服务,如连接池,事务支持,信息服务等。

 

2、web 容器

何为容器: 
      容器是一种服务调用规范框架,J2EE 大量运用了容器和组件技术来构建分层的企业级应用。在 J2EE 规范中,相应的有 WEB Container 和 EJB Container 等。 
      WEB 容器给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使 JSP,SERVLET 直接跟容器中的环境变量交互,不必关注其它系统问题(从这个角度来说,web 容器应该属于架构上的概念)。web 容器 主要由 WEB 服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE 等。 
      若容器提供的接口严格遵守 J2EE 规范中的 WEB APPLICATION 标准。我们把该容器叫做 J2EE 中的 WEB 容器。 
  WEB 容器更多的是跟基于 HTTP 的请求打交道。而 EJB 容器不是。它是更多的跟数据库、其它服务打交道。 
      容器的行为是 将其内部的应用程序组件与外界的通信协议交互进行了隔离,从而减轻内部应用程序组件的负担(实现方面的负担?)。 例如,SERVLET 不用关心 HTTP 的细节,而是直接引用环境变量 session、request、response 就行、EJB 不用关心数据库连接速度、各种事务控制,直接由容器来完成。 

3、Web服务器
      Web 服务器(Web Server)可以处理 HTTP 协议。当 Web 服务器接收到一个 HTTP 请求,会返回一个 HTTP 响应,例如送回一个 HTML 页面。 
      Web 服务器可以响应针对静态页面或图片的请求, 进行页面跳转(redirect),或者把动态响应(dynamic response)的产生委托(delegate)给一些其它的程序,例如 CGI 脚本,JSP(JavaServer Pages)脚本,servlets,ASP(Active Server Pages)脚本,服务器端 JavaScript,或者一些其它的服务器端技术。 
  Web 服务器仅仅提供一个可以执行服务器端程序和返回(程序所产生的)响应的环境,而不会超出职能范围。 
  Web 服务器主要是处理需要向浏览器发送 HTML 的请求以供浏览。


4、应用程序服务器(The Application Server)
      根据定义,作为应用程序服务器,要求可以通过各种协议(包括 HTTP 协议)把商业逻辑暴露给(expose)客户端应用程序。应用程序使用此商业逻辑就像你调用对象的一个方法或过程(语言中的一个函数)一样。 


5、serverlet
      Servlet(Server Applet),全称 Java Servlet,未有中文译文。是用 Java 编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。狭义的 Servlet 是指 Java 语言实现的一个接口,广义的 Servlet 是指任何实现了这个 Servlet 接口的类,一般情况下,人们将 Servlet 理解为后者。 
      Servlet 运行于支持 Java 的应用服务器中。从实现上讲,Servlet 可以响应任何类型的请求,但绝大多数情况下 Servlet 只用来扩展基于 HTTP 协议的 Web 服务器。

6、Tomcat
      Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好 Apache 服务器,可利用它响应对 HTML 页面的访问请求。实际上 Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行 tomcat 时,它实际上作为一个与 Apache 独立的进程单独运行的。 

Apache Tomcat is an open source software implementation of the Java Servlet and JavaServer Pages technologies.

 

 Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器。因为 Tomcat 技术先进、性能稳定且免费,所以深受 Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的 Web 应用服务器。 

一、Tomcat 与应用服务器 

      到目前为止,Tomcat 一直被认为是 Servlet/JSP API 的执行器,也就所谓的 Servlet 容器。然而,Tomcat并不仅仅如此,它还提供了 JNDI 和 JMX API 的实现机制。尽管如此,Tomcat 仍然还不能算是应用服务器,因为它不提供大多数 J2EE API 的支持。 

      很有意思的是,目前许多的应用服务器通常把 Tomcat 作为它们 Servlet 和 JSP API 的容器。由于 Tomcat允许开发者只需通过加入一行致谢,就可以把 Tomcat 嵌入到它们的应用中。遗憾的是,许多商业应用服务器并没有遵守此规则。 

      对于开发者来说,如果是为了寻找利用 Servlet、JSP、JNDI 和 JMX 技术来生成 Java Web 应用的话,选择Tomcat 是一个优秀的解决方案;但是为了寻找支持其他的 J2EE API,那么寻找一个应用服务器或者把 Tomcat作为应用服务器的辅助,将是一个不错的解决方案;第三种方式是找到独立的 J2EE API 实现,然后把它们跟Tomcat 结合起来使用。虽然整合会带来相关的问题,但是这种方式是最为有效的。 

二、Tomcat 与 Web 服务器 

      Tomcat 是提供一个支持 Servlet 和 JSP 运行的容器。Servlet 和 JSP 能根据实时需要,产生动态网页内容。而对于 Web 服务器来说, Apache 仅仅支持静态网页,对于支持动态网页就会显得无能为力;Tomcat 则既能为动态网页服务,同时也能为静态网页提供支持。尽管它没有通常的 Web 服务器快、功能也不如 Web 服务器丰富,但是 Tomcat 逐渐为支持静态内容不断扩充。大多数的 Web 服务器都是用底层语言编写如 C,利用了相应平台的特征,因此用纯 Java 编写的 Tomcat 执行速度不可能与它们相提并论。 

      一般来说,大的站点都是将 Tomcat 与 Apache 的结合,Apache 负责接受所有来自客户端的 HTTP 请求,然后将 Servlets 和 JSP 的请求转发给 Tomcat 来处理。Tomcat 完成处理后,将响应传回给 Apache,最后 Apache 将响应返回给客户端。 

小弟菜鸟一枚,初来乍到,有什么错误还望各位大神不吝指出,^_^。

java 技术树如下:

 

 

一. Git版本管理+Maven工程管理

微博新兵训练营课程——环境与工具

二. Java编程

书籍

资料

三. 开发框架

对于这些框架或者是一些常用的软件,个人最推崇的还是阅读官方文档来学习。当然,看这些资料能让你入门地更加快速一些。

更进一步的,在学会使用之后,去阅读这些框架或软件的源码是必不可少的一步。阅读源码的一种比较好的步骤如下:

  • 1) 先阅读架构文档
  • 2) 根据架构,将源码文件以模块(或上下层级)分类
  • 3) 从最独立(依赖性最小)的模块代码读起
  • 4) 阅读该模块功能文档
  • 5) 阅读该模块源代码
  • 6) 一边阅读一边整理「调用关系表」
  • 7) goto 3

四. 性能优化与诊断-系统

《Linux服务器性能调整》

学习内容:

  • Linux概述
  • 性能分析工具
  • 系统调优
  • Linux服务器应用的性能特征
  • 调优案例分析

五. 性能优化与诊断-JVM

六. 消息中间件

JMS

最为经典,也比较简单的一个消息中间件规范,ActiveMQ是其一个实现。但由于自身的一些局限,不再推荐使用。

RabbitMQ

RabbitMQ是AMQP(The Advanced Message Queuing Protocol)协议的实现。适用于需要事务管理、对消息丢失很敏感的应用场景。对比kafka来看,RabbitMQ更为强调消息的可靠性、事务等。通过阅读官方文档学习即可:官方文档

Kafka

基于日志的消息队列,首推当然是官方文档: http://kafka.apache.org/documentation.html

  • kafka中文教程:比较不错的中文教程

    学习内容:

    • 开始学习kafka
    • 入门
    • 接口
    • 配置
    • 设计
    • 实现
    • 什么是kafka
    • 什么场景下使用kafka
  • kafka-study: 笔者在学习kafka时的一些笔记

七. OAuth认证技术

原理

OAuth是目前最为流行的第三方认证技术,即如何为第三方应用提供基于自己系统帐户体系的认证。目前,微博、微信、QQ、Facebook、Twitter基本上都是通过此协议让第三方应用集成的。简单的介绍可见百度百科简介: OAuth

此外,这里有一篇博文讲的比较详细:OAuth的机制原理讲解及开发流程

开源实现

八. Redis设计与实现

  • Redis命令: 使用当然要看这份权威文档,也是平常开发中最常用的参考资料。

  • Redis设计与实现:可以通过此文档来学习Redis的原理。当然,自己去看redis的源代码更是不错的选择。

    学习内容:

    • 常用命令以及数据结构
    • 内部数据结构
    • 内存映射数据库结构
    • redis数据类型
    • 功能的实现
    • 内部运作机制

九. 数据相关

理论基础

  • MapReduce: 分布式计算的鼻祖,当然谷歌现在推出了新的计算模型。
  • GFS: 分布式存储技术,开源实现为HDFS
  • Bigtable: 稀疏大型数据库(列数据库)技术,开源实现为HBASE。

作为业界良心的google还有其他许多先进的分布式技术,其论文也非常值得去研读。可以通过此链接获取一些论文的内容:http://www.chinacloud.cn/show.aspx?id=14382&cid=11

实时计算

离线计算

Lambda架构

大数据领域的经典架构方案,融合了离线和实时计算模型,对外能够提供稳定可靠的数据。对此架构的剖析可见此篇文章:Linkedln技术高管Jay Kreps:Lambda架构剖析

机器学习

除了个性化推荐系统之外,CTR预估、广告推荐、预测模型都是机器学习的应用场景。

 

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。

JSP简单访问数据库 - 2016-09-20 17:09:01

Java代码 public class DBHelper { private String driverName; private String url; private String user; private String password; private Connection connection; private String createTableSql; private String dropTableSql; public void getConnection() { if (null =

微信jsapi扫一扫接口实现(4) - 2016-09-20 14:09:19

微信扫一扫功能在我们日常生活中很常见,那么微信jsapi是如何实现扫一扫功能的呢,接来下给大家详细介绍,并附有代码实现。 微信扫一扫  @V型知识库  原创 调起微信扫一扫接口 1 2 3 4 5 6 7 wx.scanQRCode({      needResult: 0,  // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,      scanType: [ "qrCode" , "barCode" ],  // 可以指定扫二维码还是一维码,默认二者都有      success:  func

mysql操作指令 - 2016-09-19 18:09:09

一、连接mysql   进入 mysql 的安装目录;   $ bin/mysql -p [host IP 如果是登录本地的mysql 可以不写 -p 直接 -u] -u [userName] -p   输入密码,回车,接连; 二、权限操作[如果你很了解mysql数据库后,你可以直接去修改系统表,然后用 mysql flush privileges; 指令让权限生效] 1、赋权   mysqlGRANT ALL[权限名,all 表示所有权限] PRIVILEGES ON [dataBaseName *.*
ws-http.java 好久没有敲过java代码了,今天我家妹纸问我怎么写http post,第一想起来的就是 httpclient,找了下写个简单的东西搞个这么大的库,顺顺觉得杀鸡用牛刀了,记得以前jdk里面是自带httpclient的 sun.net.www.http.HttpClient ,jdk8里面好像移除了,没办法,整个简单的吧,够用就行. 仓库地址:  https://github.com/toohamster/ws-http.java Response httpResponse = ne

XML - JAXP技术 - DOM解析 - 2016-09-19 18:09:12

中秋节刚过去,龙哥布置的几个任务还没做完。唉,又开始学XML了。   DOM解析的基本思路: 1、将整个XML文件一次性读入内存 2、将整个XML看做一棵树 3、XML中的每一个标签,属性,文本都看做是树上的一个结点 4、然后可以对结点进行增删改查的操作   话不多说,上代码。 1、首先我在D:\ABC中新建了一个文本文件,重命名为stus.xml,以下是文件中的内容 ?xml version = "1.0" encoding = "GBK" ? stus class = "S160401A" stu n

java新手入门 - 2016-09-19 17:09:16

java新手入门 Java总有它的千般好处使你选择它,但这些随便翻翻书或在网上逛一圈就能找到答案。在本文中,笔者把自己学习Java的一些切身体会和过程写出来,供Java培训初学者做个参考。 我在学习Java的过程中主要围绕以下几个方面来学习: 1.时刻提醒自己Java是一种OOP语言工具,而不仅仅是编码,只有这样才能总体把握和运用Java。 2.在学习的过程中,最好能够了解Java的底层机制,而不是仅仅停留在表层,不是抄书上的例子运行出结果就可以。要注意,即便对一个简单的例子也要有耐心去琢磨、调试、改动。

自动id生成器类 - 2016-09-19 17:09:13

import java.util.concurrent.atomic.AtomicInteger;AtomicInteger idCreate = new AtomicInteger();idCreate.incrementAndGet();//返回int类型 //获取当前的值 public final int get() //取当前的值,并设置新的值 public final int getAndSet(int newValue) //获取当前的值,并自增 public final int getAnd
[size=medium]    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid,nginx等反向代理软件就不能获取到客户端的真实IP地址了。 如果使用了反向代理软件,将http://192.168.1.110:2046/ 的URL反向代理为 http://www.jb51.net / 的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1 或 19

JAVA 常量池与String - 2016-09-19 14:09:50

  提到常量池,一般是指运行时常量池,是方法区的一部分。方法区就是通常说的永久代。那么常量池中会存储那些数据呢?   ①编译期生成的各种字面量和符号引用   ②也有可能将运行期间的常量放入常量池   先看第一种: 编译期生成的各种字面量和符号引用,这部分数据经过编译后存在.class文件的‘常量池’中,注意这个所谓的‘常量池’是‘静态常量池’,静态常量池的数据会在类加载后放入运行时常量池。举个例子   测试一 public class ConstantPoolAndStrTest { String str

btrace跟踪组数创建 - 2016-09-19 14:09:44

之前有人问我怎么用btrace跟踪数组的创建,这里记录一下。 需要靠Kind.NEWARRAY,比如要跟踪int数组的创建可以这么写 @BTracepublic class BtraceCreateArray { @OnMethod(clazz = "/.*/", method = "/.*/", location = @Location(value = Kind.NEWARRAY, clazz = "int") ) public static void findCreateIntArray() { pri