2022 Tutorial Project for course "Object-Oriented Analysis and Design“ and "JavaEE Platform Technologies"
2022-11-03:API 1.2.0版 2022年第一版API
2022-11-09:API 1.2.1版 2022年第二版API
2022-11-21:API 1.2.2版 2022年第三版API
2022-11-27:API 1.2.3版 2022年第四版API
2022-12-10:API 1.2.4版 2022年第五版API
系统每天0:00 4:00 8:00 12:00 16:00 20:00会自动进行一次单元测试,这是最近一次测试结果和历史测试结果
系统每天00:50 4:50 8:50 12:50 16:50 20:50会自动进行一次集成测试,这是测试结果, 目录是按照测试时间产生的,在目录下存在output.log文件,可以看到测试时的完整输出
所有module都依赖于core模块,先要将core安装到maven的本地仓库,才能编译运行其他模块。方法如下:
- 首先将oomall下的pom.xml文件中除·core·以外的module注释掉,
- 在maven的中跑install phase,将core和oomall安装到maven的本地仓库
- 将oomall下的pom.xml文件中注释掉的部分修改回来
- 编译打包其他部分
- 以后修改了core的代码,只需要单独install core到maven本地仓库,无需重复上述步骤
参考 Spring JPA的命名规范
Keyword | Sample | JPQL snippet |
---|---|---|
And | findByLastnameAndFirstname | … where x.lastname = ?1 and x.firstname = ?2 |
Or | findByLastnameOrFirstname | … where x.lastname = ?1 or x.firstname = ?2 |
Is,Equals | findByFirstname, findByFirstnameIs, findByFirstnameEquals | … where x.firstname = ?1 |
Between | findByStartDateBetween | … where x.startDate between ?1 and ?2 |
LessThan | findByAgeLessThan | … where x.age < ?1 |
LessThanEqual | findByAgeLessThanEqual | … where x.age <= ?1 |
GreaterThan | findByAgeGreaterThan | … where x.age > ?1 |
GreaterThanEqual | findByAgeGreaterThanEqual | … where x.age >= ?1 |
After | findByStartDateAfter | … where x.startDate > ?1 |
Before | findByStartDateBefore | … where x.startDate < ?1 |
IsNull | findByAgeIsNull | … where x.age is null |
IsNotNull,NotNull | findByAge(Is)NotNull | … where x.age not null |
Like | findByFirstnameLike | … where x.firstname like ?1 |
NotLike | findByFirstnameNotLike | … where x.firstname not like ?1 |
StartingWith | findByFirstnameStartingWith | … where x.firstname like ?1(parameter bound with appended %) |
EndingWith | findByFirstnameEndingWith | … where x.firstname like ?1(parameter bound with prepended %) |
Containing | findByFirstnameContaining | … where x.firstname like ?1(parameter bound wrapped in %) |
OrderBy | findByAgeOrderByLastnameDesc | … where x.age = ?1 order by x.lastname desc |
Not | findByLastnameNot | … where x.lastname <> ?1 |
In | findByAgeIn(Collection<Age> ages) | … where x.age in ?1 |
NotIn | findByAgeNotIn(Collection<Age> ages) | … where x.age not in ?1 |
True | findByActiveTrue() | … where x.active = true |
False | findByActiveFalse() | … where x.active = false |
IgnoreCase | findByFirstnameIgnoreCase | … where UPPER(x.firstame) = UPPER(?1) |
如果没有安装docker需要先安装docker,安装方法参考以下网页 https://docs.docker.com/engine/install/ubuntu/
如果在docker swarm上部署,需要先安装docker swarm,参考以下网页 https://docs.docker.com/engine/swarm/swarm-tutorial/create-swarm/
docker pull mysql
为目标服务器定义label,方便docker swarm在创建Service时,将Service部署在目标服务器上,以下我们在node6上定义了一个label server=mysql
docker node update --label-add server=mysql node6
MySQL的配置文件目录conf.d和数据库初始化脚本都在oomall-2022的mysql目录下,需要把这些文件拷贝到运行mysql的节点上,并映射到容器中
用以下命令创建mysql
docker service create --name mysql --constraint node.labels.server==mysql --mount type=bind,source=/root/oomall-2022/mysql/sql,destination=/sql,readonly --mount type=bind,source=/root/oomall-2022/mysql/conf.d,destination=/etc/mysql/conf.d,readonly --network my-net -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest<br> 其中
-e MYSQL_ROOT_PASSWORD=123456`是设定数据库root账户密码
看一下mysql的服务运行在哪台服务器
docker service ps mysql
切换到运行mysql服务的机器,看一下mysql容器在这台机器的container id,将容器的CONTAINER ID拷贝替换下述命令中[CONTAINER ID],用这个容器运行mysql的命令
docker exec -it [CONTAINER ID] mysql -uroot -p
用root账号登录mysql服务器,在运行起来的mysql命令行中用source /sql/database.sql
建立oomall各模块数据库
以goods模块为例,用use goods
切换数据库
用source /sql/goods.sql
插入初始数据
其他模块数据库的安装类似
docker pull redis/redis-stack-server:latest
在管理机上,更新目标服务器的label
为目标服务器定义label,方便docker swarm在创建Service时,将Service部署在目标服务器上,以下我们在node5上定义了一个label server=redis
docker node update --label-add server=redis node5
将机器上的Redis配置目录映射到docker容器中,并把redis的服务加入到my-net网络
docker service create --name redis --constraint node.labels.server==redis --mount type=bind,source=/root/oomall-2022/conf/redis,destination=/etc/redis,readonly --network my-net -e CONFFILE=/etc/redis/redis.conf -d redis/redis-stack-server:latest
其中-e CONFFILE=/etc/redis/redis.conf
是指定redis的配置文件,在配置文件中我们设定了redis的连接密码为123456, redis的配置文件目录redis映射到容器中
看一下redis的服务运行在哪台服务器
docker service ps redis
切换到运行redis服务的机器,看一下redis容器在这台机器的container id,将容器的CONTAINER ID拷贝替换下述命令中[CONTAINER ID],用这个容器运行redis的命令行工具redis-cli
docker exec -it [CONTAINER ID] redis-cli
进入redis-cli后,先运行下面的命令输入密码
auth 123456
再测试Bloom过滤器是否正常
BF.ADD testFilter hello
BF.EXISTS testFilter hello
如果均返回(integer) 1则可以正常使用redis了
docker pull mongo:latest
更新目标服务器的label, 为目标服务器定义label,方便docker swarm在创建Service时,将Service部署在目标服务器上,以下我们在node4上定义了一个label server=mongo
docker node update --label-add server=mongo node4
将机器上的Redis配置目录映射到docker容器中,并把mongo的服务加入到my-net网络
docker service create --name mongo --constraint node.labels.server==mongo --network my-net --mount type=bind,source=/root/oomall-2022/conf/mongo,destination=/mongo -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=123456 -d mongo:latest mongod --auth
其中 -e MONGO_INITDB_ROOT_USERNAME=root
是默认的用户名 -e MONGO_INITDB_ROOT_PASSWORD=123456
是连接密码为123456
在运行mongo服务的节点上查看mongo的服务是否正常运行
看一下mongo的服务运行在哪台服务器
docker service ps mongo
切换到运行mongo服务的机器,看一下mongo容器在这台机器的container id,将容器的CONTAINER ID拷贝替换下述命令中[CONTAINER ID],用这个容器运行mongo的命令行工具mongosh
docker exec -it [CONTAINER ID] mongosh -u root -p 123456
进入mongosh后,先运行下面的命令切换database
use oomall
再在oomall建立demouser用户,给用户赋予读写和数据库管理员的角色
db.createUser({user:"demouser",pwd:"123456",roles:[{role:"readWrite",db:"oomall"},{role:"dbAdmin",db:"oomall"}]})
如果均返回{ok:1}则可以用demouser用户正常使用mongo的oomall数据库了
docker exec -it [CONTAINER ID] mongosh -u demouser -p 123456 --authenticationDatabase oomall
docker exec -it [CONTAINER ID] mongorestore -u demouser -p 123456 --authenticationDatabase oomall -d oomall --dir /mongo/oomall --drop
此命令会先删除所有数据再用户mongo/oomall下的数据恢复数据库
在管理机上执行以下命令
docker node update --label-add server=rocketmq-namesrv node2
docker node update --label-add server=rocketmq-broker node3
在node2上pull docker镜像
docker pull apache/rocketmq
docker pull apacherocketmq/rocketmq-dashboard:latest
在node3上pull docker镜像
docker pull apache/rocketmq
将oomall/conf/rocketmq/broker.conf文件拷贝到/root/rocketmq目录下
docker service create --name rocketmq-namesrv --constraint node.labels.server==rocketmq-namesrv --network my-net -d apache/rocketmq ./mqnamesrv
docker service create --name rocketmq-broker --constraint node.labels.server==rocketmq-broker --mount type=bind,source=/root/rocketmq,destination=/rocketmq --network my-net -d apache/rocketmq ./mqbroker -n rocketmq-namesrv:9876 -c /rocketmq/broker.conf
docker service create --name rocketmq-dashboard --constraint node.labels.server==rocketmq-namesrv --network my-net -d -e "JAVA_OPTS=-Drocketmq.namesrv.addr=rocketmq-namesrv:9876" -p 8100:8080 -t apacherocketmq/rocketmq-dashboard:latest
然后访问集群的任何的8100端口就可以看到服务器了
选择一个节点安装打包oomall-2022,例如node2
git clone http://git.xmu.edu.cn/mingqiu/oomall-2022.git
修改oomall-2022下的pom文件,将除core以外的模块删除
在oomall-2022目录用以下命令安装core和oomall的pom
mvn clean install
如果第二次打包不用重复上述过程,直接在core目录下运行
mvn clean install
在oomall-2022目录下运行
git checkout pom.xml
将pom.xml恢复原样,
在goods目录下运行
mvn clean pre-integration-test -Dmaven.test.skip=true
在node2的/root/上建立logs目录
在管理机上创建服务
docker node update --label-add server=goods node2
docker service create --name goods --network my-net --constraint node.labels.server==goods --publish published=8080,target=8080 --mount type=bind,source=/root/logs,destination=/app/logs -d xmu-oomall/goods:0.0.1-SNAPSHOT
在管理机上执行
docker node update --label-add server=nacos node2
在node2上pull docker镜像
docker pull nacos/nacos-server:v2.1.2
docker service create --name nacos --constraint node.labels.server==nacos --network my-net --publish published=8848,target=8848 -e MODE=standalone -e PREFER_HOST_MODE=hostname -d nacos/nacos-server:v2.1.2
其中MODE表示用standalone模式启动, PREFER_HOST_MODE表示支持hostname方式,因为用的是swarn,需要用服务名查询
设置集中配置的application.yaml
在浏览器中访问http://[IP]:8848/nacos, IP为集群中任意一台服务器ip
输入默认用户名/密码: nacos/nacos
即可进入nacos的控制台
在ConfigurationManagement->Configurations中增加一项配置Create Configuration
Data Id的格式为 ${spring.application.name}.yaml, 如商品模块为goods-service.yaml,商铺模块为shop-service.yaml,支付模块为payment-service.yaml
Group:为默认的DEFAULT_GROUP
Format:选Yaml
Configuration Content:将对应模块的application.yaml内容拷贝进来,注意不能有中文注释
按publish即可
MySQL的配置文件目录conf.d和数据库初始化脚本都在oomall-2022的mysql目录下,需要把这些文件拷贝到运行mysql的节点上,并映射到容器中
用以下命令创建mysql
docker run --name mysql -v /root/oomall-2022/mysql/sql:/sql:ro -v /root/oomall-2022/mysql/conf.d:/etc/mysql/conf.d:ro -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest <br>其中
-e MYSQL_ROOT_PASSWORD=123456`是设定数据库root账户密码, 3306端口绑定到主机端口
docker exec -it mysql mysql -uroot -p
用root账号登录mysql服务器,在运行起来的mysql命令行中用source /sql/database.sql
建立oomall各模块数据库
以goods模块为例,用use goods
切换数据库
用source /sql/goods.sql
插入初始数据
其他模块数据库的安装类似
将机器上的Redis配置目录映射到docker容器中
docker run --name redis -v /root/oomall-2022/conf/redis:/etc/redis:ro -p 6379:6379 -e CONFFILE=/etc/redis/redis.conf -d redis/redis-stack-server:latest
其中-e CONFFILE=/etc/redis/redis.conf
是指定redis的配置文件,在配置文件中我们设定了redis的连接密码为123456, redis的配置文件目录redis映射到容器中
docker exec -it redis redis-cli
进入redis-cli后,先运行下面的命令输入密码
auth 123456
再测试Bloom过滤器是否正常
BF.ADD testFilter hello
BF.EXISTS testFilter hello
如果均返回(integer) 1则可以正常使用redis了
将机器上的Redis配置目录映射到docker容器中
docker run --name mongo -v /root/oomall-2022/conf/mongo:/mongo -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=123456 -d mongo:latest mongod --auth
其中 -e MONGO_INITDB_ROOT_USERNAME=root
是默认的用户名 -e MONGO_INITDB_ROOT_PASSWORD=123456
是连接密码为123456
docker exec -it mongo mongosh -u root -p 123456
进入mongosh后,先运行下面的命令切换database
use oomall
再在oomall建立demouser用户,给用户赋予读写和数据库管理员的角色
db.createUser({user:"demouser",pwd:"123456",roles:[{role:"readWrite",db:"oomall"},{role:"dbAdmin",db:"oomall"}]})
如果均返回{ok:1}则可以用demouser用户正常使用mongo的oomall数据库了
docker exec -it mongo mongosh -u demouser -p 123456 --authenticationDatabase oomall
docker exec -it mongo mongorestore -u demouser -p 123456 --authenticationDatabase oomall -d oomall --dir /mongo/oomall --drop
此命令会先删除所有数据再用户mongo/oomall下的数据恢复数据库
docker run -d --name rocketmq-namesrv -d -p 9876:9876 apache/rocketmq ./mqnamesrv
修改原有的broker.conf文件,将其中的brokerIP1=rockermq-broker改为运行broker容器的IP。
docker run -d --name rocketmq-broker -d -p 10911:10911 -p 10909:10909 -v /home/mingqiu/oomall-2022/conf/rocketmq:/rocketmq apache/rocketmq ./mqbroker -n [IP]:9876 -c /rocketmq/broker.conf
其中IP为rocketmq nameserver的ip
docker run -d --name rocketmq-dashboard -d -e "JAVA_OPTS=-Drocketmq.namesrv.addr=[IP]:9876" -p 8100:8080 -t apacherocketmq/rocketmq-dashboard:latest
其中IP为rocketmq nameserver的ip,然后访问该机器的8100端口就可以看到Rocketmq的dashboard了
安装打包oomall-2022,例如node2
git clone http://git.xmu.edu.cn/mingqiu/oomall-2022.git
修改oomall-2022下的pom文件,将除core以外的模块删除
在oomall-2022目录用以下命令安装core和oomall的pom
mvn clean install
如果第二次打包不用重复上述过程,直接在core目录下运行
mvn clean install
在oomall-2022目录下运行
git checkout pom.xml
将pom.xml恢复原样,
在goods目录下运行
mvn clean pre-integration-test -Dmaven.test.skip=true
在node2的/root/上建立logs目录
创建容器
docker run --name goods -p 8080:8080 -v /root/logs:/app/logs -d xmu-oomall/goods:0.0.1-SNAPSHOT
其中8080为模块的端口,注意每个模块的application.yaml中端口设置
docker run --name nacos -p 8848:8848 -e MODE=standalone -e PREFER_HOST_MODE=hostname -d nacos/nacos-server:v2.1.2
其中MODE表示用standalone模式启动, PREFER_HOST_MODE表示支持hostname方式,因为用的是swarn,需要用服务名查询
设置集中配置的application.yaml
在浏览器中访问http://[IP]:8848/nacos, IP为服务器ip
输入默认用户名/密码: nacos/nacos
即可进入nacos的控制台
在ConfigurationManagement->Configurations中增加一项配置Create Configuration
Data Id的格式为 ${spring.application.name}.yaml, 如商品模块为goods-service.yaml,商铺模块为shop-service.yaml,支付模块为payment-service.yaml
Group:为默认的DEFAULT_GROUP
Format:选Yaml
Configuration Content:将对应模块的application.yaml内容拷贝进来,注意不能有中文注释
按publish即可