尚硅谷-谷粒商城
分布式基础&环境搭建
一、项目简介
1、项目背景
1)、电商模式
市面上有五种常见的电商模式B2B、B2C、C2B、C2C、O2O
1、B2B模式
B2B(Business to Business), 是指商家与商家建立的商业关系。 如: 阿里巴巴。
2、B2C模式
B2C(Business to Consumer), 就是我们经常看到的供应商直接把商品卖给用户,即“商对客”模式,也就是通常说的商业零售,直接面向消费者销售产品和服务。如:苏宁易购、京东、天猫、小米商城
3、C2B模式
C2B(Customer to Business), 即消费者对企业。先有消费者需求产生而后有企业生产,即先有消费者提出需求,后有生产企业按需求组织生产。
4、C2C模式
C2C(Customer to Customer),客户之间自己把东西放上网去卖,如:淘宝,闲鱼。
5、O2O模式
O2O即Online To Offline, 也即是线下商务的机会与互联网结合在了一起,让互联网成为线下交易的前台。线上快速支付,线下优质服务。如:饿了么,美团,淘票票,京东到家
2)、谷粒商城
谷粒商城就是一个B2C模式的电商平台,销售自营产品给客户。
2、项目架构图
1、项目微服务架构图

2、微服务划分图

3、项目技术&特色
- 前后分离开发,并开发基于vue的后台管理系统
- SpringCloud全新的解决方案
- 应用监控、限流、网关、熔断降级等分布式方案 全方位涉及
- 透彻讲解分布式事务、分布式锁等分布式系统的难点
- 分析高并发场景的编码方式,线程池,异步编排等使用
- 压力测试与性能优化
- 各种集群技术的区别以及使用
- CI/CD使用
4、项目前置要求
学习项目的前置知识
- 熟悉SpringBoot以及常见整合方案
- 了解SpringCloud
- 熟悉git,maven
- 熟悉Linux,redis,docker 基本操作
- 了解html, css, js, vue
- 熟练使用idea开发项目
二、分布式基础概念
1、微服务
微服务架构风格,就像是把一个单独的应用程序开发为一套小服务,每个小服务运行在自己的进程中,并使用轻量级机制通信,通常是HTTP API。这些微服务围绕业务能力来构建,并通过完全自动化部署机制来独立部署。这些微服务使用不同的编程语言书写,以及不同数据存储技术,并保持最低限度的集中式管理。
简而言之:拒绝大型单体应用,基于业务边界进行服务微化拆分,各个服务独立部署运行。

2、集群&分布式&节点
集群是物理形态,分布式是个工作方式。
只要是一堆机器,就可以叫集群,它们是不是一起协作着干活,这个谁也不知道;
《分布式系统原理与范性》定义:
“分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统”
分布式系统(distributed system)是建立在网络之上的软件系统。
分布式是指将不同的业务分布在不同的地方。
集群指的是将几台服务器集中在一起,实现同一业务。
例如:京东是一个分布式系统,众多业务运行在不同的机器,所有业务构成一个大型的业务集群。每一个小的业务,比如用户系统,访问压力大的时候一台服务器是不够的。我们就应该讲用户系统部署到多个服务器,也就是每一个业务系统也可以做集群化;
分布式中的每一个节点,都可以做集群。而集群并一定就是分布式的。
节点:集群中的一个服务器。
3、远程调用
在分布式系统中,各个服务可能处于不同的主机,但是服务之间不可避免的需要互相调用,我们成为远程调用。
SpringCloud中使用HTTP+JSON的方式完成远程调用。

4、负载均衡

分布式系统中,A服务需要调用B服务,B服务在多台机器中都存在,A调用任意一个服务器均可完成功能。
为了使每一个服务器都不要太忙或者太闲,我们可以负载均衡的调用每一个服务器,提升网站的健壮性。
常见的负载均衡算法:
轮询:为第一个请求选择健康池中的第一个后端服务器,然后按照顺序往后依次选择,直到最后一个,然后循环。
最小连接:优先选择连接数最少,也就是压力最小的后端服务器,在会话较长的情况下可以考虑采取这种方式。
散列:根据请求源的IP的散列(hash)来选择要转发的服务器。这种方式可以一定程度上保证特定用户能连接到相同的服务器。如果你的应用需要处理状态而要求用户能连接到和之前相同的服务器,可以考虑采取这种方式。
- 微服务的有状态和无状态:https://www.cnblogs.com/frankltf/p/10392566.html
5、服务注册/发现&注册中心
A服务调用B服务,A服务并不知道B服务当前在哪几台服务器有,哪些正常的,哪些服务已经下线。解决这个问题可以引入注册中心;

如果某些服务下线,我们其他人可以实时的感知到其他服务的状态,从而避免调用不可用服务。
6、配置中心

每一个服务最终都由大量的配置,并且每个服务都可能部署在多台机器上。我们经常需要变更配置,我们可以让每个服务在配置中心获取自己的配置。
配置中心用来集中管理微服务的配置信息
7、服务熔断&服务降级
在微服务中,微服务之间通过网络进行通信,存在互相依赖,当其中一个服务不可用时,有可能造成雪崩效应。要防止这样的情况,必须要有容错机制来保护服务。

1)、服务熔断
- 设置服务的超时,当被调用的服务经常失败到达某个阈值,我们可以开启断路保护机制,后来的请求不再去调用这个服务。本地直接返回默认的数据。
2)、服务降级
- 在运维期间,当系统处于高峰期,系统资源紧张,我们可以让非核心业务降级运行。降级:某些服务不处理,或者简单处理【抛异常、返回NULL、调用Mock数据、调用Fallback处理逻辑】。
8、API网关
在微服务架构中,API Gateway 作为整体架构的重要组件,它抽象了微服务中都需要的公共功能,同时提供了客户端负载均衡,服务自动熔断,灰度发布,统一认证,限流流控,日志统计等丰富的功能,帮助我们解决很多API管理难题。

三、环境搭建
1、安装Linux虚拟机
- 下载&安装VirtualBox : https://www.virtualbox.org/ ,要开启CPU虚拟化


- 下载安装 VirtualBox : https://www.virtualbox.org/
- 下载&安装 Vagrant
- https://www.vagrantup.com/downloads.html vagrant下载
- https://app.vagrantup.com/boxes/search Vagrant镜像
- 打开windwos cmd窗口,运行
Vagrant init centos/7,即可初始化一个centos7系统 - 运行vagrant up 即可启动虚拟机。 系统root用户的密码是:vagrant
- vagrant 其他常用命令
vagrant ssh: 自动使用vagrant 用户连接虚拟机vagrant upload source [destination] [name] [id]:上传文件
- 默认虚拟机的ip地址不是固定ip,开发不方便
- 修改Vagrantfile, config
2、安装docker
Dokcer 安装文档: https://docs.docker.com/install/linux/docker-ce/centos
1、 卸载系统之前的docker
3、docker安装mysql
1、下载镜像文件
docker pull mysql:5.7
2、创建实例并启动
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用户的密码
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
4、docker安装redis
1、下载镜像文件
docker pull redis
2、创建实例并启动
创建目录和redis配置文件
此处有个小坑,因为默认是没有redis.conf这个文件的所以,如果直接执行docker run…,此时会把redis.conf当成一个目录来对待,所以,先创建这个文件。
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
3、配置redis持久化
vi /mydata/redis/conf/redis.conf
appendonly yes
4、使用redis镜像执行redis-cli命令连接
docker exec -it redis redis-cli
5、开发环境统一
1、maven
阿里云镜像
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
jdk版本
<profiles>
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</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>
</profiles>
<localRepository>D:\applications\BuildTools\Maven\repository</localRepository>
2、Idea&VsCode
idea
配置maven 忽略
配置常用插件: lombok 和 mybatisx
vscode
vscode安装开发必备插件
vetur – 语法高亮、智能感知、Emmet等
包含格式化功能, ALT+SHIFT+F (格式化全文) , Ctrl + K Ctril +F (格式化选中代码, 两个Ctrl需要同时按着)
Eslint – 语法纠错
AutoClose Tag – 自动闭合 HTML/XML标签
Auto Rename Tag – 自动完成另一侧标签的同步修改
JavaScript(ES6) code snippets – ES6 语法智能提示以及快速输入, 除js外还支持.ts, .jsx , .tsx, .html, .vue , 省去配置其支持各种包含js代码文件的时间
不想打字了,直接上图



3、安装配置git


ssh-keygen -t rsa -C “409197549@qq.com”

cat ~/.ssh/id_rsa.pub

找到ssh公钥,标题随便写,公钥复制进去,然后确定,后输入密码,

添加好后

然后进行测试,使用ssh -T命令,然后输入yes,证明以后就使用这个秘钥了。

然后以后使用git客户端给码云推送项目内容时,就不需要使用用户名和密码了。
4、逆向工程使用
1、导入项目逆向工程
2、下载人人开源后台管理系统脚手架工程
- 导入工程,创建数据库
- 修改工程shiro依赖为SpringSecurity
- 删除部分暂时不需要的业务
3、下载人人开源后台管理系统vue端脚手架工程 - vscode导入前端项目
- 前后端联调测试基本功能
6、创建项目微服务
商品服务、仓储服务、订单服务、优惠券服务、用户服务
共同:
- web 、 openfeign
- 每一个服务,包名 com.atguigu.gulimall.xxx
- 模块名: gulimall-coupon
1)、从gitee初始化一个项目
- 首先登陆自己的码云,点击新建仓库
- 填写一些仓库信息
- 选择公开,语言java ,并且选择.gitignore模板,这样我们提交的一些非代码以及配置文件类的东西就可以忽略掉
- 开发模型使用生产开发模型
- 然后创建出我们的仓库,我们复制仓库的地址
- 然后打开idea ,新建一个项目,从project from version control
- 然后就打开了我们在码云上的项目
具体如图

2 创建各个微服务项目
然后这个项目作为一个总项目,其他微服务项目作为一个个子模块,
可以使用spring 初始化向导

一些信息展示

导入 web

微服务之间要进行互相调用,所以使用openfeign

先导入这两个必要组件

然后finish ,
同理创建出微服务的其他各种项目。

然后创建出所有项目之后,打开run dashboard

然后在gulimall变为聚合项目,复制一个pom文件到外面,

然后在maven栏中 点击+号,将 gulimall添加到maven项目

会发现 gulimall后面有个root ,聚合其他子模块
这个可以做到,在root项目中clean一下,然后所有项目都会一起clean

然后修改总项目的.gitignore模板,比如**/mvnw,这样所有路径下的mvnw就不会被git察觉到。

此时点击version control的刷新图表,然后就会发现,对应的mvnw没有了。
类似的将其他的也都忽略掉
注意是在gulimall总的.gitignore文件内修改

然后如果在父项目maven点击compile ,此时会生成 target目录,这里面的东西也不需要提交。

再加上一些其他的东西,最终效果如下图。

然后将需要提交的都加入到版本控制中

想要将代码提交到码云,需要安装码云插件

然后commit 并且 push


然后查看码云中的谷粒商城

刷新

本文详细介绍了谷粒商城的项目背景、架构图和技术特色,包括微服务、集群、分布式、远程调用等分布式基础概念。此外,还提供了环境搭建的步骤,涵盖Linux虚拟机、docker安装及mysql、redis的配置,以及开发环境的统一和项目微服务创建。

865

被折叠的 条评论
为什么被折叠?



