复习
- nginx
- /etc/nginx/nginx.conf
- /var/log/nginx/error.log access.log
- 静态资源托管
- 反向代理: 在服务端的代理:隐藏内部结构;提供高性能的http服务,提供出错提示
- proxy_pass
- 负载均衡:将请求均衡的分发给后端服务器
- upsteam xxx_cluster{}
- proxy_pass http://xxx_cluster
- 策略
- 轮询: 按顺序调用后端服务器,每个服务器被调用的频率是均等的
- 加权轮询: 按顺序调用后端服务器,每个服务器被调用的频率根据权重来分配
- 随机:随机分配
- IP Hash:对来源IP进行hash计算,根据结果分配到指定服务器,理论上一个IP固定分配到同一台服务器
- …
- docker
- docker vs vm虚拟机区别
- vm: 内部包含一个完整地操作系统,体积大,一般若干个G
- docker:
- 复用宿主机的操作系统,体积小,速度快,效率高,一般几十M
- 资源隔离:linux的namespace机制,docker容器是进程级别
- docker基本概念
- 容器:container,程序,从镜像生成的一个实例,在进程中运行
- 镜像: 文件,容器的模板,类似于Java类与Java对象中的Java类
- 仓库 registry: 存储镜像文件,便于分发
- docker-daemon
- docker-client
- docker vs vm虚拟机区别
- 命令
- 镜像
- 查看 docker image ls <=> docker images;
- docker images -q 只输出id
- docker images -q | xargs docker image rm
- 查看信息 docker inspect 查看镜像的详细信息
- 拉取 docker image pull <=> docker pull 从仓库拉取镜像
- 推送 docker image push <=> docker push 向仓库推送镜像
- 删除 docker image rm
- 查看 docker image ls <=> docker images;
- 容器
- 查看容器 docker container ls <=> docker ps -aq
- 创建容器 docker container create <=> docker create
- 启动容器 docker container start <=> docker start {容器ID或名字}
- 进入容器 docker exec -it {容器ID或名字} /bin/bash 进入容器并执行一个命令
- 运行容器 docker container run <=> docker run {镜像名字:tag} 每次新建
- 没有镜像,拉镜像 > 创建容器 > 启动容器
- 选项
-p
端口映射 {宿主机端口}:{容器端口}-i
保持住标准输出-t
分配一个虚拟TTY,终端-d
在后台运行-v
挂载数据卷。将宿主机的文件或者文件夹映射到容器中 {宿主机的文件夹}:{容器的文件夹}--name
取名字-e
环境变量,向mysql容器传递一个root用户密码
- 镜像
容器是对于环境的封装;隐藏细节;开放接口
- -v 数据卷
- -p 端口映射
- -e 环境变量 mysql容器需要配置,其他容器的一些功能开关
- ...
jdk:
docker run —name=jdk openjdk
mysql:
docker run —name=mysql5 -p 3307:3306 -d -e MYSQL_ROOT_PASSWORD=root123 mysql:5
nginx:
docker run —name=nginx -p 81:80 -d -v ~/html:/usr/share/nginx/html nginx
docker cp 拷贝 宿主机到容器
docker cp ./a.txt nginx:/tmp/
docker cp 宿主机文件位置 容器名:容器路径
容器使用注意事项
- 尽量让一个容器做一件事情,或启动一个服务。
- 尽量使用挂载的方式将数据文件挂载到容器中,容器里面尽量不要保存数据。
- 尽量让容器按照Docker化的要求来使用容器,而不是安装一个虚拟机。
- 尽量不使用交互模式来直接操作容器,而是在宿主机上执行命令,或者使用Docker File。
- 只要能解决问题,高效地解决问题,无论怎么用,都行。
DockerFile
自行构建镜像
构建一个spring-boot项目的镜像 simple:latest
docker run -d -p 8080:8080 simple 启动spring-boot,运行,成功,直接访问
显然,运行springboot需要基于jdk
docker镜像是分层的
Dockerfile是一个构建镜像的脚本文件
docker执行dockerfile后,根据指令,构建出一个镜像
dockfile 本身有自己的指令集
# Dockerfile
# 基础镜像
FROM openjdk:8-jdk-alpine
# 设置工作目录
WORKDIR /tmp
# 将jar文件拷贝到镜像中
ADD *.jar app.jar
# 运行时设置JAVA环境参数
ENV JAVA_OPTS="-Duser.timezone=Asia/Shanghai"
# 端口暴露(推荐不暴露端口,在运行容器时才对端口进行绑定)
# EXPOSE 9702
#ENTRYPOINT不支持环境变量展开,specify spring.profiles.active
ENTRYPOINT ["java", "-Duser.timezone=Asia/Shanghai -Dspring.profiles.active=docker", "-jar", "/tmp/app.jar"]
dockerfile存在target所在的目录
- 将项目打包 mvn clean package -Dmaven.test.skip=true
- 将jar包与dockerfile 上传到虚拟机的一个文件夹下
- 使用命令
docker build -t simple:latest .
构建镜像 ,注意末尾的.
- docker images查看
- docker run 运行 ,绑定端口
mvn spring-boot:build-image
docker网络
docker image xxx
container xxx
volume xxx
network xxx
docker network
- create 创建网络
- connect 将容器加入到网络
- rm 删除网络
- ls 列出网络
- inspect 查看网络的详细信息
实验:
- 启动一个名为mysql5的容器
- 将spring-boot项目封装成docker镜像,运行容器
- 将数据库地址的主机名改为 mysql5
url: jdbc:mysql://mysql5:3306/edu_56
- 封装镜像,运行,会失败
- 将数据库地址的主机名改为 mysql5
- 创建一个docker网络
- 将msyql5 和 项目加入同一个网络,项目通过网络可以访问到mysql5
# 创建网络
docker network create app-net
# 查看网络列表
docker network ls
# 将mysql5容器加入到app-net网络中
docker network connect app-net mysql5
# 查看app-net的详情
docker network inspect app-net
# 将myapp容器加入到app-net网络中
docker network connect app-net myapp
# 查看日志 -f 跟随
docker logs -f myapp
# 测试是否连接成功
curl localhost:8082/students
总结部署
前端脚手架项目部署:
- npm run build 构建,成品在dist目录下,都成为了静态资源
- 使用nginx进行静态资源托管
部署的配置问题
- 环境
- 开发环境: 本机mysql
- 测试环境
- 联调环境
- 预发布环境
- 生产环境
- spring.profiles.active 环境配置
1)开发环境,通过运行配置设置profile
2)生产环境,通过环境变量设置profile,设置成prod
修改环境变量 /etc/profile ,修改完成记住source
export SPRING_PROFILES_ACTIVE=prod
3)其他方式
java -jar -Dspring.profiles.active=dev simple-0.0.1-SNAPSHOT.jar
不同环境变量对应的配置文件 为 application-{xxx}.yaml
docker容器部署之后,网页上的ajax发请求,地址写谁的地址?
redis
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
- 存储使用内存,快
- 用作 缓存、数据库
- 数据结构
- string 字符串,对数值可以进行计算
- hash kv形式的存储,类似于Java中的Map
- list 列表
- set 集合
- sorted set 有序集合
- bitmap 位图
- hyperloglog
- geospatial 地理空间
- 副本 、lua脚本、持久化、LRU、事务
- Redis哨兵提供高可用
- Cluster提供了自动分区
centos安装
简单命令
k-v形式
k 字符串
v 是各种类型 ( string, hash ,bitmap,hyerloglogs)
Key操作
序号 | 命令及描述 |
---|---|
1 | DEL key 该命令用于在 key 存在时删除 key。 |
2 | DUMP key 序列化给定 key ,并返回被序列化的值。 |
3 | EXISTS key 检查给定 key 是否存在。 |
4 | EXPIRE key seconds 为给定 key 设置过期时间,以秒计。 |
5 | EXPIREAT key timestamp EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。 |
6 | PEXPIRE key milliseconds 设置 key 的过期时间以毫秒计。 |
7 | PEXPIREAT key milliseconds-timestamp 设置 key 过期时间的时间戳(unix timestamp) 以毫秒计 |
8 | KEYS pattern 查找所有符合给定模式( pattern)的 key 。 |
9 | MOVE key db 将当前数据库的 key 移动到给定的数据库 db 当中。 |
10 | PERSIST key 移除 key 的过期时间,key 将持久保持。 |
11 | PTTL key 以毫秒为单位返回 key 的剩余的过期时间。 |
12 | TTL key 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。 |
13 | RANDOMKEY 从当前数据库中随机返回一个 key 。 |
14 | RENAME key newkey 修改 key 的名称 |
15 | RENAMENX key newkey 仅当 newkey 不存在时,将 key 改名为 newkey 。 |
16 | TYPE key 返回 key 所储存的值的类型。 |
# 增
set k v ex 过期时间(秒) px 过期时间(毫秒)
# 删
del k
# 改
rename k newk
# 过期
expire k secs 设置过期时间(秒)
pexpire k millis 设置过期时间(毫秒)
persist k 取消过期时间
# 查
ttl / pttl 剩余过期时间
get k 查看内容
type k 查看类型
exists k 是否存在