启动别混着用,systenctl start comcat 启动就一套, startup.sh
目录
java 基础
WEB架构
微服务
- 属于SOA(Service Oriented Architecture)的子集
- 微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底去掉耦合,每一个微服务提供单个业务功能,一个服务只做一件事。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等
- 从技术角度讲就是一种小而独立的处理过程,类似与进程的概念,能够自行单独启动或销毁微服务架构(分布式系统),各个模块/服务,各自独立出来,"让专业的人干专业的事",独部署。分布式系统中,不同的服务可以使用各自独立的数据库。
- 服务之间采用轻量级的通信机制(通常是基于HTTP的RESTful API)。
- 微服务设计的思想改变了原有的企业研发团队组织架构。传统的研发组织架构是水平架构,前端、后端、DBA、测试分别有自己对应的团队,属于水平团队组织架构。而微服务的设计思想对团队的划分有着一定的影响,使得团队组织架构的划分更倾向于垂直架构,比如用户业务是一个团队来负责,支付业务是一个团队来负责。但实际上在企业中并不会把团队组织架构拆分得这么绝对,垂直架构只是一种理想的架构
- 微服务的实现框架有多种,不同的应用架构,部署方式也有不同
微服务的优缺点
微服务优点:
- 每个服务足够内聚,足够小,代码容易理解。这样能聚焦一个只当的业务功能或业务需求。
- 开发简单、开发效率提高,一个服务可能就是专业的只干一件事,微服务能够被小团队单独开发,这个小团队可以是2到5人的开发人员组成
- 微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的。
- 微服务能使用不同的语言开发
- 易于和第三方集成,微服务运行容易且灵活的方式集成自动部署,通过持续集成工具,如:Jenkins、Hudson、Bamboo
- 微服务易于被一个开发人员理解、修改和维护,这样小团队能够更关注自己的工作成果,无需通过
- 合作才能体现价值微服务允许你利用融合最新技术。微服务只是业务逻辑的代码,不会和HTML/CSS或其他界面组件混合,即前后端分离
- 每个微服务都有自己的存储能力,可以有自己的数据库,也可以有统一数据库
微服务缺点:
- 微服务把原有的一个项目拆分成多个独立工程,增加了开发、测试、运维、监控等的复杂度
- 微服务架构需要保证不同服务之间的数据一致性,引入了分布式事务和异步补偿机制,为设计和开发带来一定挑战
- 开发人员和运维需要处理分布式系统的复杂性,需要更强的技术能力
- 微服务适用于复杂的大系统,对于小型应用使用微服务,进行盲目的拆分只会增加其维护和开发成本
常见的微服务框架
Dubbo
阿里开源贡献给了ASF,目前已经是Apache的顶级项目
一款高性能的Java RPC服务框架,微服务生态体系中的一个重要组件
将单体程序分解成多个功能服务模块,模块间使用Dubbo框架提供的高性能RPC通信
内部协调使用Zookeeper,实现服务注册、服务发现和服务治理
Spring cloud
一个完整的微服务解决方案,相当于Dubbo的超集
微服务框架,将单体应用拆分为粒度更小的单一功能服务
基于HTTP协议的REST(Representational State Transfer 表述性状态转移)风格实现模块间
通信
JDK和JRE
Java SE API: Java 基础类库开发接口
JRE:Java Runtime Environment缩写,指Java运行时环境, 包含 JVM + Java核心类库
JDK:Java Development Kit,即 Java 语言的软件开发工具包,JDK协议基于 JRL(JavaResearch License)协议
JDK是什么?
1.JDK全称Java Development Kit 中文意思是Java 开发工具包
2.JDK是sun公司开发的
3.JDK包括 jre (Java Runtime Environment) Java 运行环境,一堆Java工具和Java基础的类库
JDK和JRE的区别?
jdk是程序员做开发的时候必须要的开发环境,jre是运行环境。
JDK_FILE="jdk-8u341-linux-x64.tar.gz"
#JDK_FILE="jdk-11.0.15.1_linux-x64_bin.tar.gz"
#JDK_FILE="jdk-11.0.12_linux-x64_bin.tar.gz"
#JDK_FILE="jdk-8u301-linux-x64.tar.gz"
JDK_DIR="/usr/local"
DIR=`pwd`
color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \E[0m"
echo -n "$2" && $MOVE_TO_COL
echo -n "["
if [ $1 = "success" -o $1 = "0" ] ;then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $1 = "failure" -o $1 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}
install_jdk(){
if ! [ -f "$DIR/$JDK_FILE" ];then
color 1 "$JDK_FILE 文件不存在"
exit;
elif [ -d $JDK_DIR/jdk ];then
color 1 "JDK 已经安装"
exit
else
[ -d "$JDK_DIR" ] || mkdir -pv $JDK_DIR
fi
tar xvf $DIR/$JDK_FILE -C $JDK_DIR
cd $JDK_DIR && ln -s jdk* jdk
cat > /etc/profile.d/jdk.sh <<EOF
export JAVA_HOME=$JDK_DIR/jdk
export PATH=\$PATH:\$JAVA_HOME/bin
#export JRE_HOME=\$JAVA_HOME/jre
#export CLASSPATH=.:\$JAVA_HOME/lib/:\$JRE_HOME/lib/
EOF
. /etc/profile.d/jdk.sh
java -version && color 0 "JDK 安装完成" || { color 1 "JDK 安装失败" ; exit; }
}
install_jdk
ln -s /usr/local/jdk1.8.0_341/bin/* /usr/local/bin/ #exit退出重新加载下,如果不行就创建软连接
C:\Program Files\Java\jdk1.8.0_341 #(默认安装)win安装到这里面,最好在当前路径下执行java,
Tomcat 支持java运行
商用:IBM WebSphere、Oracle WebLogic(原属于BEA公司)、Oracle Oc4j、RedHat JBoss等
开源:Tomcat、Jetty、Resin、Glassfish
从上往下嵌套
[root@ubuntu2004 ~]#apt -y install tomcat9 tomcat9-admin tomcat9-docs tomcat9-examples
JVM概念
JVM是Java Virtual Machine(Java虚拟机)的缩写。
简单来说JVM是用来解析和运行Java程序的。
二进制安装 Tomcat
tar xf apache-tomcat-9.0.65.tar.gz -C /usr/local/
[root@ubuntu2004 local]#ln -s apache-tomcat-9.0.65 tomcat #设置软连接
[root@ubuntu2004 bin]#echo PATH='/usr/local/tomcat/bin:$PATH' >/etc/profile.d/tomcat.sh
[root@ubuntu2004 bin]#. /etc/profile.d/tomcat.sh
[root@ubuntu2004 bin]#startup.sh #启动端口8080
10.0.0.101:8080 #在浏览器就能访问了
现在只是 以root的方式运行了,并没有开机启动,,他本事就是java程序,只不过是调用
[root@ubuntu2004 bin]#ll /usr/local/tomcat/logs/catalina.out #日志
-rw-r----- 1 root root 6545 9月 21 23:49 /usr/local/tomcat/logs/catalina.out
脚本安装
把java 和jdk的包扔进去
配置文件
[root@ubuntu2004 logs]#ll /usr/local/tomcat/logs/catalina.2022-09-22.log #日志文件
[root@ubuntu2004 tomcat]#ll work/Catalina/localhost/ROOT/org/apache/jsp/ #缓存位置
总用量 76 缓存文件
drwxr-x--- 2 tomcat tomcat 4096 9月 22 09:45 ./
drwxr-x--- 3 tomcat tomcat 4096 9月 22 00:03 ../
-rw-r----- 1 tomcat tomcat 18382 7月 14 20:28 index_jsp.class
-rw-r----- 1 tomcat tomcat 30325 7月 14 20:28 index_jsp.java
-rw-r----- 1 tomcat tomcat 5993 10月 18 2020 test_jsp.class
-rw-r----- 1 tomcat tomcat 5351 10月 18 2020 test_jsp.java
[root@ubuntu2004 logs]#tail -f localhost_access_log.2022-09-22.txt #访问日志
10.0.0.1 - - [22/Sep/2022:09:10:21 +0800] "GET /bg-button.png HTTP/1.1" 200 713
10.0.0.1 - - [22/Sep/2022:09:17:40 +0800] "GET /test.html HTTP/1.1" 200 27
10.0.0.1 - - [22/Sep/2022:09:17:42 +0800] "GET /test.html HTTP/1.1" 304 -
10.0.0.1 - - [22/Sep/2022:09:38:14 +0800] "GET /index.jsp.0 HTTP/1.1" 200 397
10.0.0.1 - - [22/Sep/2022:09:38:19 +0800] "GET /index.jsp.0 HTTP/1.1" 304 -
[root@ubuntu2004 webapps]#pwd #网页目录
/usr/local/tomcat/webapps
组件分层和分类
顶级组件
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、cluste
核心组件
- Tomcat启动一个Server进程。可以启动多个Server,即tomcat的多实例, 但一般只启动一个
- 创建一个Service提供服务。可以创建多个Service,但一般也只创建一个 每个Service中,是Engine和其连接器Connector的关联配置
- 可以为这个Service提供多个连接器Connector,这些Connector使用了不同的协议,绑定了不同的端口。其作用就是处理来自客户端的不同的连接请求或响应
- Service 内部还定义了Engine,引擎才是真正的处理请求的入口,其内部定义多个虚拟主机Host Engine对请求头做了分析,将请求发送给相应的虚拟主机 如果没有匹配,数据就发往Engine上的defaultHost缺省虚机 Engine上的缺省虚拟主机可以修改
- Host 定义虚拟主机,虚拟主机有name名称,通过名称匹配
- Context 定义应用程序单独的路径映射和配置 #就是这种嵌套关系
- Context 定义应用程序单独的路径映射和配置 #就是这种嵌套关系
范例: tomcat日志实现json格式的访问日志
pattern="{"clientip":"%h","ClientUser":"%l","authenticated":"%u","AccessTime":"%t","method":"%r","status":"%s","SendBytes":"%b","Query?string":"%q","partner":"%{Referer}i","AgentVersion":"%{User-Agent}i"}"/>
在文件最后的指定位置加进去
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="{"clientip":"%h","ClientUser":"%l","authenticated":"%u","AccessTime":"%t","method":"%r","status":"%s","SendBytes":"%b","Query?string":"%q","partner":"%{Referer}i","AgentVersion":"%{User-Agent}i"}"/>
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
[root@ubuntu2004 webapps]#tail -f /usr/local/tomcat/logs/localhost_access_log.2022-09-22.txt
运行日志文件 ,复制出一段,转成人看的
[root@ubuntu2004 ~]#cat a.txt |jq
{
"clientip": "10.0.0.1",
"ClientUser": "-",
"authenticated": "-",
"AccessTime": "[22/Sep/2022:10:50:08 +0800]",
"method": "GET /test.jsp HTTP/1.1",
"status": "200",
"SendBytes": "254",
"Query?string": "",
"partner": "-",
"AgentVersion": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:104.0) Gecko/20100101 Firefox/104.0"
}
总结
应用服务器
java应用jsp = php #模版文件 html+java
war=html,jsp,jar=zip格式 #依赖于tomcat应用服务器
jar=class文件= war+java应用服务器app.java #源码,文本
javac #编译器
app.class 二进制,字节码,中间代码,统一,所有OS统一格式
jvm,jre(jvm+库jar),jdk(jre+java相关工具) java 命令
机器码
tomcat结构test.jsp --> test_jsp.java --> test_jsp.class --JVM -- 机器码