谷粒商城项目篇1_分布式基础篇_分布式基础概念、环境搭建、创建项目
写在前面
为丰富项目经验,特此学习B站开源视频《全网最强电商教程《谷粒商城》对标阿里P6/P7,40-60万年薪》希望通过此学习能巩固所学,将技术栈串接起来。
此项目三个阶段
- 分布式基础:SpringBoot、SpringCloud、Nacos、openFeign、Mybatis、Docker、vue、ElementUI等
- 分布式高级:ES全文检索、业务追踪、缓存Session同步方案、网关、远程调用、线程池、调优、分布式锁、分布式事务、服务限流、熔断、降级等
- 高可用集群:k8s集群、DevOps、redis、mysql、es等的集群搭建部署
开学即大三,离春招秋招越来越近…努力吧
目录
- 分布式基础概念
- 环境搭建
- docker安装mysql
- docker安装redis
- 开发环境统一
- 配置maven阿里云镜像和jdk编译环境
- vscode安装插件
- 创建项目
- 创建聚合总模块
- 创建商品微服务模块
- 创建其他微服务模块
- 修改聚合模块pom配置
一、分布式基础概念
往期 《微服务架构》 系列博客参考:https://blog.csdn.net/qq_24654501/category_10935575.html
微服务架构
- 将单体应用拆分为若干个小服务,每个小服务运行在自己的进程,并使用轻量级机制通信。
- 简而言之,解决大型单体应用,基于业务边界进行服务微化拆分,个个服务独立部署运行。
集群、分布式概念
- 集群是物理形态,一堆机器就可以叫集群。将几台服务器集中起来实现同一业务。
- 分布式是工作方式,分布式是若干独立计算机的集合,这些计算机相对于用户来说就像单个相关系统(用户体现不到是多个服务器)
- 京东是一个分布式系统,众多业务运行在不同的机器,所有业务构成一个大型的业务集群。
远程调用、负载均衡
- 在分布式系统中,各个服务可能处于不同的主机,但是服务之间需要通信,SpringCloud中使用 HTTP+JSON的方式完成远程调用。
- 远程调用的过程中,各个服务可能处于不同的主机,怎么使用这些不同的主机保证负载均衡(轮询、权重、最小连接)。
服务的注册、发现
- A服务调用B服务,A服务并不知道B服务情况(部署在哪几台机器,是否正常等问题)。
- 为解决这个问题,引入注册中心。
配置中心
- 每一个服务都需要大量的配置,并且部署在不同的服务器上。变更修改配置非常不方便。
- 因此可以是用配置中心集中管路微服务的配置信息,各个微服务只要去指定地点读取配置即可。
服务熔断、降级
- 微服务架构中,微服务之间互相存在依赖,当其中一个服务不可用时,有可能会造成雪崩的效应。
- 为了防止这样的情况,需要有 容错机制 保护。
- 服务熔断:设置服务的超时时间,当被调用的服务经常失败到达某个阀值,可以开启断路保护机制,后来的请求不在远程调用这个故障服务,直接调用调用者本地直接返回默认数据。
- 服务降级:在运维期间,系统处于高峰期,系统资源紧张,我们可以让非核心业务降级运行。(降级:不处理或者简单处理,抛异常、返回null、调用mock数据、调用Fallback处理逻辑)
API网关
- 微服务架构中重要的组件,他抽象了微服务中华都需要的公共功能,同时提供客户端负载均衡、服务自动熔断、灰度发布、同一认证、限流流控、日志统计等丰富的功能。
- 对于前后端分离的微服务来说,前端发送json数据请求到后端,都要先通过API网关。
微服务架构图
微服务划分图
二、环境搭建
步骤
- 使用VirtualBox + vagrant 创建Linux虚拟机(因为我使用阿里云服务器,此步骤省略)
- 安装docker,后续使用mysql、redis等都使用docker安装。参考往期博客《Docker学习篇1_Docker概述、Docker安装、Run的流程和Docker原理、Docker常用命令、Docker安装Nginx、tomcat练习》
centos官网安装dokcer步骤:https://docs.docker.com/engine/install/centos/
启动、设置开机自启
# 启动docker
[root@iZ2vc8owmlobwkazif1efpZ /]# sudo systemctl start docker
[root@iZ2vc8owmlobwkazif1efpZ /]# docker -v
Docker version 20.10.7, build f0df350
[root@iZ2vc8owmlobwkazif1efpZ /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
# 设置开机自启
[root@iZ2vc8owmlobwkazif1efpZ /]# sudo systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@iZ2vc8owmlobwkazif1efpZ /]#
配置阿里云镜像加速
[root@iZ2vc8owmlobwkazif1efpZ /]# sudo mkdir -p /etc/docker
[root@iZ2vc8owmlobwkazif1efpZ /]# sudo tee /etc/docker/daemon.json <<-'EOF'
> {> "registry-mirrors": ["https://rkbc9ion.mirror.aliyuncs.com"]
> }
> EOF
{"registry-mirrors": ["https://rkbc9ion.mirror.aliyuncs.com"]
}
[root@iZ2vc8owmlobwkazif1efpZ /]# sudo systemctl daemon-reload
[root@iZ2vc8owmlobwkazif1efpZ /]# sudo systemctl restart docker
[root@iZ2vc8owmlobwkazif1efpZ /]#
1.安装MySQL
拉去镜像:
docker pull mysql:5.7
创建实例运用卷挂载并启动
docker run
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
# 挂载启动mysql # -v 指定 卷挂载,分别挂载日志、配置文件夹到主机 # -e 设置初始密码 # -d Run container in background and print container ID [root@iZ2vc8owmlobwkazif1efpZ /]# 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 96f1910989d54192037d8ebdc6973fec4eb20f5a8060b0f526b074c37e8a1eb1# 查看启动 [root@iZ2vc8owmlobwkazif1efpZ /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 96f1910989d5 mysql:5.7 "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
命令行交互方式进入容器
docker exec -it 容器ID/bin/bash
[root@iZ2vc8owmlobwkazif1efpZ /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 96f1910989d5 mysql:5.7 "docker-entrypoint.s…" 9 minutes ago Up 9 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql# 进入容器内部,其实一个容器好比一个Linux系统 [root@iZ2vc8owmlobwkazif1efpZ /]# docker exec -it 96f1910989d5 /bin/bash root@96f1910989d5:/# ls bin boot dev docker-entrypoint-initdb.d entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var # 查看mysql的安装目录 root@96f1910989d5:/# whereis mysql mysql: /usr/bin/mysql /usr/lib/mysql /etc/mysql /usr/share/mysql root@96f1910989d5:/#
查看本地挂载的mysql配置文件夹
[root@iZ2vc8owmlobwkazif1efpZ /]# ls bin boot dev etc home lib lib64 lost+found media mnt mydata opt proc root run sbin srv sys tmp usr var [root@iZ2vc8owmlobwkazif1efpZ /]# cd /mydata/ [root@iZ2vc8owmlobwkazif1efpZ mydata]# ls mysql [root@iZ2vc8owmlobwkazif1efpZ mydata]# cd ./mysql/ [root@iZ2vc8owmlobwkazif1efpZ mysql]# ls conf data log [root@iZ2vc8owmlobwkazif1efpZ mysql]# cd ./conf/ [root@iZ2vc8owmlobwkazif1efpZ conf]# ls [root@iZ2vc8owmlobwkazif1efpZ conf]# cd ../data [root@iZ2vc8owmlobwkazif1efpZ data]# ls 96f1910989d5.pid ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ibtmp1 performance_schema public_key.pem server-key.pem auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 mysql private_key.pem server-cert.pem sys [root@iZ2vc8owmlobwkazif1efpZ data]# cd ../log/ [root@iZ2vc8owmlobwkazif1efpZ log]# ls [root@iZ2vc8owmlobwkazif1efpZ log]#
配置mysql
vi /mydata/mysql/conf/my.cnf [client] default-character-set=utf-8[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
[root@iZ2vc8owmlobwkazif1efpZ mysql]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 96f1910989d5 mysql:5.7 "docker-entrypoint.s…" 26 minutes ago Up 13 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql [root@iZ2vc8owmlobwkazif1efpZ mysql]# docker restart 96f1910989d5 96f1910989d5 [root@iZ2vc8owmlobwkazif1efpZ mysql]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 96f1910989d5 mysql:5.7 "docker-entrypoint.s…" 26 minutes ago Up 4 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql [root@iZ2vc8owmlobwkazif1efpZ mysql]# docker exec -it 96f1910989d5 /bin/bash root@96f1910989d5:/# ls bin boot dev docker-entrypoint-initdb.d entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var # 查看容器内配置目录,是否挂在成功是否存在my.cnf root@96f1910989d5:/# cd /etc/mysql/ root@96f1910989d5:/etc/mysql# ls my.cnf root@96f1910989d5:/etc/mysql# cat my.cnf [client] default-character-set=utf-8[mysql] default-character-set=utf-8[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 root@96f1910989d5:/etc/mysql#
2.安装Redis
基本步骤
拉去镜像
挂载启动
测试
[root@iZ2vc8owmlobwkazif1efpZ mysql]# docker pull redis[root@iZ2vc8owmlobwkazif1efpZ mysql]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql 5.7 9f1d21c1025a 2 days ago 448MB redis latest 08502081bff6 4 weeks ago 105MB# 直接写redis.conf挂在会被当做目录,需要先创建主机挂载文件夹 [root@iZ2vc8owmlobwkazif1efpZ conf]# touch redis.conf [root@iZ2vc8owmlobwkazif1efpZ conf]# ls 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# 测试,相比于mysql的/bin/bash,可以使用redis-cli测试 [root@iZ2vc8owmlobwkazif1efpZ redis]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f26a09fb394e redis "docker-entrypoint.s…" 6 seconds ago Up 5 seconds 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis 96f1910989d5 mysql:5.7 "docker-entrypoint.s…" 42 minutes ago Up 15 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql# 重启容器 [root@iZ2vc8owmlobwkazif1efpZ conf]# docker restart redis redis [root@iZ2vc8owmlobwkazif1efpZ conf]# cd /mydata/redis/conf/ [root@iZ2vc8owmlobwkazif1efpZ conf]# ls redis.conf # redis.conf现在还是空的,待会配置持久化 [root@iZ2vc8owmlobwkazif1efpZ conf]# cat redis.conf [root@iZ2vc8owmlobwkazif1efpZ conf]# docker exec -it redis redis-cli 127.0.0.1:6379> ping PONG 127.0.0.1:6379>
配置aof持久化
[root@iZ2vc8owmlobwkazif1efpZ conf]# vi redis.conf [root@iZ2vc8owmlobwkazif1efpZ conf]# cat redis.conf appendonly yes [root@iZ2vc8owmlobwkazif1efpZ conf]# docker restart redis redis [root@iZ2vc8owmlobwkazif1efpZ conf]# docker exec -it redis redis-cli 127.0.0.1:6379> set name xiaosi OK 127.0.0.1:6379> get name "xiaosi" 127.0.0.1:6379> exit [root@iZ2vc8owmlobwkazif1efpZ conf]# docker restart redis redis [root@iZ2vc8owmlobwkazif1efpZ conf]# docker exec -it redis redis-cli 127.0.0.1:6379> get name "xiaosi" 127.0.0.1:6379>
本地连接测试
最后将mysql、redis设置为docker启动时自启
5.开发环境统一
- JDK的版本环境为11
- Maven的版本为3.6.3
1.配置Maven阿里云镜像和jdk的编译环境
步骤
打开Maven的配置文件,我的E:\Maven\apache-maven-3.6.3-bin\apache-maven-3.6.3\conf
配置默认jdk环境
IDEA整合Maven
2.vscode安装插件
三、创建项目
微服务模块
- 商品服务
- 仓储服务
- 订单服务
- 优惠券服务
- 用户服务
1.创建总模块
- 创建git仓库
- 使用git地址
https://github.com/GitHubSi/guli-shop
初始化IDEA项目,作为总模块。
2.创建商品微服务模块
3.创建其他各个微服务模块
…
最后
4.修改聚合模块pom配置
最后push到仓库
仓库地址:https://github.com/GitHubSi/guli-shop
谷粒商城项目篇1_分布式基础篇_分布式基础概念、环境搭建、创建项目相关推荐
- CGB2005 JT-1(jt概述 SqlYog 物理模型图PD 表结构 pom文件标签说明 jt环境搭建 创建项目2种,创建各种文件 idea导入,打包,删除项目,启动原理)
注意事项: 1.京淘项目概述和动吧项目缺点描述 2.把sql文件导入数据库:通过SqlYog可视化工具或者Dos命令窗口. 3.SqlYog说明,和制作物理模型图的工具pd用发. 4.表结构学习 5. ...
- 基于阿里云服务器环境搭建到项目上线系列文章之一——putty使用秘钥登录远程服务器
基于阿里云服务器环境搭建到项目上线系列 前言:最近购买了域名和一台阿里云服务器准备做点东西放上去,所以准备把环境搭建到项目上线的过程记录下来,计划一个系列6篇文章 基于阿里云服务器环境搭建到项目上线系 ...
- 基于阿里云服务器环境搭建到项目上线系列文章之三——安装git
基于阿里云服务器环境搭建到项目上线系列 前言:最近购买了域名和一台阿里云服务器准备做点东西放上去,所以准备把环境搭建到项目上线的过程记录下来,计划一个系列6篇文章 基于阿里云服务器环境搭建到项目上线系 ...
- 基于阿里云服务器环境搭建到项目上线系列文章之六——项目部署
基于阿里云服务器环境搭建到项目上线系列 前言:最近购买了域名和一台阿里云服务器准备做点东西放上去,所以准备把环境搭建到项目上线的过程记录下来,计划一个系列6篇文章 基于阿里云服务器环境搭建到项目上线系 ...
- 基于阿里云服务器环境搭建到项目上线系列文章之四——安装composer
基于阿里云服务器环境搭建到项目上线系列 前言:最近购买了域名和一台阿里云服务器准备做点东西放上去,所以准备把环境搭建到项目上线的过程记录下来,计划一个系列6篇文章 基于阿里云服务器环境搭建到项目上线系 ...
- Java web小项目_个人主页(1)—— 云环境搭建与项目部署
摘自:Java web小项目_个人主页(1)-- 云环境搭建与项目部署 作者:丶PURSUING 发布时间: 2021-03-26 23:59:39 网址:https://blog.csdn.net/ ...
- 我的全栈之路-Python基础之Python概述与开发环境搭建
我的全栈之路-Python基础之Python概述与开发环境搭建 我的全栈之路 1.1 信息技术发展趋势 1.2 浅谈计算机系统架构 1.2.1 计算机系统架构概述 1.2.2 计算机硬件系统 1.2. ...
- 科学计算机程序 字表处理软件都是,计算机应用基础知识_计算机应用基础试题及答案【最新资料】.doc...
计算机应用基础知识_计算机应用基础试题及答案[最新资料] 计算机应用基础知识 计算机应用基础试题及答案 ? 计算机应用基础知识1.1填空题1.第一代计算机采用的电子器件是--[答案] 电子管2.第四代 ...
- chatbot聊天机器人环境搭建以及项目运行指南
项目地址 网传有一位程序员因忙于工作,无暇陪伴女友,便做了个聊天机器人的软件来陪女友聊天,然后自己就安心工作去了.等到程序员下班时一看,机器人已经和女友聊到了二胎的娃叫啥名了.博主不明觉厉,便去拷贝一 ...
- 火云开发课堂 - 《使用Cocos2d-x 开发3D游戏》系列 第二节:Cocos引擎开发环境搭建与项目创建!
<使用Cocos2d-x 开发3D游戏>系列在线课程 第二节:Cocos引擎开发环境搭建与项目创建! 视频地址:http://edu.csdn.net/course/detail/1330 ...
最新文章
- SpringBatch配置数据库
- python 底层实现_用Python从底层实现一个多层感知机
- Maven中如何禁止插件(plugin)在子模块(module)上执行
- python笔记之序列(set的基本使用和常用操作)
- 别太贪婪,这些技能能让你一辈子满足
- 糖果传递(信息学奥赛一本通-T1432)
- Cover Protocol更新赔偿计划 新增三个新COVER代币获赔方
- prototype的相关注意点
- 微服务实现不同登陆_PaaS与IaaS在微服务架构实现方面的6大不同
- 苹果台式电脑怎么使用计算机,苹果台式电脑开开不了机怎么办
- Java实现网易企业163邮箱发送邮件
- 电脑桌面的文件突然不见了怎么办
- 给到工作的你诗和远方~
- 计算机自带录音机格式,Windows自带录音机
- nginx设置禁止访问某个页面及只允许域名访问或某个ip禁止访问
- python方差齐性检验_【Python】统计科学之方差齐性检验
- Go语言如何实现删除Winmail邮箱系统中收件箱的所有邮件
- Centos7的yum安装报错Error: Nothing to do
- JavaFX8开发过程中的问题记录
- 最喜欢的一首中文歌曲
热门文章
- 西安计算机三本院校排名2015,2015西安三本大学排名
- H5脱单盲盒交友解密授权版/分销提现/存取小纸条盲盒匹配管理平台/免签支付/可封装APP/带教程-亲测可用
- 零基础学SQL(六、数据的增删改查简单语句)
- eclipse与idea快捷键
- 一看就懂的CE-NET详解
- 一天出货5000件,抖音电商这么6?无货源模式竟还在疯狂扩张
- 成都榆熙电商:拼多多商家如何看待店铺保证金?
- 3款免费好用的电脑录屏工具
- 红米note5解锁教程_红米NOTE5手机忘密码了怎么办?修手机的师傅教给我一个简单方法,解锁其实很简单...
- 【C51单片机学习笔记----DS18B20温度传感器LCD1602液晶屏直流电机调速与呼吸灯AD模数转换红外外部中断】