谷粒商城项目篇1_分布式基础篇_分布式基础概念、环境搭建、创建项目

本文档详细介绍了如何使用Docker搭建MySQL和Redis环境,包括配置镜像加速、容器启动、数据持久化等步骤。此外,还涵盖了微服务的基础概念,如集群、分布式、远程调用等,并阐述了服务注册、发现、熔断和降级的重要性。最后,展示了创建电商项目《谷粒商城》的初步步骤,包括创建总模块和微服务模块。
写在前面

为丰富项目经验,特此学习B站开源视频《全网最强电商教程《谷粒商城》对标阿里P6/P7,40-60万年薪》希望通过此学习能巩固所学,将技术栈串接起来。

此项目三个阶段

  • 分布式基础:SpringBoot、SpringCloud、Nacos、openFeign、Mybatis、Docker、vue、ElementUI等
  • 分布式高级:ES全文检索、业务追踪、缓存Session同步方案、网关、远程调用、线程池、调优、分布式锁、分布式事务、服务限流、熔断、降级等
  • 高可用集群:k8s集群、DevOps、redis、mysql、es等的集群搭建部署

在这里插入图片描述

开学即大三,离春招秋招越来越近…努力吧
请添加图片描述

目录
  1. 分布式基础概念
  2. 环境搭建
    • docker安装mysql
    • docker安装redis
    • 开发环境统一
      • 配置maven阿里云镜像和jdk编译环境
      • vscode安装插件
  3. 创建项目
    • 创建聚合总模块
    • 创建商品微服务模块
    • 创建其他微服务模块
    • 修改聚合模块pom配置
一、分布式基础概念

往期 《微服务架构》 系列博客参考:https://blog.csdn.net/qq_24654501/category_10935575.html

微服务架构

  • 将单体应用拆分为若干个小服务,每个小服务运行在自己的进程,并使用轻量级机制通信。
  • 简而言之,解决大型单体应用,基于业务边界进行服务微化拆分,个个服务独立部署运行。

集群、分布式概念

  • 集群是物理形态,一堆机器就可以叫集群。将几台服务器集中起来实现同一业务。
  • 分布式是工作方式,分布式是若干独立计算机的集合,这些计算机相对于用户来说就像单个相关系统(用户体现不到是多个服务器)
  • 京东是一个分布式系统,众多业务运行在不同的机器,所有业务构成一个大型的业务集群。

远程调用、负载均衡

  • 在分布式系统中,各个服务可能处于不同的主机,但是服务之间需要通信,SpringCloud中使用 HTTP+JSON的方式完成远程调用。
  • 远程调用的过程中,各个服务可能处于不同的主机,怎么使用这些不同的主机保证负载均衡(轮询、权重、最小连接)。

服务的注册、发现

  • A服务调用B服务,A服务并不知道B服务情况(部署在哪几台机器,是否正常等问题)。
  • 为解决这个问题,引入注册中心。

配置中心

  • 每一个服务都需要大量的配置,并且部署在不同的服务器上。变更修改配置非常不方便。
  • 因此可以是用配置中心集中管路微服务的配置信息,各个微服务只要去指定地点读取配置即可。

服务熔断、降级

  • 微服务架构中,微服务之间互相存在依赖,当其中一个服务不可用时,有可能会造成雪崩的效应。
  • 为了防止这样的情况,需要有 容错机制 保护。
  • 服务熔断:设置服务的超时时间,当被调用的服务经常失败到达某个阀值,可以开启断路保护机制,后来的请求不在远程调用这个故障服务,直接调用调用者本地直接返回默认数据。
  • 服务降级:在运维期间,系统处于高峰期,系统资源紧张,我们可以让非核心业务降级运行。(降级:不处理或者简单处理,抛异常、返回null、调用mock数据、调用Fallback处理逻辑)

API网关

  • 微服务架构中重要的组件,他抽象了微服务中华都需要的公共功能,同时提供客户端负载均衡、服务自动熔断、灰度发布、同一认证、限流流控、日志统计等丰富的功能。
  • 对于前后端分离的微服务来说,前端发送json数据请求到后端,都要先通过API网关。

微服务架构图

在这里插入图片描述

微服务划分图
在这里插入图片描述

二、环境搭建

步骤

启动、设置开机自启

# 启动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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

scl、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值