一:项目介绍
1.1项目背景
谷粒商城是一款B2C的电商平台
1.2电商模式
电商模式:B2B、B2C、C2B、C2C、O2O
B—business
C—consumer
B2C:供应商(商家)直接把商品卖给客户,京东自营,苏宁易购,天猫
C2C:客户与客户之间的买卖,如闲鱼、淘宝
1.3项目架构
1.4项目技术&特色
熟悉SpringBoot以及常见整合方案
了解SpringCloud
熟悉 git maven
熟悉 linux redis docker 基本操作
了解 html,css,js,vue
熟练使用idea开发项目
二:分布式基础
2.1微服务
微服务架构风格,就像是把一个单独的应用程序开发成一套小服务,每个小服务运行在自己的进程中,并使用轻量级机制通信,通常是 HTTP API 这些服务围绕业务能力来构建,并通过完全自动化部署机制来独立部署,这些服务使用不同的编程语言书写,以及不同数据存储技术,并保持最低限度的集中式管理
简而言之,拒绝大型单体应用,基于业务边界进行服务微化拆分,每个服务独立部署运行。
2.2集群&分布式&节点
分布式:是一种工作方式,是指根据不同的业务分布在不同的地方
《分布式系统原理与范型》定义:分布式系统是若干独立计算机的集合,这些计算机对于用户来说像单个系统分布式系统 (distributed system) 是建立网络之上的软件系统
集群:物理状态,一堆机器可以叫集群,他们可以协作干活或独立。将几台服务器集中在一起,实现同一业务。
节点:集群中的一个服务器
例如:京东是一个分布式系统,众多业务运行在不同的机器上,所有业务构成一个大型的分布式业务集群,每一个小的业务,比如用户系统,访问压力大的时候一台服务器是不够的,我们就应该将用户系统部署到多个服务器,也就是每一个业务系统也可以做集群化。
2.3远程调用
在分布式系统中,各个服务可能处于不同主机,那如何通讯?
服务间的不可避免的需要互相调用,我们称为远程调用。SpringCloud中使用http+json的方式完成远程调用。
2.4负载均衡
分布式系统中,A 服务需要调用B服务,B服务在多台机器中都存在, A调用任意一个服务器均可完成功能。
为了使每一个服务器都不要太或者太闲,我们可以负载均衡调用每一个服务器,提升网站的健壮性。
常见的负载均衡算法:
轮询:为第一个请求选择健康池中的每一个后端服务器,然后按顺序往后依次选择,直到最后一个,然后循环(类似时间片算法?)
最小连接:优先选择链接数最少,也就是压力最小的后端服务器,在会话较长的情况下可以考虑采取这种方式
2.5服务注册/发现&注册中心
A服务调用B服务,A服务不知道B服务当前在哪几台服务器上有,哪些正常的,哪些服务已经下线,解决这个问题可以引入注册中心。
如果某些服务下线,我们其他人可以实时的感知到其他服务的状态,从而避免调用不可用的服务。
2.6配置中心
每一个服务最终都有大量配置,并且每个服务都可能部署在多个服务器上,我们经常需要变
更配置,我们可以让每个服务在配置中心获取自己的配置。
配置中心用来集中管理微服务的配置信息。
2.7服务熔断&降级
在微服务架构中,微服务之间通过网络来进行通信,存在相互依赖, 当其中一个服务不可用时,有可能会造成雪崩效应,要防止这种情况,必须要有容错机制来保护服务。
rpc
情景:订单服务 --> 商品服务 --> 库存服务库存服务出现故障导致响应慢,导致商品服务需要等待,可能等到10s后库存服务才能响应。库存服务的不可用导致商品服务阻塞,商品服务等的期间,订单服务也处于阻塞。一个服务不可用导致整个服务链都阻塞。如果是高并发,第一个请求调用后阻塞10s得不到结果,第二个请求直接阻塞10s。更多的请求进来导致请求积压,全部阻塞,最终服务器的资源耗尽。导致雪崩
服务熔断
设置服务的超时,当被调用的服务经常失败到达某个阈值,我们可以开启断路保护机制,后来的请求不再去调用这个服务,本地直接返回默认的数据服务降级
在运维期间,当系统处于高峰期,系统资源紧张,我们可以让非核心业务降级运行,降级:某些服务不处理,或者简单处理(抛异常,返回NULL,调用 Mock数据,调用 FallBack 处理逻辑)
2.8API网关
在微服务架构中,API Gateway 作为整体架构的重要组件,抽象服务中 需要的公共功能,同时它提供了客户端负载均衡,服务自动熔断,灰度发布,统 一认证,限流监控,日志统计等丰富功能,帮助我们解决很多API管理的难题。
三:环境准备
3.1安装JDK1.8或以上版本
3.2准备虚拟机
视频中所用的是Centos系统,经本人尝试使用VMware的Ubuntu也可以。
且建议使用VMware搭建虚拟机因为可视化以及网络配置方便。
3.3虚拟机通讯相关
查看本机ip地址:
cmd输入命令:ipconfig中的Ipv4即本机ip,并记录本机ip地址
查看虚拟机ip地址:
在虚拟机终端输入命令: ifconfig查看,并记录虚拟机ip地址
测试本机与虚拟机网络通讯:
1.在本机cmd中输入ping [虚拟机ip地址]
2.在虚拟机终端输入ping [本机ip地址]
如显示正在ping...的数据,则网络通讯成功
错误记录:Ubuntu不显示网络图标,无法连接网络
尝试输入以下命令:
sudo service network-manager stop
sudo rm /var/lib/NetworkManager/NetworkManager.state
sudo service network-manager start
3.4安装docker
3.5安装MySQL
1.进入root权限
su root
2.拉取docker中mysql镜像(视频中安装的版本是5.7)
sudo docker pull mysql:5.7
3.首次配置并启动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 Linux的3306端口与mysql容器的3306端口建立映射
-name:给mysql容器起名
-v:挂载文件
-e:改参数
4.之后启动mysql容器
docker start mysql
5.进入mysql容器
docker exec -it [容器名称|容器id] bin/bash
3.6安装Redis
1.下载redis镜像(默认最新版)
docker pull redis
2.为了配置参数先创建一个文件夹和文件
mkdir -p /mydata/redis/conf
touch /mydata/redis/conf/redis.conf
3.创建redis实例并启动
docker run -p 6379:6379 --name redis -v /mydata/redis/data:/data \
-v /mydata/redis/conf/redis.conf:/etc/redis/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf
4.使用redis镜像执行redis-cli命令
docker exec -it redis redis-cli
5.进入redis后可以尝试如下命令
set key value:插入一条键值对
get key:获取key对应的value
6.开启持久化(否则数据保存在内存中,重启redis后会清空所有数据)
进入redis.conf插入appendonly yes
3.7安装Maven
1.下载Maven
2.在idea中配置maven仓库
3.在maven配置文件中配置阿里云镜像
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
3.8创建码云gitee仓库
1.新建仓库
仓库名称任意或gulimall
语言选择java, gitgnore选择Maven,开源许可证选择Apache-2.0
分支模型选择生产/开发模型
3.9在IDEA中新建项目
1.在IDEA中新建项目选择Project from Version
2.在URL中填入刚刚码云仓库创建项目的URL,类似https://gitee.com/xxxxx/gulimall.git
3.创建如下5个模块(每个模块创建时建议导入web和openFeign这两个依赖)
4. 建立父模块
在gulimall中创建pom.xml
内容如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.leggasai.gulimall</groupId> <artifactId>gulimall</artifactId> <version>0.0.1-SNAPSHOT</version> <name>gulimall</name> <description>聚合服务</description> <packaging>pom</packaging> <modules> <module>gulimall-coupon</module> <module>gulimall-member</module> <module>gulimall-order</module> <module>gulimall-product</module> <module>gulimall-ware</module> </modules> </project>