场站端和平台端的商品详情存在重复 应该是场站使用平台管理,平台端管理所有订单信息 选用合适的设计模式,设计订单结算的服务接口,实现多态性
乘客与车主仅通过设备关联,(购物车功能) 车主端与场站存在直接资金往来(补货购物车功能)
数据库分库分表,建立隔离事务,redis部署集群
以场站的销售额为准 广告统计:需要哪些信息,限制条数 热卖排行:场站供应的货品销量(销售额)榜 司机定位信息:哪些司机需要定位?与场站之间存在订单未取货关系的司机
进入界面分页展示所有订单信息,每页 ? 行(点击这个页面后就已经获取到了所有需要的信息了)30行 其余选项(激活,在线)前端可以自行过滤筛选
调用GPS API 或许用户实时信息 用户购物时存储用户购物时的车主位置信息 司机挑选补货场站时获取场站的地理位置信息(绝对地址和相对地址)
结算系统调用支付宝API 订单信息传递 乘客购买商品,司机端设备接收到购物信息,收集资金数据,更新车主端的资金数据 车主在选货列表中挑选场站以及它们拥有的商品,添加进购物车
- 在购物车中选择特定商品,选定后付款信息打包成订单信息,开启线程发送到服务端,接收到返回信息,表示远端信息处理完毕,之后再更新本地数据(更新pgsql里的订单信息,设备商品信息,还要更新车主端的销量信息)
- 服务器端处理过程:车主端向场站发送补货请求,场站端接收到订单信息(状态为1),司机资金流动到场站,场站平台拆分司机订单中的货品信息,向redis数据库发送信号,依次更新 统计数据 结算接口的幂等性(如果因为服务延迟导致用户在一次服务响应之前发送了多次请求,最后结果应该与用户只发送一次请求保持一致) 分布式数据锁的设计:redission+redlock or set nx ex+lua
建立redis数据库 应用数据结构 bitmap,list(每天的营销额),zset,hash,GEORadius 建立特殊时间戳函数:获取每周,月,年的第一天的信息
- 所有数据库都要有垃圾清理机制 Sort 机制:建立排行榜 ZRankByLex:
(创建守护进程,时刻维护着每个场站/车主的营销日、周、月、年、总营销额,做垃圾清理) 七日连续营销额,当日营销额以及前6天的营销额做累加即可做即可 Key: Product_ID:date val:营业额
key: factory_id/factory_name/场站地址(xx路xx号) val: 经度、纬度 利用Georadius获取在以车主为中心一定范围内的场站到车主的距离
Key: owner_id:type(daily,weekly,monthly,yearly):date(2006-01-02:15:04:05): Val:object_id Score:销量 分布式策略,管道通信,广播机制
在服务器上存放视频资源,图片资源,利用ftp技术传输资源,利用minio搭建本地资源服务器
从windows移动到linux(感觉没有问题,问题主要在于数据库迁移)
shell脚本,dockerfile ,docker-compose
升级单体架构成为微服务架构 RPC,go-zero,consul/etcd
要让所有容器能够相互连通,先创建一个公用的网络
具体细节细看help手册
docker network --help
创建一个名为bfnet的网络
docker network create bfnet
docker run --hostname=53bb9473f77a --env=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin --env=GOSU_VERSION=1.16 --env=REDIS_VERSION=7.0.11 --env=REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-7.0.11.tar.gz --env=REDIS_DOWNLOAD_SHA=ce250d1fba042c613de38a15d40889b78f7cb6d5461a27e35017ba39b07221e3 --volume=D:\desktop\pr\buyfree\dal/redis/redis.conf:/etc/redis/redis.conf --volume=/data --network=bfnet --workdir=/data -p 6379:6379 --restart=no --runtime=runc -d redis
docker 部署单机redis (48条消息) 应用部署到docker容器连接不上redis容器_LinktoDream的博客-CSDN博客 从官网下载redis.conf 文件 注释其中的bind 127.0.0.1,将其中的保护模式设置为no 下面的network-alias比较关键,容器变更ip地址是不固定的,每次都从 /etc/hosts 文件读取IP信息不现实,所以用一个固定的别名代替IP地址是最好的选择
docker pull redis:latest
docker run -p 6379:6379 --name bfredis --network bfnet --network-alias redis -v D:\desktop\pr\buyfree\dal/redis/redis.conf:/etc/redis/redis.conf -d redis redis-server /etc/redis/redis.conf --appendonly yes
### 创建一号节点
docker create -p 7001:6379 --name node1 --network bfnet --network-alias redis-node1 -v E:\dockerdbvolume\redis\data\node1:/data redis --cluster-enabled yes --cluster-config-file nodes-node-1.conf
### 创建二号节点
docker create -p 7002:6379 --name node2 --network bfnet --network-alias redis-node2 -v E:\dockerdbvolume\redis\data\node2:/data redis --cluster-enabled yes --cluster-config-file nodes-node-2.conf
### 创建三号节点
docker create -p 7003:6379 --name node3 --network bfnet --network-alias redis-node3 -v E:\dockerdbvolume\redis\data\node3:/data redis --cluster-enabled yes --cluster-config-file nodes-node-3.conf
# 执行命令查看每个节点的网络信息
docker inspect node1
docker inspect node2
docker inspect node3
#创建集群
#1 进入容器
docker exec -it node1 /bin/bash
redis-cli --cluster create 172.20.0.4:6379 172.20.0.5:6379 172.20.0.6:6379 --cluster-replicas 0
构建docker镜像
docker create -p 6380:6380 --name node1 --net host -v E:\dockerdbvolume\redis\data\node1:/data redis --cluster-enabled yes --cluster-config-file nodes-node-1.conf --port 6380
docker create -p 6381:6381 --name node2 --net host -v E:\dockerdbvolume\redis\data\node2:/data redis --cluster-enabled yes --cluster-config-file nodes-node-2.conf --port 6381
docker create -p 6382:6382 --name node3 --net host -v E:\dockerdbvolume\redis\data\node3:/data redis --cluster-enabled yes --cluster-config-file nodes-node-3.conf --port 6382
创建集群
docker exec -it node1 /bin/bash
redis-cli --cluster create 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 --cluster-replicas 0
- Postgres 部署策略 宝塔云连接不上postgresql 原因:自动安装的pgsql不会创建root用户,需要自己手动创建(只能使用root用户了) 同时需要给数据库所有权限
su - postgres
psql
create user root with 'nyarlak';
create database root owner root;
\password root //修改密码
grant all privileges on database root to root;
dsn = "host=localhost port=5432 user=root dbname=root password=nyarlak sslmode=disable TimeZone=Asia/Shanghai"
- 升级云服务的部署策略
#init.sql
su - postgres
psql
create user 'bf' with 'bf123';
create database 'bfdb' owner to 'bf';
grant all privileges on database bfdb to bf;
dsn= "host=postgres port =5432 user=bf dbname=bfdb password=bf123 sslmode=disable TimeZone=Asia/Shanghai"
3.1. dockerfile部署 部署方法 (启用dockerfile)
FROM postgres:alpine
COPY init.sql /docker-entrypoint-init.d
ENV POSTGRES_USER bf
ENV POSTGRES_PASSWORD bf123
ENV POSTGRES_DB bfdb
docker build -t bfpsql .
docker run -p 5432:5432 --name bfpsql --network bfnet --network-alias postgres -v E:\dockerdbvolume\pgdata:/var/lib/postgresql/data bfpsql
部署成功进入容器
adduser bf
psql -d bfdb
#更改时区
%%set timezone='+8'//手动对准%%
set timezone='Asia/Shanghai';
打包上传dockerhub,编写docker-compose
docker tag bfpsql:1.0 $DOCKER_USER_NAME:bfpostgres
docker push $DOCKER_USER_NAME:bfpostgres
mkdir ~/postgres && cd ~/postgres
touch docker-compose.yml
3.1.2 docker-compose
version: '3'
services:
postgres:
images:版本号,待填
healthcheck:
test:[]
timeout:
interval:
retries:
container_name: bfpostgres
restart:always
enviromnent:
- POSTGRES_USER=root
- POSTGRES_PASSWORD=nyarlak
- APP_DB_USER=bf
- APP_DB_PASS=bf123
- APP_DB_NAME=bfdb
volumes:
- ./db:/docker-entrypoint-initdb.d/
ports:
- 5432:5432
![[Pasted image 20230411202051.png]]
创建数据库创建脚本
mkdir db
touch db/01-init.sh
脚本文件
#!/bin/bash
set -e
export PGPASSWORD=$POSTGRES_PASSWORD;
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
CREATE USER $APP_DB_USER WITH PASSWORD '$APP_DB_PASS';
CREATE DATABASE $APP_DB_NAME;
GRANT ALL PRIVILEGES ON DATABASE $APP_DB_NAME TO $APP_DB_USER;
\connect $APP_DB_NAME $APP_DB_USER
BEGIN;
将要生成表的sql文件 carshop.sql
COMMIT;
EOSQL
docker 部署 go 的编译环境
FROM golang:1.20
WORKDIR usr/src/app
ENV GOOS=linux
ENV CGO_ENABLED=0
ENV GO_PROXY=https://proxy.golang.com.cn,direct
ENV GO111MODULE=auto
COPY go.mod go.sum ./
RUN go mod download && go mod verify
COPY . .
RUN go build -o /bf
CMD ["/bf"]
构建镜像: docker build -t bfree .
开启容器:docker run -itd --name bf --network bfnet -p 6060:6060 -p 9003:9003 -p 9004:9004 -p 9005:9005 bfree `
二进制文件部署方式 一定要在官网下载最新版本:https://dl.min.io/server/minio/release/linux-amd64/minio
%%windows 环境
start E:\Minio\minio.exe server E:\Minio\SaveFiles
一种后台运行方式 ![[Pasted image 20230411164636.png]]
docker 部署方案:
//先登录minio界面获取对应可以access_key 以及 secret_key
export MINIO_ACCESS_KEY=XXXXXX
export MINIO_SECRET_KEY=XXXXXX
//创建本地文件夹
mkdir -p ~/minio/data
防火墙开启端口号
firewall-cmd --zone=public --add-port=9000/tcp --permanent
firewall-cmd --zone=public --add-port=9090/tcp --permanent
firewall-cmd --reload
success
# linux
docker run -p 9000:9000 -p 9090:9090 --name minio -v ~/minio/data:/data -e "MINIO_ROOT_USER=minioadmin" -e "MINIO_ROOT_PASSWORD=minioadmin" quay.io/minio/minio server /data --console-address ":9090"
命令详解:
1. docker run 运行容器
2. -p指示绑定9000到容器的9000端口,绑定9090到容器的9090端口
3. -name指示创建的容器名为 minio
4. -v 设置本地文件路径作为容器的挂载路径,当MinIO向/data路径写入数据时,会同步到本地的/minio/data
5. -e 设置环境变量 [`MINIO_ROOT_USER`](https://min.io/docs/minio/linux/reference/minio-server/minio-server.html#envvar.MINIO_ROOT_USER "(in MinIO Documentation for Linux)") 和 [`MINIO_ROOT_PASSWORD`](https://min.io/docs/minio/linux/reference/minio-server/minio-server.html#envvar.MINIO_ROOT_PASSWORD "(in MinIO Documentation for Linux)") 默认为"minioadmin"
6. server 服务端启动
7. --console-address ":9090"控制台端口
8. -address: 9000 minio服务api端口
9. 忘记密码直接查看MINIO_ROOT_USER && MINIO_ROOT_PASSWORD