Software-Architecture docker踩坑小结+AW04记录

gcr.io 镜像因为网络原因拉取失败

尝试换源失败,总是提示验证失败,于是打算直接用代理从原网站下载

虚拟机使用宿主机的梯子环境

vitualbox上没有装梯子,尝试使用宿主机的梯子环境。vitualbox上的网络连接方式是 网络地址转换(NAT)

在终端用

1
ip route show

查看虚拟机所占用的ip地址,选择default的记录下来。

在虚拟机设置中找到Network-NeworkProxy 选择manual

所有proxy的ip都填写刚刚记录的ip,端口就查看电脑本机梯子上的端口填入(我的梯子软件界面自带了该信息,如果没有可以通过查看梯子软件进程占用的端口来确定)

在浏览器中访问google/youtube,成功即可

mvn中的jib dockerBuild使用代理

首先参照此篇文章给dockerd设置的全局的代理。

随后,参考github上的此issue和另一篇文章,执行mvn命令时需要添加参数,格式如下:

1
mvn compile -Dhttps.proxyHost=10.0.2.2 -Dhttps.proxyPort=33210 compile jib:dockerBuild

其中10.0.2.233210换成和虚拟机网络代理设置中的ip地址和端口,注意ip地址前不需要加协议名(在这里被坑了,因为不是很了解代理参数的含义)

就可以成功得到所需要的镜像了!

gatling使用

1
bin/gatling.sh

参考gatling官方文档编写更复杂的脚本,比如模仿添加购物车操作,简单来说是在get函数中的url带上参数

docker的使用

1
2
3
4
5
6
7
8
docker ps //查看当前在运行的容器
docker ps -a //查看所有
docker run -d --name app-pi-0.5 --cpus=0.5 -p 18080:8080 app-pi //限制cpu占用时间,映射端口,命名,选择镜像
docker stop {container-hash}
docker rm {container-hash} //删除容器
docker rmi {image-hash} //删除镜像
docker run --name redis -p 6379:6379 -e ALLOW_EMPTY_PASSWORD=yes bitnami/redis:latest//镜像启动redis服务 第一次会自动下载
docker logs {container-hash} //查看log

vscode中的run方法不会补全pom文件中的组件,第一次运行用:

1
mvn clean spring-boot:run

Docker相关概念

image 映像文件: 包括光盘的所有信息的文件 可以被运行

root文件系统: 内核启动后加载的第一个文件系统,包括内核代码的影响文件和初始化脚本

docker image相当于一个root文件系统,配置了容器运行时需要的程序、库、资源、配置参数,但是都是静态的,image不包括任何动态数据。

image和container 就像class 和 instance的关系,可以认为是一种特定轻量级的环境。

Redis相关

Redis info:

键值对 非关系型数据库;

可以内存,可以分布式

Redis slot:可以认为是逻辑上构建范围区间,每个节点对应一定的范围,计算出的哈希值落到一个slot中,则值存到对应的节点中去。在节点添加和减少的时候,

cluster 配置不同的地方在于:
1
2
spring.redis.cluster.nodes[0]=ip:port
...[1]=ip:port
another redis manager:

可以用来查看redis中数据存储的情况

尝试连接数据库查看session遇到的问题,此时使用的是JDBC
1
org.springframework.beans.factory.beancreationexception: error creating bean with name 'org.springframework.boot.autoconfigure.session.sessionautoconfiguration$servletsessionrepositoryvalidator'

解决方案:在pom.xml中添加依赖:

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
基于redis的session配置

bean factory 初始化失败 :把starter-data-jpa 改成 starter-data-redis 前者是用于session-jdbc的依赖

1
2
3
4
5
6
7
8
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

连不上 给redis镜像添加配置文件 修改映射端口(见群聊讨论)??重启 先开redis镜像 再开webpos镜像 又好了

直接配置redis,不使用docker

redis容器问题太多了 改用直接配置

下载压缩包 make后make install 确认redis-server,redis-cli可用

分节点配置脚本可以参考官方网站

自动化读取各个文件夹中的脚本来构建

1
2
3
4
5
for d in ./*/ ; do (cd "$d" && redis-server ./redis.conf &); done

redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
--cluster-replicas 1 &

构建之后需要检查

1
2
3
4
5
redis-cli --cluster check 127.0.0.1:7000 //example
redis-cli --cluster fix 127.0.0.1:7000 //if something wrong
redis-cli -h localhost -p 7000
keys*
flushdb //清空当前
镜像中连不上集群?

参考 由于在镜像中运行程序,应使用ifconfig查看docker对应的ip,替换127.0.0.1 并且在每个节点的redis.conf中插入

1
protected-mode no

设置后可以在宿主机命令行用redis-cli检查各个节点状态或者查看内容

host 网络?

待补充

可序列化对象才能写入redis数据库

出现问题:

1
2
3
4
 Cannot serialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to serialize object using DefaultSerializer ; nested exception is java.io.NotSerializableException: com.example.webpos.model.Product] with root cause

java.io.NotSerializableException: com.example.webpos.model.Product

查询后发现是被写入的对象(包括cart,item,product)应该implements Serializable接口,成为可序列化对象才能写入redis数据库

cache和session

cache:product时使用——实际的业务层是在JD 不是原先的serviceImp——用的是另一个数据库

@CacheEvict 清除缓存

session: 传递cart信息 getAttribute-getCart/setAttribute-changeCart 在controller中添加 与网页运行有关

HAProxy

编写好haproxy.cfg

1
2
3
4
5
6
7
8
9
10
11
defaults
mode tcp
frontend lb-app-pi
bind *:8080 #统一对外接口
default_backend servers
backend servers
balance roundrobin #轮换方式
server server1 localhost:8081 # 单独一个服务器的端口 在本次实验中是镜像映射到本机的端口
server server2 localhost:8082
server server3 localhost:8083
server server4 localhost:8084

用以下命令运行对应目录下的该文件

1
haproxy -f haproxy.cfg
1
netstat -nlp //是查看所有的端口占用情况