一、Java基础
1.1 后台应用架构
1.1.1 单体架构
单体架构(Monolithic Architecture)是一种传统的软件架构模式,把所有的功能都放在同一个应用里,将整个应用部署在一台服务器上。在单体架构中,所有的功能模块都被打包在一起(比如Java实现就打包成jar包或war包部署),共享同一个代码库和数据库。
优点:
- 开发简单:由于整个应用程序是一个单一的实体,因此开发过程相对简单,开发人员可以更容易地理解和管理代码。
- 调试和测试容易:由于整个应用程序在同一个环境下运行,因此调试和测试过程相对容易。
- 部署简单:将整个应用程序作为一个单元进行部署,只需将单个代码库和数据库进行部署。
- 性能较好:由于应用程序内部通信没有网络延迟,因此性能通常较好。
缺点:
- 可扩展性差:由于所有功能模块都耦合在一起,当应用程序需要扩展时,必须扩展整个应用程序,而不仅仅是某个特定的模块。
- 维护困难:随着应用程序规模的增长,代码库会变得庞大且复杂,导致维护困难。
- 技术栈限制:由于整个应用程序使用相同的技术栈,因此难以使用不同的技术栈开发特定模块。
- 可靠性差:由于整个应用程序是一个单一的实体,当某个模块出现问题时,整个应用程序可能会崩溃。
1.1.2 微服务
微服务架构风格的开发方法,是以开发一组小型服务的方式来开发一个独立的应用系统的。其中每个小型服务都运行在自己的进程中,并经常采用HTTP资源API轻量的机制来相互通信。这些服务围绕业务功能进行构建,并能通过全自动的部署机制来进行独立部署。这些微服务可以使用不同的语言来编写,并且可以使用不同的数据存储技术。对这些微服务我们仅做最低限度的集中管理。
1.2 Java
1.2.1 Java的工作原理
Java的工作原理涉及到四个主要方面:Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口。
1.2.1.1 Java编程语言
Java编程语言是Java开发中的核心部分。通过这种编程语言,开发者可以创建各种类、方法和变量等元素来实现功能。Java编程语言采用面向对象的编程方式,使用类来组织和管理相关的数据和功能,并提供了丰富的类库供开发者使用。
1.2.1.2 Java类文件格式
Java类文件格式是Java源代码编译后生成的中间形式。Java编译器(Javac)将Java源代码编译成一种称为“字节码”的格式,然后将其存储在独立的.class文件中。这个字节码格式具有跨平台的特性,可以在所有支持Java虚拟机的平台上运行。这使得Java编程在不同的操作系统和硬件上都能够稳定地运行。
1.2.1.3 Java虚拟机(JVM)
Java虚拟机是Java工作原理中最核心的组成部分。它是一个抽象的计算机,为Java程序提供了运行环境。Java虚拟机通过解释字节码并在内存中执行转换(通过JVM的解释器转换为操作系统所能识别的机器码)来运行Java应用程序。当Java应用程序需要执行时,Java虚拟机会在内存中创建一个Java进程,并开始解释和执行应用程序的字节码。Java虚拟机还提供了一些其他功能,如垃圾回收和线程管理等。
1.2.1.4 Java应用程序接口
Java应用程序接口(API)是Java工作原理的最后一个组成部分。它包含了各种Java库和工具,可以帮助开发人员快速地实现常见的功能。Java API包括标准库、扩展库和第三方库。标准库包含了Java核心构建块,如集合、输入/输出、网络、并发等。扩展库则提供了更多的类和接口,可以增强Java程序的功能。第三方库则由其他开发者提供,可以用于特定的应用程序开发中。
总结:当编辑并运行一个Java程序时,需要同时涉及到这四种方面。首先,使用文本编辑软件或集成开发环境在Java源文件中定义不同的类,并通过调用这些类中的方法访问资源系统。然后,源文件被编译成一种二进制字节码,存储在.class文件中。接着,通过运行与操作系统平台环境相对应的Java虚拟机来运行.class文件,并执行转换产生的机器码,调用其中实现的方法来满足程序的Java API调用。
1.2.2 JDK
1.2.2.1 JDK与JRE的关系
- JRE:Java Runtime Environment缩写,指Java运行时环境, 包含 JVM + Java核心类库
- JDK:Java Development Kit,即 Java 语言的软件开发工具包,JDK协议基于 JRL(JavaResearch License) 协议
1.2.2.2 安装Oracle官方JDK
下载地址:https://www.oracle.com/java/technologies/downloads/,可选择java8或java11版本(目前主流使用的版本)下载。这里采用二进制文件安装。当然也可以用yum或apt安装openjdk,但相对来说,Oracle jDK具有更好的响应能力和JVM性能,更加稳定。
#解压
tar -xf jdk-11.0.22_linux-x64_bin.tar.gz
mv jdk-11.0.22 /usr/local/jdk11
#初始化环境变量
vim /etc/profile.d/jdk.sh
#!/bin/bash
export JAVA_HOME=/usr/local/jdk11
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile.d/jdk.sh
java -version
二、Tomcat基础功能
2.1 Tomcat介绍
Tomcat 服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,Tomcat 具有处理HTML静态资源页面的功能,同时它还是一个 Servlet和JSP容器。
2.2 安装Tomcat
2.2.1 二进制安装Tomcat
也可以采用yum或apt方式安装,这里就用二进制文件方式安装。下载地址:https://tomcat.apache.org/download-80.cgi或https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat
#下载安装包并解压
wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.18/bin/apache-tomcat-10.1.18.tar.gz
tar -xf apache-tomcat-10.1.18.tar.gz
mv apache-tomcat-10.1.18 /usr/local/tomcat
#指定PATH变量
vim /etc/profile.d/tomcat.sh
#!/bin/bash
export TOMCAT_HOME=/usr/local/tomcat
export PATH=$PATH:$TOMCAT_HOME/bin
source /etc/profile.d/tomcat.sh
cd /usr/local/tomcat/bin
#启动Tomcat服务
sh startup.sh或者./catalina.sh start
#停止Tomcat服务
sh shutdown.sh或者./catalina.sh stop
访问http://tomcat服务器IP:8080,可看到如下界面
Tomcat的核心分为3个部分:
- Web容器:处理静态页面;
- JSP容器:把jsp页面翻译成一般的 servlet(早期的Java动态网页技术)再翻译成字节码再执行
- catalina:是一个servlet容器,用于处理servlet
2.2.2 配置Tomcat自启动的Service文件
生产环境中最好用普通用户启动Tomcat。
useradd -r -s /sbin/nologin tomcat
chown -R tomcat:tomcat /usr/local/tomcat
vim /lib/systemd/system/tomcat.service
[Unit]
Descriptinotallow=Tomcat
#After=syslog.target network.target remote-fs.target nss-lookup.target
After=syslog.target network.target
[Service]
Type=forking
#添加Java的环境变量,环境变量名及路径随安装JDK时的定义来
Envirnotallow=JAVA_HOME=/usr/local/jdk11
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
PrivateTmp=true
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target
systemctl enable --now tomcat
systemctl status tomcat
2.3 Tomcat的文件结构和目录组成
2.3.1 目录结构
目录 |
说明 |
bin |
服务启动、停止等相关程序和文件 |
conf |
配置文件 |
lib |
库目录 |
logs |
日志目录 |
webapps |
应用程序的部署目录 |
work |
jsp编译后的结果文件,建议提前预热访问,升级应用后,删除此目录数据才能更新 |
2.3.2 配置文件和日志
2.3.2.1 配置文件
在tomcat安装目录下的 conf 子目录中,有以下的 tomcat 的配置文件:
文件名 |
说明 |
server.xml |
主配置文件 |
web.xml |
每个webapp只有“部署”后才能被访问,它的部署方式通常由web.xml进行定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认部署相关的配置,每个web应用也可以使用专用配置文件,来覆盖全局文件 |
context.xml |
用于定义所有web应用均需加载的Context配置,此文件为所有的webapps提供默认配置,每个web应用也可以使用自已专用的配置,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中, 覆盖全局的文件 |
tomcat-users.xml |
用户认证的账号和密码文件 |
catalina.policy |
当使用security选项启动tomcat时,用于为tomcat设置安全策略 |
catalina.properties |
Tomcat环境变量的配置,用于设定类加载器路径,以及一些与JVM调优相关参数 |
logging.properties |
Tomcat日志系统相关的配置,可以修改日志级别和日志路径等 |
2.3.2.2 日志文件
2.3.2.2.1 Tomcat日志文件说明
tomcat有五类日志:catalina、localhost、manager、admin、host-manager。
- catalina.out
catalina.out即标准输出和标准出错,所有输出到这两个位置的都会进入catalina.out,这里包含tomcat 运行自己输出的日志以及应用里向console输出的日志。默认这个日志文件是不会进行自动切割的,需要借助其他工具进行切割(注意:catalina.out文件如果过大会受影响)
- catalina.YYYY-MM-DD.log
catalina.{yyyy-MM-dd}.log是tomcat自己运行的一些日志,这些日志还会输出到catalina.out,但是应用向console输出的日志不会输出到catalina.{yyyy-MM-dd}.log,它是tomcat的启动和暂停时的运行日志,注意,它和catalina.out是里面的内容是不一样的。
- localhost.YYYY-MM-DD.log
localhost.{yyyy-MM-dd}.log主要是应用初始化(listener,filter,servlet)未处理的异常最后被tomcat捕获而输出的日志,它也是包含tomcat的启动和暂停时的运行日志,但它没有catalina.YYYY-MM-DD.log日志全。 它只是记录了部分日志。
- localhost_access_log.YYYY-MM-DD.txt
这个是访问tomcat的日志,请求时间和资源,状态码都有记录。
- host-manager.YYYY-MM-DD.log
这个是放tomcat的自带的manager项目的日志信息的,未看到有什么重要的日志信息。
- manager.YYYY-MM-DD.log
这个是tomcat
manager项目专有的日志文件。
2.3.2.2.2 Tomcat访问日志格式
格式样式为%h %l %u %t “%r” %s %b。服务器托管网类似于如下格式(查看localhost_access_log.YYYY-MM-DD.txt):
192.168.131.1 - - [31/Jan/2024:11:25:57 +0800] "GET /examples/ HTTP/1.1" 403 865
客户端地址 用户验证 用户账号 时间请求 方式+URL 响应码 文件大小
具体样式说明如下(参考https://tomcat.apache.org/tomcat-10.1-doc/config/valve.html#Access_Logging):
* %a - Remote IP address // 这是记录访问者的IP
* %A - Local IP address // 这是记录本地服务器的IP
* %b - Bytes sent, excluding HTTP headers, or '-' if zero // 发送信息的字节数,不包括http头,如果字节数为0的话,显示为-
* %B - Bytes sent, excluding HTTP headers // 发送信息的字节数,不包括http头。
* %h - Remote host name (or IP address if resolveHosts is false) // 远程主机名(如果连接器的enableLookups为false,则为IP地址)。例如我的日志里是192.168.131.1
* %H - Request protocol //访问者的协议,这里是HTTP/1.1
* %l - Remote logical username from identd (always returns '-') // 远程逻辑用户 (可能这样翻译:记录浏览者进行身份验证时提供的名字)(通常返回 '-')
* %m - Request method (GET, POST, etc.) // 访问的方式,是GET还是POST
* %p - Local port on which this request was received // 本地接收访问的端口
* %q - Query string (prepended with a '?' if it exists) // 比如你访问的是aaa.jsp?bbb=ccc,那么这里就显示?bbb=ccc,就是querystring的意思
* %r - First line of the request (method and request URI) //请求报文的第一行(方法和URI)
* %s - HTTP status code of the response // http的响应状态码
* %S - User session ID // 用户的session ID,这个session ID大家可以另外查一下详细的解释,反正每次都会生成不同的session ID
* %t - Date and time, in Common Log Format // 请求时间
* %u - Remote user that was authenticated (if any), else '-' // 得到了验证的访问者,否则为"-"
* %U - Requested URL path // 访问的URL地址,我这里是/rightmainima/leftbott4.swf
* %v - Local server name // 服务器名称,可能就是你url里面写的那个吧,我这里是localhost
* %D - Time taken to process the request, in millis // 请求消耗的时间,以毫秒记
* %T - Time taken to process the request, in seconds //请求消耗的时间,以秒记
There is also support to write information from the cookie, incoming header, the Session or something else in the ServletRequest.
It is modeled after the apache syntax:
* %{xxx}i for incoming headers
* %{xxx}c for a specific cookie
* %{xxx}r xxx is an attribute in the ServletRequest
* %{xxx}s xxx is an attribute in the HttpSession
要想修改Tomcat的访问日志格式,则修改server.xml中的pattern字段。
说明:"在html 中表示双引号"符号
此外Tomcat可实现json格式的访问日志。实现方式如下:
vim server.xml
systemctl restart tomcat
刷新Tomcat页面访问,再看localhost_access_log.YYYY_MM_DD.txt就发现日志变成了json格式。
利用jq工具(需事先安装)解析json格式。
2.3.3 组件
2.3.3.1 组件分层和分类
- 顶级组件:Server,代表整个Tomcat容器,一台主机可以启动多tomcat实例,需要确保端口不要产生冲突
- 服务类组件:Service,实现组织Engine和Connector,建立两者之间关联关系, service 里面只能包含一个Engine
- 连接器组件:Connector,有HTTP(默认端口8080/tcp)、HTTPS(默认端口8443/tcp)、AJP(默认端口 8009/tcp)协议的连接器,AJP(Apache Jserv protocol)是一种基于TCP的二进制通讯协议。
- 容器类:Engine、Host(虚拟主机)、Context(上下文件,解决路径映射)都是容器类组件,可以嵌入其它组件, 内部配置如何运行应用程序。
- 内嵌类:可以内嵌到其他组件内,valve、logger、realm、loader、manager等。以logger举例,在不同容器组 件内分别定义。
- 集群类组件:listener、cluster
2.3.3.2 Tomcat内部组成
名称 |
说明 |
Server |
服务器,Tomcat运行的进程实例,一个Server中可以有多个Service,但通常就一个 |
Service |
服务,用来组织Engine和Connector的对应关系,一个Service中只有一个Engine |
Connector |
连接器,负责客户端的HTTP、HTTPS、AJP等协议连接。一个Connector只属于某一个Engine |
Engine |
即引擎,用来响应并处理用户请求。一个Engine上可以绑定多个Connector |
Host |
即虚拟主机,可以实现多虚拟主机,例如使用不同的主机头区分 |
Context |
应用的上下文,配置特定url路径映射和目录的映射关系:url=> directory |
2.3.3.3 对核心组件的补充说明
- Tomcat启动一个Server进程。可以启动多个Server,即tomcat的多实例, 但一般只启动一个
- 创建一个Service提供服务。可以创建多个Service,但一般也只创建一个
- 每个Service中,是Engine和其连接器Conne服务器托管网ctor的关联配置。可以为这个Service提供多个连接器Connector,这些Connector使用了不同的协议,绑定了不同的端口。其作用就是处理来自客户端的不同的连接请求或响应
- Service 内部还定义了Engine,引擎才是真正的处理请求的入口,其内部定义多个虚拟主机Host Engine对请求头做了分析,将请求发送给相应的虚拟主机 如果没有匹配,数据就发往Engine上的defaultHost缺省虚拟主机 Engine上的缺省虚拟主机可以修改
- Host 定义虚拟主机,虚拟主机有name名称,通过名称匹配
- Context 定义应用程序单独的路径映射和配置
在server.xml中即可看到多个组件的关系。
2.3.3.4 Tomcat处理请求的过程
- 浏览器端的请求被发送到服务端端口8080,Tomcat进程监听在此端口上。通过侦听的HTTP/1.1 Connector获得此请求。
- Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的响应
- Engine获得请求localhost:8080/test/index.jsp,遍历它所有虚拟主机Host
- Engine匹配到名为localhost的Host。如果匹配不到,就把请求交给该Engine中的defaultHost处理
- localhost Host获得请求/test/index.jsp,匹配它所拥有的所有Context
- Host匹配到路径为/test的Context
- path=/test的Context获得请求index.jsp,在它的mapping table中寻找对应的servlet
- Context匹配到URL PATTERN为 *.jsp 的servlet,对应于JspServlet类构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法。
- Context把执行完了之后的HttpServletResponse对象返回给Host
- Host把HttpServletResponse对象返回给Engine
- Engine把HttpServletResponse对象返回给Connector
- Connector把HttpServletResponse对象返回给浏览器端
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
模拟回归模型的数据 验证回归模型的首选方法是模拟来自它们的数据,并查看模拟数据是否捕获原始数据的相关特征。感兴趣的基本特征是平均值。我喜欢这种方法,因为它可以扩展到广义线性模型(logistic,Poisson,gamma,…)和其他回归模型,比如t-re…