B2C模式
B2B2C模式
④. C2B模式:消费者对企业。先由消费者需求产生后由企业生产,即先由消费者提出需求,后有生产企业按需求组织生辰
⑤. C2C模式:客户之间自己把东西放上网去卖,如:淘宝、咸鱼(你在地摊买东西)
⑥. O2O模式
①. 微服务:
拒绝大型单体应用,基于业务对微服务进行拆分,各个服务独立部署运行
(微服务与分布式的细微差别是,微服务的应用不一定是分散在多个服务器上,它也可以是同一个服务器)
②. 集群、分布式、节点
注意
:集群(多个人在一起作同样的事情) 分布式(多个人在一起作不同的事)举例:
小饭店原来只有一个厨师,切菜洗菜备料炒菜全干。
后来客人多了,厨房一个厨师忙不过来,又请了个厨师,两个厨师都能炒一样的菜,两个厨师的关系是集群。
为了让厨师专心炒菜,把菜做到极致,再请了个配菜师负责切菜,备菜,备料 … 厨师和配菜师的关系是分布式。
一个配菜师也忙不过来了,又请了个配菜师,两个配菜师关系是集群。
一个配菜师因故请假了,但是其余的配菜师还是该啥就干啥,只是没请假的配菜师任务均匀的加量了,但他们的任务和职责是不变的,这是集群
服务注册、发现、注册中心
服务熔断&服务降级
服务熔断(解决方案[一]):
设置服务的超时,当被调用的服务经常失败到达某个阈值,我们可以开启断路保护机制,后来的请求不再去调用这个服务。本地直接返回默认的数据服务降级(解决方案[二]):
让线程不因为阻塞而等待,及时返回调用失败的结果,并给出友好提示写在最前面
这部分内容很重要,可以根据自己的情况做完项目在看这部分内容
①. 前后分离开发,分为内网部署和外网部署,外网是面向公众访问的,部署前端项目,可以有手机APP,电脑网页;内网部署的是后端集群,前端在页面上操作发送请求到后端,在这途中会经过Nginx集群,Nginx把请求转交给API网关(springcloud gateway)(网关可以根据当前请求动态地路由到指定的服务,看当前请求是想调用商品服务还是购物车服务还是检索),从路由过来如果请求很多,可以负载均衡地调用商品服务器中一台(商品服务复制了多份),当商品服务器出现问题也可以在网关层面对服务进行熔断或降级(使用阿里的sentinel组件),网关还有其他的功能如认证授权、限流(只放行部分到服务器)等
②. 到达服务器后进行处理(springboot为微服务),服务与服务可能会相互调用(使用feign组件),有些请求可能经过登录才能进行(基于OAuth2.0的认证中心。安全和权限使用springSecurity控制)
③. 服务可能保存了一些数据或者需要使用缓存,我们使用redis集群(分片+哨兵集群)。持久化使用mysql,读写分离和分库分表。
④. 服务和服务之间会使用消息队列(RabbitMQ),来完成异步解耦,分布式事务的一致性。有些服务可能需要全文检索,检索商品信息,使用ElaticSearch。
⑤. 服务可能需要存取数据,使用阿里云的对象存储服务OSS。
⑥. 项目上线后为了快速定位问题,使用ELK对日志进行处理,使用LogStash收集业务里的各种日志,把日志存储到ES中,用Kibana可视化页面从ES中检索出相关信息,帮助我们快速定位问题所在。
⑦. 在分布式系统中,由于我们每个服务都可能部署在很多台机器,服务和服务可能相互调用,就得知道彼此都在哪里,所以需要将所有服务都注册到注册中心。服务从注册中心发现其他服务所在位置(使用阿里Nacos作为注册中心)
⑧. 每个服务的配置众多,为了实现改一处配置相同配置就同步更改,就需要配置中心,也使用阿里的Nacos,服务从配置中心中动态取配置。
⑨. 服务追踪,追踪服务调用链哪里出现问题,使用springcloud提供的Sleuth、Zipkin、Metrics,把每个服务的信息交给开源的Prometheus进行聚合分析,再由Grafana进行可视化展示,提供Prometheus提供的AlterManager实时得到服务的告警信息,以短信/邮件的方式告知服务开发人员。
⑩. 还提供了持续集成和持续部署。项目发布起来后,因为微服务众多,每一个都打包部署到服务器太麻烦,有了持续集成后开发人员可以将修改后的代码提交到github,运维人员可以通过自动化工具Jenkins Pipeline将github中获取的代码打包成docker镜像,最终是由k8s集成docker服务,将服务以docker容器的方式运行
①. 前后分离开发。前端项目分为admin-vue(工作人员使用的后台管理系统)、shop-vue(面向公众访问的web网站)、app(公众)、小程序(公众)
②. 各个服务详细说明
商品服务:商品的增删改查、商品的上下架、商品详情
支付服务
优惠服务
用户服务:用户的个人中心、收货地址
仓储服务:商品的库存
秒杀服务:
订单服务:订单增删改查
检索服务:商品的检索ES
中央认证服务:登录、注册、单点登录、社交登录
购物车服务:
后台管理系统:添加优惠信息等
百度云下载链接:
(1).VirtualBox
链接:https://pan.baidu.com/s/1IMDU9s_uIA99msB7cjjTmw
提取码:1234
(2). Vagrant
链接:https://pan.baidu.com/s/1MuxoSD53YW30pnj-egY71Q
提取码:1234
(3). linux上安装Docker+Mysql+Redis+Vagrant : https://blog.csdn.net/TZ845195485/article/details/109959156
①. 下载、安装virtualBox:https://www.virtualbox.org/ ,要开启cpu虚拟化(6.0.12)
③. 百度云地址:
链接:https://pan.baidu.com/s/1MuxoSD53YW30pnj-egY71Q
提取码:1234
②. 打开window cmd窗口,运行vagrant init centos/7,即可初始化一个centos7系统,运行 vagrant up即可启动虚拟机。系统root用户的密码是vagrant(会出现很慢下载的清空)
(下好了vargant,如果安装centos7很慢,可以用下面的连接替换老师初始化的那一步:vagrant init centos7 https://mirrors.ustc.edu.cn/centos-cloud/centos/7/vagrant/x86_64/images/CentOS-7.box
。然后在执行vagrant up ,就很快了,这个是国内的镜像地址。vagrant up,中间执行出现异常的话,多试几次)
③. 关于vagrant命令
(注意:下次使用也可以直接vagrant up直接启动,但要确保当前目录在C:/用户/ 文件夹下,他下面有一个Vagrantfile,不过我们也可以配置环境变量)
(1). 下载cenots7: vagrant init centos/7
(2). 启动虚拟机:vagrant up
(3). 连接虚拟机:vagrant ssh
(4). 重新加载:vagrant reload
(5). 查看ip:ip addr (linux)
(6). 查看当前用户: whoami (linux)
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://chqac97z.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
(1). 查看docker的版本:docker -v
(2). 设置开机自启动:sudo systemctl enable docker
(3). 查看镜像:sudo docker images
(4). 设置docker里面容器自启动:sudo docker update redis --restart=always
sudo docker pull mysql:5.7
# --name指定容器名字 -v目录挂载 -p指定端口映射 -e设置mysql参数 -d后台运行
sudo docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
docker ps
docker exec -it mysql /bin/bash 使用守护式进程
vi /mydata/mysql/conf/my.conf
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
docker restart mysql
sudo docker pull redis
有坑:
# 在虚拟机中
mkdir -p /mydata/redis/conf
touch /mydata/redis/conf/redis.conf
docker run -p 6379:6379 --name redis \
-v /mydata/redis/data:/data \
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf
docker exec -it redis redis-cli
vim /mydata/redis/conf/redis.conf
# 插入下面内容
appendonly yes
保存
docker restart redis
①.
②.
③.
④.
⑤.
⑥.
⑦.