项目背景
- 电商模式
市面上有5种常见的电商模式B2B,B2C,C2B,C2C,O2O
- B2B模式
B2B,是指商家与商家建立的商业关系,如:阿里巴巴。 - B2C模式
就是我们经常看到的供应商直接把商品卖给用户,即“商对客模式”也就是通常说的商业零售,直接面向消费者销售产品和服务。如:苏林易购,京东,天猫,小米商城。 - C2B模式
即消费者对企业,先有消费者需求产生而后有企业生产,即先有消费者提出需求,后有生产企业按需求组织生产。
-C2C模式
客户之间自己把东西放上网上去卖,如:淘宝,闲鱼。 - O2O模式
将线下商务的机会与互联网结合在了一起,让互联网成为线下交易的前台。线上快速支付,线下优质服务,如:饿了吗,美团,淘票票,京东到家。
-
谷粒商城
是一个B2C模式的电商平台,销售自营商品给客户。 -
项目技术特色
- 前后端分离开发,并开发基于vue的后台管理系统。
- springcloud全新的解决方案。
- 应用监控,限流,网关,熔断降级等分布式方案,全方位涉及。
- 透彻讲解分布式事务,分布式锁等分布式系统的难点
- 分析高并发场景的编码方式,线程池,异步编排等使用
- 压力测试与性能优化
- 各种集群技术的区别以及使用
- CI/CD使用
- 项目前置要求
- 熟悉springboot以及常见整合方案
- 了解springcloud
- 熟悉git,maven
- 熟悉linux,redis,docker基本操作
- 了解html,css,js,vue
- 熟悉使用idea开发项目
分布式基础概念
- 微服务
微服务架构风格,就像是把一个单独的应用程序开发为一套小服务,每个小服务运行在自己的进程中,并使用轻量级机制通信,通常是http api。
这些服务围绕业务能力来构建,并通过完全自动化部署机制来独立部署。
这些服务使用不同的编程语言书写,以及不同数据存储技术,并保持最低限度的集中式管理。
简而言之,拒绝大型单体应用,基于业务边界进行服务微化拆分,各个服务独立部署运行。
- 集群分布式节点
集群是个物理形态,分布式是个工作方式。
只要一堆机器,就可以叫集群,他们是不是一起协作着干活,这个谁也不知道。
分布式系统时若干个独立计算机的集合,这些计算机对于用户来说就像单个相关系统,分布式是指将不同的业务分布在不同的地方,集群指的是将几台服务器集中在一起,实现同一业务。
例如:京东是一个分布式系统,众多业务运行在不同的机器,所有业务构成一个大型的业务集群。
每一个小的业务,比如用户系统,访问压力大的时候一台服务器是不够的,我们就应该将用户系统部署到多个服务器,也就是每一个业务系统也可以做集群化。
分布式中的每一个节点,都可以做集群,而集群并不一定就是分布式的。
节点:集群中的一个服务器。
-
远程调用
在分布式系统中,各个服务可能处于不同主机,但是服务之间不可避免的需要互相调用,我们称为远程调用。
springcloud中使用http +json的方式完成远程调用
-
负载均衡
分布式系统中,A服务需要调用B服务,B服务在多态机器中都存在,A调用任意一个服务器均可完成功能。
为了事每一个服务器都不要太忙或者太闲,我们可以负载均衡的调用每一个服务器,提升网站的健壮性。
常见的负载均衡算法:
- 轮询:为第一个请求选择健康池中的第一个后端服务器,然后按顺序往后依次选择,直到最后一个,然后循环。
- 最小连接:优先选择连接数最少,也就是压力最小的后端服务器,在会话较长的情况下可以考虑采取这种方式。
- 散列:根据请求源的IP的散列(hash)来选择要转发的服务器,这种方式可以一定程度上保证特定用户能连接到相同的服务器。如果你的应用需要处理状态而要求用户能连接到和之前相同的服务器,可以考虑采取这种方式。
- 服务注册与发现
A服务调用B服务,A服务并不知道B服务当前在哪几台服务器上有,哪些正常的,哪些服务已经下线,解决这个问题可以引入注册中心;
如果某些服务下线,我们其他人可以实时的感知到其它服务的状态,从而避免调用不可用的服务。
- 配置中心
每一个服务最终都有大量的配置,并且每个服务都可能部署在多态机器上,我们经常需要变更配置,我们可以让每个服务在配置中心获取自己的配置。
配置中心用来集中管理微服务的配置信息。
- 服务熔断,服务降级
在微服务架构中,微服务之间通过网络进行通信,存在相互依赖,当其中一个服务不可用时,有可能会造成雪崩效应,要防止这样的情况,必须要有容错机制来保护服务。
- 服务熔断
设置服务的超时,当被调用的服务经常失败到达某个阈值,我们可以开启短路保护机制,后来的请求不再去调用这个服务,本地直接返回默认的数据。 - 服务降级
在运维期间,当系统处于高峰期,系统资源紧张,我们可以让非核心业务降级运行。降级:某些服务不处理,或者简单处理[抛异常,返回null,调用mock数据,调用fallback处理逻辑]。
- API网关
在微服务架构中,API Gateway作为整体架构的重要组件,它抽象了微服务中都需要的公共功能,同时提供了客户端负载均衡,服务自动熔断,灰度发布,统一认证,限流流控,日志统计等丰富的功能,帮助我们解决很多API管理难题。
环境搭建
- 安装linux虚拟机
https://www.virtualbox.org/
下载安装 Vagrant
https://app.vagrantup.com/boxes/search
vagrant 官方镜像仓库
- 打开 window cmd窗口,运行 vagrant init centos/7 ,即可初始化一个centos7系统
- 运行 vagrant up 即可启动虚拟机,系统root用户的密码是vagrant
- vagrant 其它常用命令:
- vagrant ssh:自动使用vagrant用户连接虚拟机
- vagrant upload source [destination][name][id] 上传文件
- 重启电脑
- 打开cmd
- 虚拟机的开启也可以直接在virtualbox里面进行
- 网络地址转换-端口转发
虚拟机网络设置
- 打开在c盘上的Vagrantfile文件
- 如果不知道自己电脑的ip地址,就可打开cmd窗口
- 修改Vagrantfile文件的网络ip
- 重启虚拟机
- 重新打开一个cmd ping一下网络
Docker
虚拟化容器技术,Docker基于镜像,可以秒级启动各种容器,每一种容器都是一个完整的运行环境,容器之间互相隔离。
https://docs.docker.com/engine/install/centos/
- 旧版本的Docker被称为Docker或docker-engine。如果安装了这些,则卸载它们以及相关的依赖项。
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- 安装yum-utils包(它提供了yum-config-manager实用程序)
sudo yum install -y yum-utils
- 并设置稳定的存储库
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
- 安装最新版本的Docker引擎和containerd,或进入下一步安装一个特定的版本
sudo yum install docker-ce docker-ce-cli containerd.io
- 启动 Docker
sudo systemctl start docker
- 检查docker的版本 :docker -v
- 检查是否下载的镜像
- 设置docker 开机自启动:sudo systemctl enable docker
配置docker镜像加速
- 登录阿里云
- 选择容器镜像服务
docker 安装mysql
- 下载镜像文件
sudo docker pull mysql:5.7
- 检查是否下载好了mysql
- 创建实例并启动
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
参数说明:
- -p 3306:3306:将容器的3306端口映射到主机的3306端口。
- -v /mydata/mysql/conf:/etc/mysql: 将配置文件夹挂载到主机。
- -v/mydata/mysql/log:/var/log/mysql:将日志文件夹挂载到主机。
- -v /mydata/mysql/data:/var/lib/mysql:将配置文件夹挂载到主机。
- -e MYSQL_ROOT_PASSWORD=root\:初始化root用户的密码
- 查看正在运行的容器:docker ps
- 修改mysql的字符编码
vi /mydata/mysql/conf/my.cnf
[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
-
vi my.cnf 进入编辑模式
修改完后按 esc :wq 回车退出 -
重启mysql: docker restart mysql
docker 安装 redis
-
下载镜像文件: 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一启动的时候就启动redis,mysql
sudo docker update redis --restart=always
sudo docker update mysql --restart=always
开发环境统一
- Maven
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
<profile>
<id>jdk-1.8</id>
<activation>
<jdk>1.8</jdk>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
安装配置git
- 下载git:https//git-scm.com
- 配置git,进入git bash
配置用户名
git config --global user.name “username” //名字
配置邮箱
git config --global user.email “username@email.com”
- 创建仓库
- 自动启动redis,mysql