一、Nginx
nginx安装
Nginx常用命令
Nginx配置文件
Nginx配置文件的位置在: /usr/local/nginx/conf/nginx.conf
Nginx配置文件主要分为如下三部分
【1】全局块:配置服务器整体运行的配置指令,比如 worker_processes 1;处理并发数的配置
【2】events 块:影响 Nginx 服务器与用户的网络连接,比如 worker_connections 1024; 支持的最大连接数为 1024。
【3】http 块包含两部分: http 全局块、server 块
Nginx中的正则表达式
Nginx中的localtion语法如下:
负载均衡的几种配置
总结
【1】什么是nginx服务器,nginx服务器是干什么用的,你都用过哪些功能?
答:nginx是http服务器,也是反向代理服务器,可以做静态网站资源服务器,也可以做反向代理服务器。用过负均衡、反向代理、动静分离、http服务器等功能。
nginx并发是50000,tomcat(500是理论值)大概300左右。
【2】nginx的常用命令
答:./nginx 启动 ./nginx -v 查看版本 ./nginx -s stop 关闭 ./nginx -s reload 重新加载配置文件
3】nginx如何配置静态服务
答:在/nginx/conf/nginx.conf中做如下配置(动静分离)
【4】如何配置反向代理
答:在/nginx/conf/nginx.conf做如下配置
反向代理支持表达式如下:
location [= | ~ | ~* | ^~] /uri{ }
【5】负载均衡配置
在nginx/conf/nginx.conf做如下配置
【6】什么是反向代理
正向代理代理的是客户端访问服务端,反向代理代理的是服务端,等待客户端访问代理服务。
【7】什么是动静分离
静态资源配置到nginx服务器中,动态资源通过nginx反向代理到tomcat。
二、docker虚拟化容器
Docker是什么
Docker 是一个开源的应用容器引擎,基于go语言并遵从apache2协议开源。
Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
Docker的三要素和架构图
Docker的三要素:镜像、容器、仓库
Centos7上安装docker
如果之前安装过旧版本的Docker,可以使用下面命令卸载:
1)首先需要虚拟机联网,安装yum工具
2)然后更新本地镜像源:
3)然后输入命令:
启动docker前,一定要关闭防火墙后!!
通过命令启动docker:
配置镜像加速
docker官方镜像仓库网速较差,我们需要设置国内镜像服务:
参考阿里云的镜像加速文档:阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台
Docker常用命令
镜像操作
-
镜名称一般分两部分组成:[repository]:[tag]。
常见的镜像操作如下:
容器操作
数据卷
数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。
一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录,操作宿主机的/var/lib/docker/volumes/html目录,就等于操作容器内的/usr/share/nginx/html目录。
数据卷的作用:
-
将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全
数据卷的操作命令
挂载数据卷
创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器内目
Dockerfile 自定义镜像
Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile快速创建自定义的镜像。
Dockerfile的13指令
Dockerfile综合案例
【1】编写镜像
# 基础镜像
FROM java:8
# 维护者
MAINTAINER psjj<psjj@163.com>
# copy tomcat包
ADD ./apache-tomcat-7.0.70.tar.gz /usr/local
# 设置工作目录
WORKDIR /usr/local
# 设置tomcat环境变量
ENV TOMCAT_HOME=/usr/local/apache-tomcat-7.0.70
ENV PATH=$PATH:$TOMCAT_HOME/bin
# 保留端口
EXPOSE 8080
# 启动容器运行命令
CMD startup.sh && tail -F catatlina.out
【2】构建镜像
docker build -t mytomcat:v1
【3】运行容器
docker run --name tomcat1 -d -p 80:8080 mytomcat:v1
Docker 网络管理
Docker容器互联
四种网络模式
自定义网路
1)基础命令
2)创建局域网
3)容器连接新网络并查看容器网络情况
4)指定网络模式
5)启动容器时加入指令网络
Docker-Compose
Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!
DockerCompose的详细语法参考官网:Overview | Docker DocsOverview | Docker Docs
安装 Docker-Compose
1)下载
2)修改权限
3)补全命令
如果这里出现错误,需要修改hosts文件:
echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts
docker-compose.yml 结构
build | 使用当前目录下的Dockerfile进行构建: |
image | 指定运行容器使用的镜像。以下格式都可以。
|
container_name | 指定容器名。 |
command | 覆盖容器启动后默认执行的命令(Dockerfile定义的CMD)。当Dockerfile定义了entrypoint的时候,docker-comose.yml定义的command会被覆盖。 |
entrypoint | 可以覆盖Dockerfile中定义的entrypoint命令。 |
ports | 将容器的端口80映射到宿主机的端口8080 ports: |
volumes | 挂载一个目录或者一个已存在的数据卷容器, HOST:CONTAINER 格式定义共享的目录 HOST:CONTAINER:RO 定义容器只读的目录 volumes: |
networks | 加入指定网络 networks: |
【1】什么是Docker,说说你理解的Docker,不要背八股文,说你自己的理解。
【2】你用的Docker是什么版本。
【3】你都用过哪些docker命令
答:我都用过镜像、容器、数据卷、网络等命令
【4】Docker容器网络管理的四种模型
三、Zookeeper
分布式相关概念
分布式系统分为:
-
单机架构:一个项目一个服务器
-
集群架构:同一个项目由多个服务器构成集群共同处理相同业务。
-
分布式架构:将一个项目拆分成n个模块,每个模块都能独立运行,都是独立的系统,由这些独立系统相互调用构成完整的项目。
什么是分布式
CAP 定理
分布式系统的三个指标Consistency(一致性),Availability (可用性),Partition tolerance (分区容错性)。
这三个指标不可能同时做到。这个结论就叫做 CAP 定理。
分区容错性
大多数分布式系统都分布在多个子网络。每个子网络就叫做一个区。分区容错的意思是,区间通信可能失败。 分区容错无法避免,因此可以认为 CAP 的 P 总是成立。
一致性
写操作之后的读操作,必须返回该值。
举例:某条记录是 v0,用户向 G1 发起一个写操作,将其改为 v1。接下来,用户的读操作就会得到 v1。这就叫一致性。 为了让 G2 也变为 v1,就要在 G1 写操作的时候,让 G1 向 G2 发送一条消息,要求 G2 也改成 v1。
可用性
只要收到用户的请求,服务器就必须给出回应。
一致性和可用性的矛盾
如果保证 G2 的一致性,那么 G1 必须在写操作时,锁定 G2 的读操作和写操作。只有数据同步后,才能重新开放读写。锁定期间,G2 不能读写,没有可用性。
Zookeeper 概述
Zookeeper 应用场景
数据发布/订阅
数据发布/订阅的一个常见的场景是配置中心,发布者把数据发布到ZooKeeper 的一个或一系列的节点上,供订阅者进行数据订阅,达到动态获取数据的目的。
ZooKeeper 采用的是推拉结合的方式。
负载均衡
负载均衡是一种手段,用来把对某种资源的访问分摊给不同的设备,从而减轻单点的压力。
命名服务
命名服务就是提供名称的服务。ZooKeeper 的命名服务有两个应用方面。
-
提供类 JNDI 功能,可以把系统中各种服务的名称、地址以及目录信息存放在 ZooKeeper, 需要的时候去 ZooKeeper 中读取。
-
制作分布式的序列号生成器。
分布式协调/通知
分布式协调/通知服务是将不同的分布式组件有机结合起来的关键所在。对于一个在多台机器上部署运行的应用而言,通常需要一个协调者(Coordinator)来控制整个系统的运行流程。
Zookeeper基本概念
集群角色
在分布式系统中,构成一个集群的每一台机器的都有自己的角色,最典型的集群模式Master/Slave模式(主备模式)。此模式中处理写操作的机器称为Master机器,所有通过异步复制方式获取最新数据,并提供读服务的机器称为Slave机器。
在ZooKeeper中,而是引入了Leader、Follower和 Observer三种角色。
数据节点
Watcher监听机制
ACL权限控制
Zookeeper 下载安装
Apache ZooKeeper 下载Zookeeper。
Zookeeper 集群运行
1)准备环境
在三个服务器上准备好jdk和zookeeper软件(虚拟机之间复制命令: scp -r ./jdk1.8.0_144/ 192.168.184.131:$PWD )。
2)解压zookeeper
tar -xvf apache-zookeeper-3.7.0-bin.tar.gz -C /usr/local mv apache-zookeeper-3.7.0-bin zookeeper
3)修改配置文件
进入zookeeper的安装目录的conf目录,修改zoo.cfg
cp zoo_sample.cfg zoo.cfg # The number of milliseconds of each tick tickTime=2000 # The number of ticks that the initial # synchronization phase can take initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=/usr/local/zookeeper/zkdata dataLogDir=/usr/local/zookeeper/zklogs # the port at which the clients will connect clientPort=2181 #autopurge.purgeInterval=1 server.1=192.168.184.130:2888:3888 server.2=192.168.184.131:2888:3888 server.3=192.168.184.132:2888:3888
4)创建数据持久化目录
对3台节点,都创建zkdata目录 。
mkdir /usr/local/zookeeper/zkdata mkdir /usr/local/zookeeper/zklogs
5)在工作目录中生成myid文件
第一台机器上: echo 1 > /usr/local/zookeeper/zkdata/myid 第二台机器上: echo 2 > /usr/local/zookeeper/zkdata/myid 第三台机器上: echo 3 > /usr/local/zookeeper/zkdata/myid
6)启动集群
zookeeper没有提供自动批量启动脚本,需要手动一台一台地起zookeeper进程。
在每一台节点上,运行命令:./zkServer.sh start
Zookeeper 服务管理
1)配置环境变量
2)启动服务 zkServer.sh start
3)查看服务状态 zkServer.sh status
Zookeeper 基本操作
Zookeeper 的数据模型
在Zookeeper中,可以说 Zookeeper中的所有存储的数据是由znode组成的,节点也称为 znode,并以 key/value 形式存储数据。
树:整体结构类似于 linux 文件系统的模式以树形结构存储。其中根路径以 / 开头。
保存数据:以 key/value 形式存储数据。key就是znode的节点路径,比如 /java , /server。
Zookeeper 节点特性
持久节点:
数据节点被创建后,就会一直存于与zookeeper服务器上, 直到有删除操作来主动清除这个节点。
临时节点:
该节点数据不会一直存储在 ZooKeeper 服务器上。和持久节点不同的是,临时节点的生命周期和客户端会话绑定。如果客户端会话失效(不是连接断开 ),那么这个节点就会自动被清除掉。 另外,在临时节点下面不能创建子节点。
顺序节点:
每个父节点会为他的第一级子节点维护一份时序,会记录每个子节点创建的先后顺序。
Zookeeper 节点操作命令
create | create [-s] [-e] path data acl 参数: -s:顺序节点 -e:临时节点 默认情况下,不添加-s或者-e参数的,创建的是持久节点。 |
ls | ls path [watch] 获取节点的名称 get path [watch] 获取节点中数据 |
set | set path data [version] version参数用于指定本次更新操作是基于ZNode的哪一个数据版本进行的。 |
delete | delete path [version] 如果节点包含子节点就报错。 |
Zookeeper 节点数据信息
示例:
参数具体含义
Zookeeper Watch 监听机制(重要)
监听节点变化:ls -w path。
监听节点值的变化:get -w path。
Watcher 特性总结
Zookeeper 权限控制 ACL
权限介绍
在ZooKeeper的实际使用中,往往是搭建一个共用的ZooKeeper集群,统一为若干个应用提供服务。在这种情况下,不同的应用之间不存在共享数据的使用场景,因此需要解决不同应用之间的权限问题。
语法结构:
权限模式(Schema)
授权对象(ID)
权限permission
权限相关命令
addauth digest <user>:<password>
Zookeeper Java客户端操作
原生API操作
1)引入依赖
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.8</version>
</dependency>
2) 示例代码
package top.psjj.zookeeperstudy;
import org.apache.zookeeper.*;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
/**
* @Auther: 胖叔讲java
* @Date: 2023/12/19 - 12 - 19 - 16:38
* @Decsription: top.psjj.zookeeperstudy
* @version: 1.0
*/
@SpringBootTest
public class ZookeeperCli {
@Test
public void test1() throws Exception{
//1.创建会话:ip:端口、超时时间毫秒,watcher监视器
ZooKeeper zooKeeper = new ZooKeeper("192.168.184.130:2181", 50000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("正在监听");
}
});
System.out.println(zooKeeper.getState());
//2.创建连接,参数:节点名字、节点值、ACL策略、节点类型
/*String result = zooKeeper.create("/node1", "1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(result);*/
//3.删除节点
//zooKeeper.delete("/node1",-1);
//4.修改节点
zooKeeper.setData("/node1","111".getBytes(),-1);
//5.获取节点数据
byte[] data = zooKeeper.getData("/node1", null, null);
System.out.println(new String(data));
}
}
zkclient 客户端操作
zkclient是Github上一个开源的Zookeeper客户端,在Zookeeper原生 API接口之上进行了包装,是一个更加易用的Zookeeper客户端。同时Zkclient在内部实现了诸如Session超时重连,Watcher反复注册等功能,从而提高开发效率。、
1)添加依赖
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
2)示例
public class ZkClientTest {
private ZkClient zk;
@BeforeEach
public void before(){
//创建会话
zk = new ZkClient("192.168.184.130");
System.out.println(zk);
}
@Test //获取所有子节点
public void test1(){
List<String> children = zk.getChildren("/");
System.out.println(children);
}
@Test //创建节点
public void test2(){
String node = zk.create("/node2", "2", CreateMode.PERSISTENT);
System.out.println(node);
}
@Test //修改节点
public void test3(){
zk.writeData("/node2","22");
}
@Test //获取数据
public void test4(){
Object result = zk.readData("/node2");
System.out.println(result);
}
@Test //删除节点
public void test5(){
boolean delete = zk.delete("/node2");
System.out.println(delete);
}
@Test //注册子节点事件
public void test6() throws Exception{
zk.subscribeChildChanges("/node1", new IZkChildListener() {
@Override
public void handleChildChange(String s, List<String> list) throws Exception {
System.out.println("子节点变了");
System.out.println(list);
}
});
Thread.sleep(500000);
}
@Test //注册节点值变化事件
public void test7() throws Exception{
zk.subscribeDataChanges("/node1", new IZkDataListener() {
@Override
public void handleDataChange(String s, Object o) throws Exception {
System.out.println(s);
System.out.println(o);
System.out.println("数据改变了");
}
@Override
public void handleDataDeleted(String s) throws Exception {
System.out.println("数据删除了");
}
});
Thread.sleep(50000000);
}
}
Apache Curator 客户端操作
maven依赖
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
示例:
public class CuratorTest {
public static void main(String[] args) throws Exception {
// 1. 创建会话
String connStr = "192.168.184.130:2181,192.168.184.131:2181,192.168.184.132:2181";
CuratorFramework cur = CuratorFrameworkFactory
.builder()
.connectString(connStr)
.connectionTimeoutMs(5000)
.retryPolicy(new ExponentialBackoffRetry(1000, 3))
.build();
// 连接
cur.start();
//2. 创建节点
// cur.create().withMode(CreateMode.PERSISTENT).forPath("/node3","3".getBytes());
//3. 获取数据
// byte[] bytes = cur.getData().forPath("/node3");
// System.out.println(new String(bytes));
//4. 删除一个节点
// cur.delete().forPath("/node3");
// 5. 删除节点但是这个节点里面有子节点 递归删除
// cur.delete().deletingChildrenIfNeeded().forPath("/node3");
// 6. 修改节点
// cur.setData().forPath("/node3","333".getBytes());
// 7. 获取某个节点的所有子节点
// List<String> strings = cur.getChildren().forPath("/node3");
// for (String string : strings) {
// System.out.println(string);
// }
// 8. 监听机制
NodeCache nodeCache = new NodeCache(cur, "/node3");
nodeCache.getListenable().addListener(()->{
System.out.println("被修改了。。。。。。。");
});
nodeCache.start();
Thread.sleep(Long.MAX_VALUE);
}
}
Zookeeper 选举机制
核心选取原则
选取机制流程
选择机制中的概念
分布式框架Dubbo
Apache Dubbo是一款高性能、轻量级的开源服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。