一、项目简介

1、项目背景

1)电商模式

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


2)谷粒商城

谷粒商城是一个 B2C 模式的电商平台,销售自营商品给客户。


2、项目架构图

1、项目微服务架构图

环境准备 - 图2

2、微服务划分图

环境准备 - 图3

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 的方式完成远程调用
image.png


4、负载均衡

分布式系统中,A 服务需要调用 B 服务,B 服务在多台机器中都存在,A 调用任意一个服务器均可完成功能。
为了使每一个服务器都不要太忙或者太闲,我们可以负载均衡的调用每一个服务器,提升网站的健壮性。
image.png

常见的负载均衡算法:

  1. 轮询:为第一个请求选择健康池中的第一个后端服务器,然后按顺序往后依次选择,直到最后一个,然后循环。
  2. 最小连接:优先选择连接数最少,也就是压力最小的后端服务器,在会话较长的情况下可以考虑采取这种方式。
  3. 散列:根据请求源的 IP 的散列(hash)来选择要转发的服务器。这种方式可以一定程度上保证特定用户能连接到相同的服务器。如果你的应用需要处理状态而要求用户能连接到和之前相同的服务器,可以考虑采取这种方式。

5、服务注册/发现&注册中心

A 服务调用 B 服务,A 服务并不知道 B 服务当前在哪几台服务器上部署,哪些正常的,哪些服务已经下线。解决这个问题可以引入注册中心;
image.png
如果某些服务下线,我们其他人可以实时的感知到其他服务的状态,从而避免调用不可用的服务


6、配置中心

每一个服务最终都有大量的配置,并且每个服务都可能部署在多台机器上。我们经常需要变更配置,我们可以让每个服务在配置中心获取自己的配置。
image.png
配置中心用来集中管理微服务的配置信息


7、服务熔断&服务降级

在微服务架构中,微服务之间通过网络进行通信,存在相互依赖,当其中一个服务不可用时,有可能会造成雪崩效应。要防止这样的情况,必须要有容错机制来保护服务。
不可用服务的层层累积会造成大面积的崩溃。
image.png

1)服务熔断

a. 设置服务的超时,当被调用的服务经常失败,失败次数到达某个阈值,我们可以开启断路保护机制,后来的请求不再去调用这个服务。本地直接返回默认的数据

2)服务降级

a. 在运维期间,当系统处于高峰期,系统资源紧张,我们可以让非核心业务降级运行。降级:某些服务不处理,或者简单处理【抛异常、返回 NULL、调用 Mock 数据、调用 Fallback 处理逻辑】。


8、API 网关

在微服务架构中,API Gateway 作为整体架构的重要组件,它抽象了微服务中都需要的公共功能,同时提供了客户端负载均衡服务自动熔断灰度发布统一认证限流流控日志统计等丰富的功能,帮助我们解决很多 API 管理难题。
image.png


三、环境搭建

1、安装 linux 虚拟机

image.png
image.png
检查是否开启
image.png

  • 下载&安装 Vagrant

  • 检查是否安装成功:打开 window cmd 窗口,输入Vagrant查看是否有反馈,之后运行 Vagrant init centos/7,即可初始化一个 centos7 系统

  • 运行 vagrant up 即可启动虚拟机。系统 root 用户的密码是 vagrant

  • vagrant 其他常用命令

  • 默认虚拟机的 ip 地址不是固定 ip,开发不方便 。

    • 为什么不方便?:默认是端口转发模式,当要访问虚拟机mysql的默认端口3306时,需要找到对应的windos端口3333。此方式的弊端是:每次在虚拟机中装入新软件都需要进行这样的端口转换,操作麻烦
      • image.png
    • 所以修改 Vagrantfile 的ip地址,
    • image.png
    • 重新加载 vagrant reload启动机器即可。然后再 vagrant ssh连接机器

2、安装 docker

  • 什么是docker?
    • Docker是一种虚拟化容器技术,Docker基于镜像,可以秒级启动各种容器,每种容器都是一个完整的运行环境,容器之间相互隔离
    • 当我们用windows重装系统时,会使用镜像工具对网上已经封装好的镜像进行加载,从而获得已经分区好了的且已经安装部分软件的windows系统。 这种环境相当于一个容器。
    • 所以在linux系统中安装上docker,然后docker在镜像市场下载所需要的镜像(过程类型maven依赖),把镜像下载到本机,然后基于此镜像启动容器
      • redis可以安装到多个容器中,且多个容器中的redis互不影响
    • image.png


以下内容根据 官方文档 修改而来。

1、若之前安装过docker,先删除

  1. sudo yum remove docker docker-common docker-selinux docker-engine

2、安装所需要的依赖及配置仓库地址

  1. //安装依赖
  2. sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  3. //设置仓库地址
  4. wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
  5. sudo sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo

3、安装 docker引擎

sudo yum makecache fast
sudo yum install docker-ce

4、启动 docker 并设置开机启动

启动docker:sudo systemctl start docker 
检查docker版本:docker -v
查看docker已下载的镜像:sudo docker images
设置开机启动:sudo systemctl enable docker

5、测试 docker 常用命令,注意切换到 root 用户下

https://docs.docker.com/engine/reference/commandline/docker/

6、配置 docker 镜像加速

通过修改 daemon 配置文件/etc/docker/daemon.json 来使用加速器 ;去自己的阿里云平台领取专属的加速地址:”registry-mirrors”: [“https://fv0zn3t0.mirror.aliyuncs.com“]

# 创建文件
sudo mkdir -p /etc/docker
# 修改配置, 设置镜像
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://fv0zn3t0.mirror.aliyuncs.com"]
}
EOF
# 重启后台线程
sudo systemctl daemon-reload
# 重启docker
sudo systemctl restart docker

3、docker 安装 mysql

1、下载镜像文件

docker pull mysql:5.7

2、创建实例并启动

 正确配置方法:
docker run -d -p 3308:3306 \
--privileged=true \
-v /mydata/mysql8/conf/my.cnf:/etc/my.cnf \
-v /mydata/mysql8/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql8 mysql:8.0
docker run -p 12345:3306 --name mysql5.5 \
-v /mydata/mysql5.5/log:/var/log/mysql \
-v /mydata/mysql5.5/data:/var/lib/mysql \
-v /mydata/mysql5.5/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
 -d mysql:5.5

-------------------------------
12345:
-p 3306:3306:将新创建的容器的3306端口映射到主机的3306端口,如此一来访问虚拟机中的3306端口就映射到mysql容器中的3306端口
===============================================
--name:给容器命名,此处命名为mysql5.5
===============================================
-v /mydata/mysql/log : /var/log/mysql:将配置文件挂载到主机/mydata/..; 前部分是将要映射到的位置,后部分是容器中被映射的部分; 此过程相当于是一个快捷方式,一个放在linux上的快捷方式;  log是日志文件,lib是数据文件,etc是mysql的配置文件
===============================================
-e MYSQL_ROOT_PASSWORD=root:初始化root用户的密码,此处为root

查看docker启动的容器:

docker ps

文件挂载说明

由于刚才用docker在linux中下载了mysql容器,所以此时可以查看已启动的容器

image.png

进入mysql容器,并查看文件夹,这些文件是mysql容器中的文件。每次若对mysql内部配置文件进行操作都要进入mysql容器,且进入到其配置文件所在目录进行修改,这样过程十分复杂。所以就通过文件挂载把mysql容器内部的文件映射到linux系统中,这两处就形成了关联,修改其中一处同时也就修改了另一处。
image.png
挂载后的结果如下图,退回到linux系统中,进入之前配置的文件,发现linux中已存在被映射的文件。
image.png
文件挂载的全局过程
Docker中每一个容器都是独立运行的,相当于一个独立的linux系统,如果想便捷地修改容器内的文件,我们就需要把容器目录挂载到主机的目录上。容器端口类似,外界无法直接访问容器内部的端口,需要先将容器端口映射到linux主机端口上才能访问。
image.png


3、MySQL 配置

在映射到linux中的conf文件下进行配置

//进入linux中挂载的mysql配置目录
cd /mydata/mysql/conf

//修改配置文件 my.cnf
vi 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

# Esc
# :wq

在配置文件中加入skip-name-resolve:跳过域名解析 ,并重启 mysql ,从而解决mysql连接慢的问题

进入mysql容器文件系统

docker exec -it mysql /bin/bash

进入mysql:mysql -u root -proot

查看mysql容器中映射的文件

发现确实mysql.conf中确实存在了之前在linux中配置的内容
image.png


4、docker 安装 redis

docker下载redis镜像文件

docker pull redis

创建实例并启动

//先在linux中创建redis配置文件redis.conf,不然之后的文件挂载没有与之对应的文件
//之前mysql的配置文件挂载不同的是redis/conf中没有配置文件redis.conf

//创建conf文件夹
mkdir -p /mydata/redis/conf
//创建配置文件redis.conf
touch /mydata/redis/conf/redis.conf

//启动redis容器,其中涉及文件挂载及容器命名
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

========================================
//-d redis redis-server /etc/redis/redis.conf         此命令解释如下:
//每次启动redis时按照linux中/etc/redis/redis.conf的配置来启动

使用 redis 容器执行 redis-cli 命令连接

docker exec -it redis redis-cli
可以正常使用redis:
image.png

  • 之前版本redis的所有数据都存在内存中,若重启redis,则就获取不到a的值了;但是最新版的redis开启了持久化

设置容器随docker启动自动运行

# mysql
docker update mysql --restart=always

# redis
docker update redis --restart=always

5、开发环境统一

关于Maven的配置

给maven配置阿里云镜像,加速下载jar包

<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>

让maven配置 jdk1.8 编译项目

<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>

Idea&VsCode 及插件

image.png
image.png
image.png


安装配置 git

1、下载 git:https://git-scm.com
2、配置 git:进入 git bash
# 配置用户名
git config —global user.name “username” //(名字)
#配置邮箱
git config —global user.email “username@email.com” //(注册账号时用的邮箱)
3、配置 ssh 免密登录
无论码云还是github,这部分的操作相同。https://gitee.com/help/articles/4181#article-header0
设置成功后,再用Git给码云推送代码就不需要输入账号密码了

进入 git bash;使用:ssh-keygen -t rsa -C "xxxxx@xxxxx.com"命令。 连续三次回车。

一般用户目录下会有或者 cat ~/.ssh/id_rsa.pub 

登录进入 gitee,在设置里面找到 SSH KEY 将.pub 文件的内容粘贴进去 

使用 ssh -T git@gitee.com 测试是否成功即可 

Git+码云教程 https://gitee.com/help/articles/4104

逆向工程使用

1、导入项目逆向工程
2、下载人人开源后台管理系统脚手架工程
(1) 导入工程,创建数据库
(2) 修改工程 shiro 依赖为 SpringSecurity
(3) 删除部分暂时不需要的业务
3、下载人人开源后台管理系统 vue 端脚手架工程
(1) vscode 导入前端项目
(2) 前后端联调测试基本功能


6、创建项目微服务

1、从 gitee 初始化一个项目

image.png


2、创建各个微服务项目

依次创建出:商品服务、仓储服务、订单服务、优惠券服务、用户服务
共同点:

  • 依赖 spring web、openfeign
  • 每一个服务的包名:com.atguigu.gulimall.xxx(product(产品)/order(订单)/ware(优惠券)/coupon(优惠券)/member(会员))
  • 模块名:
    • 优惠券服务:gulimall-coupon
    • 用户服务:gulimall-member
    • 订单服务:gulimall-order
    • 商品服务:gulimall-product
    • 仓储服务:gulimall-ware
  • 4.目录结构图:

image.png

3、添加父,子pom文件

多模块开发中,使用父模块对子模块的管理非常方便,会有以下好处

  • 父模块pom中的<_properties>_属性会被子模块继承
  • 父模块pom中,在<_dependencyManagement>_中可以进行子模块依赖的版本管理,子模块继承父模块之后,提供作用:锁定版本 + 子模块不用再写 version。
  • 此外,父模块中可以添加依赖作为全局依赖,子模块自动继承。<_dependencyManagement>外的<_dependencies_>_中定义全局依赖。

添加:pom 帮忙聚合各个微服务,配合
父 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.zsy</groupId>
    <artifactId>guli-mall</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>

    <modules>
        <module>mall-coupon</module>
        <module>mall-member</module>
        <module>mall-order</module>
        <module>mall-product</module>
        <module>mall-ware</module>
        <module>mall-common</module>
    </modules>
    <name>guli-mall</name>
    <description>parent</description>

    <!--  这里的属性会被子模块继承  -->
    <properties>
        <java.version>1.8</java.version>
        <mall.version>0.0.1-SNAPSHOT</mall.version>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <lombok.version>1.18.18</lombok.version>
        <mybatis-plus.version>3.4.2</mybatis-plus.version>
        <mysql.version>8.0.23</mysql.version>
        <http.components.version>4.4.13</http.components.version>
        <commons.lang.version>2.6</commons.lang.version>
        <spring.boot.version>2.4.3</spring.boot.version>
        <spring-cloud.version>2020.0.1</spring-cloud.version>
    </properties>
    <!--  子模块继承父模块之后,提供作用:锁定版本 + 子模块不用再写 version  -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatis-plus.version}</version>
            </dependency>

            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>

            <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore -->
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpcore</artifactId>
                <version>${http.components.version}</version>
            </dependency>
            <dependency>
                <groupId>commons-lang</groupId>
                <artifactId>commons-lang</artifactId>
                <version>${commons.lang.version}</version>
            </dependency>

            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>

            <dependency>
                <groupId>com.zsy</groupId>
                <artifactId>mall-common</artifactId>
                <version>${mall.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <!--  这里的依赖会被子模块继承  -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

子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>
    <parent>
        <groupId>com.zsy</groupId>
        <artifactId>guli-mall</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.zsy</groupId>
    <artifactId>mall-product</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mall-product</name>
    <description>商品服务</description>

    <dependencies>
        <dependency>
            <groupId>com.zsy</groupId>
            <artifactId>mall-common</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

4、修改.gitignore

  • .gitignore的作用是告诉Git哪些文件不需要添加到版本管理中
  • 修改后的.ignore文件 ```git target/ pom.xml.tag pom.xml.releaseBackup pom.xml.versionsBackup pom.xml.next release.properties dependency-reduced-pom.xml buildNumber.properties .mvn/timing.properties .mvn/wrapper/maven-wrapper.jar

——————-以下是添加的要忽略的,没必要上传的文件————————

/mvnw /mvnw.cmd

**/.mvn

**/target/

.idea

**/.gitignore

<a name="zrNIL"></a>
### 5、使用插件,提交代码到本地仓库和远程仓库

![image.png](https://cdn.nlark.com/yuque/0/2021/png/22137958/1629769201741-49675f33-2f71-4802-b201-09b5df032796.png#clientId=u359023c9-2c19-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=400&id=ue6ef613b&margin=%5Bobject%20Object%5D&name=image.png&originHeight=799&originWidth=1221&originalType=binary&ratio=1&rotation=0&showTitle=false&size=94447&status=done&style=none&taskId=ucf3af3b4-a455-4f1d-ad0b-b6a4137725b&title=&width=610.5)

---

<a name="lFBQN"></a>
## 7、数据库信息导入
根据脚本依次创建数据库<br />mall_oms:订单服务<br />mall_pms:商品服务<br />mall_sms:营销服务<br />mall_ums:用户服务<br />mall_wms:库存服务<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/12568777/1614935165979-f019cbd6-8aee-4b58-b58f-acba8c508328.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_16%2Ctext_RXDmtYHoi48%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10#crop=0&crop=0&crop=1&crop=1&height=192&id=x0dfz&margin=%5Bobject%20Object%5D&name=image.png&originHeight=383&originWidth=552&originalType=binary&ratio=1&rotation=0&showTitle=false&size=22526&status=done&style=none&title=&width=276)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/12568777/1614935176075-b97dd7c5-6904-48f8-b4c6-46d051b37e49.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_23%2Ctext_RXDmtYHoi48%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10#crop=0&crop=0&crop=1&crop=1&height=301&id=NFcHi&margin=%5Bobject%20Object%5D&name=image.png&originHeight=602&originWidth=823&originalType=binary&ratio=1&rotation=0&showTitle=false&size=25055&status=done&style=none&title=&width=411.5)<br />相关sql文件:<br />[gulimall_oms.sql](https://www.yuque.com/attachments/yuque/0/2021/sql/22137958/1629777380758-ab4c9af2-810a-4b18-ac37-ba8d8762bc36.sql?_lake_card=%7B%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2021%2Fsql%2F22137958%2F1629777380758-ab4c9af2-810a-4b18-ac37-ba8d8762bc36.sql%22%2C%22name%22%3A%22gulimall_oms.sql%22%2C%22size%22%3A19908%2C%22type%22%3A%22%22%2C%22ext%22%3A%22sql%22%2C%22status%22%3A%22done%22%2C%22taskId%22%3A%22u8a44778f-e8ad-4263-92d1-95882f80123%22%2C%22taskType%22%3A%22upload%22%2C%22id%22%3A%22u94772a69%22%2C%22card%22%3A%22file%22%7D)[gulimall_pms.sql](https://www.yuque.com/attachments/yuque/0/2021/sql/22137958/1629777380778-96c3ef26-9842-4e01-86ca-4bb1fab425a3.sql?_lake_card=%7B%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2021%2Fsql%2F22137958%2F1629777380778-96c3ef26-9842-4e01-86ca-4bb1fab425a3.sql%22%2C%22name%22%3A%22gulimall_pms.sql%22%2C%22size%22%3A160007%2C%22type%22%3A%22%22%2C%22ext%22%3A%22sql%22%2C%22status%22%3A%22done%22%2C%22taskId%22%3A%22u07dbf242-2259-4cb2-a881-cc5d3315df0%22%2C%22taskType%22%3A%22upload%22%2C%22id%22%3A%22u3da439ce%22%2C%22card%22%3A%22file%22%7D)[gulimall_sms.sql](https://www.yuque.com/attachments/yuque/0/2021/sql/22137958/1629777380778-24e8b58b-d201-4093-8c60-3a9baf96c041.sql?_lake_card=%7B%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2021%2Fsql%2F22137958%2F1629777380778-24e8b58b-d201-4093-8c60-3a9baf96c041.sql%22%2C%22name%22%3A%22gulimall_sms.sql%22%2C%22size%22%3A21888%2C%22type%22%3A%22%22%2C%22ext%22%3A%22sql%22%2C%22status%22%3A%22done%22%2C%22taskId%22%3A%22u2620313e-7c7c-4132-a5f3-ccb1857cb99%22%2C%22taskType%22%3A%22upload%22%2C%22id%22%3A%22u8db9fcb7%22%2C%22card%22%3A%22file%22%7D)[gulimall_ums.sql](https://www.yuque.com/attachments/yuque/0/2021/sql/22137958/1629777380774-29f682f3-1bad-4bb1-962d-aff0af264db9.sql?_lake_card=%7B%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2021%2Fsql%2F22137958%2F1629777380774-29f682f3-1bad-4bb1-962d-aff0af264db9.sql%22%2C%22name%22%3A%22gulimall_ums.sql%22%2C%22size%22%3A14541%2C%22type%22%3A%22%22%2C%22ext%22%3A%22sql%22%2C%22status%22%3A%22done%22%2C%22taskId%22%3A%22uddcd5a01-c7a0-49fd-864c-dcf7056999c%22%2C%22taskType%22%3A%22upload%22%2C%22id%22%3A%22uf1cd1c0f%22%2C%22card%22%3A%22file%22%7D)[gulimall_wms.sql](https://www.yuque.com/attachments/yuque/0/2021/sql/22137958/1629777381068-ffc0a6ab-1e94-4fde-b985-11685132b585.sql?_lake_card=%7B%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2021%2Fsql%2F22137958%2F1629777381068-ffc0a6ab-1e94-4fde-b985-11685132b585.sql%22%2C%22name%22%3A%22gulimall_wms.sql%22%2C%22size%22%3A9805%2C%22type%22%3A%22%22%2C%22ext%22%3A%22sql%22%2C%22status%22%3A%22done%22%2C%22taskId%22%3A%22u3fa33d95-51d5-4c01-bbbf-eca119ccda3%22%2C%22taskType%22%3A%22upload%22%2C%22id%22%3A%22ub1d9eb04%22%2C%22card%22%3A%22file%22%7D)<br />[gulimall_admin(renren自带).sql](https://www.yuque.com/attachments/yuque/0/2021/sql/22137958/1629782962328-29f406cb-b29a-49c4-8c49-29d2abfba65b.sql?_lake_card=%7B%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2021%2Fsql%2F22137958%2F1629782962328-29f406cb-b29a-49c4-8c49-29d2abfba65b.sql%22%2C%22name%22%3A%22gulimall_admin%28renren%E8%87%AA%E5%B8%A6%29.sql%22%2C%22size%22%3A18878%2C%22type%22%3A%22%22%2C%22ext%22%3A%22sql%22%2C%22status%22%3A%22done%22%2C%22taskId%22%3A%22u57807d8a-a12e-4aec-9452-0092cda6f6e%22%2C%22taskType%22%3A%22upload%22%2C%22id%22%3A%22uaabe1081%22%2C%22card%22%3A%22file%22%7D)

[如何正确使用本sql.md](https://www.yuque.com/attachments/yuque/0/2021/md/22137958/1629777381289-19d870d3-241c-4cc7-9423-168a9d0905e7.md?_lake_card=%7B%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2021%2Fmd%2F22137958%2F1629777381289-19d870d3-241c-4cc7-9423-168a9d0905e7.md%22%2C%22name%22%3A%22%E5%A6%82%E4%BD%95%E6%AD%A3%E7%A1%AE%E4%BD%BF%E7%94%A8%E6%9C%ACsql.md%22%2C%22size%22%3A1367%2C%22type%22%3A%22%22%2C%22ext%22%3A%22md%22%2C%22status%22%3A%22done%22%2C%22taskId%22%3A%22uf9376012-d209-4e19-a7a4-c0011ca8c72%22%2C%22taskType%22%3A%22upload%22%2C%22id%22%3A%22u9376a235%22%2C%22card%22%3A%22file%22%7D)

- 截至目前就已经创建好了各个微服务以及对应的数据库。**现在需要创建后台管理系统**来操作后台的各个服务,而且这个后台管理系统也是前后分离的。所以搭建后台管理系统需要前后端两个方面,这是一个繁重的工作。
- 所以就需要一个搭建好的脚手架工程,在自己做相关改造即可 。人人开源。

---

<a name="FOt7G"></a>
## 8、通过人人开源生成后台管理系统
参考:[https://gitee.com/renrenio](https://gitee.com/renrenio)<br />[人人开源简介.md](https://www.yuque.com/attachments/yuque/0/2021/md/22137958/1629806167417-e7f4d4b7-e86d-4783-93cf-3d67da52465c.md?_lake_card=%7B%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2021%2Fmd%2F22137958%2F1629806167417-e7f4d4b7-e86d-4783-93cf-3d67da52465c.md%22%2C%22name%22%3A%22%E4%BA%BA%E4%BA%BA%E5%BC%80%E6%BA%90%E7%AE%80%E4%BB%8B.md%22%2C%22size%22%3A3328%2C%22type%22%3A%22%22%2C%22ext%22%3A%22md%22%2C%22status%22%3A%22done%22%2C%22taskId%22%3A%22uda1cb9de-4293-4545-a537-99d94b870e2%22%2C%22taskType%22%3A%22upload%22%2C%22id%22%3A%22u335843c9%22%2C%22card%22%3A%22file%22%7D)
<a name="q3ccB"></a>
### 资源整理
后台管理系统:[https://gitee.com/renrenio/renren-fast](https://gitee.com/renrenio/renren-fast)<br />后台管理前端:[https://gitee.com/renrenio/renren-fast-vue](https://gitee.com/renrenio/renren-fast-vue)<br />这两块代码配合搭建成前后分离的后台管理系统

代码生成器:[https://gitee.com/renrenio/renren-generator](https://gitee.com/renrenio/renren-generator);    在线生成entity,xml,dao,service,vue,sql代码,减少开发工作量
<a name="dT7MJ"></a>
### 添加资源
<a name="eBmNx"></a>
##### 拷贝renren-fast和renren-fast-vue
![image.png](https://cdn.nlark.com/yuque/0/2021/png/22137958/1629791009250-fbc17ae4-2402-435f-9cb3-6e2d77b889d1.png#clientId=u359023c9-2c19-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=234&id=ube5529ae&margin=%5Bobject%20Object%5D&name=image.png&originHeight=468&originWidth=1031&originalType=binary&ratio=1&rotation=0&showTitle=false&size=248282&status=done&style=none&taskId=u10edaca6-0243-4845-b152-479b2950675&title=&width=515.5)

<a name="PSYbm"></a>
##### 删除文件夹中的.git(原创作者的git地址),并放置到gulimall工程目录下
<a name="xXyjO"></a>
### ![image.png](https://cdn.nlark.com/yuque/0/2021/png/22137958/1629778934758-34ea7dca-c7f6-46ef-b459-78140ad087b0.png#clientId=u359023c9-2c19-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=79&id=u4c9b89aa&margin=%5Bobject%20Object%5D&name=image.png&originHeight=157&originWidth=423&originalType=binary&ratio=1&rotation=0&showTitle=false&size=131966&status=done&style=none&taskId=u384d2fe5-d61e-4675-995a-2090d303533&title=&width=211.5)
![image.png](https://cdn.nlark.com/yuque/0/2021/png/22137958/1629779196796-c00971e9-91ae-4a23-a942-1a9cffcabb3a.png#clientId=u359023c9-2c19-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=275&id=uc82405c7&margin=%5Bobject%20Object%5D&name=image.png&originHeight=549&originWidth=1135&originalType=binary&ratio=1&rotation=0&showTitle=false&size=68216&status=done&style=none&taskId=u88c64dda-3237-4281-be55-6ebec81c4b8&title=&width=567.5)

<a name="d94Zr"></a>
### 搭建后台环境

1. 加入renren-fast这个后台服务后,需要再搭建其运行环境;创建出后台管理系统的数据库,利用db文件中的renren-fast/db/mysql.sql,复制全部,在navicat中创建数据库guli-admin,建立各个表。
1. 然后修改renren-fast的配置文件    

![image.png](https://cdn.nlark.com/yuque/0/2021/png/22137958/1629779864295-c671e288-5e3e-41a1-a74e-3aae823e32f6.png#clientId=u359023c9-2c19-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=305&id=uf83c5991&margin=%5Bobject%20Object%5D&name=image.png&originHeight=610&originWidth=1510&originalType=binary&ratio=1&rotation=0&showTitle=false&size=92877&status=done&style=none&taskId=u75b15b3f-5a9e-4060-a9d6-ed37c5f5dbf&title=&width=755)
<a name="Afgsw"></a>
### 搭建前台环境

- 前端工程需使用VScode,安装node.js。。下载node的同时也下载了他的包管理工具npm。NPM是随同NodeJS一起安装的包管理工具。JavaScript-NPM类似于java-Maven。
- 用VSCode打开renren-fast-vue(如果自己搭建的话),如果是运行完整的代码,可以去课件里找gulimall-admin-vue-app
```shell
1、安装node:http://nodejs.cn/download/ 选择windows下载。
    //镜像地址:https://npm.taobao.org/mirrors/node/



2、命令行输入node -v 检查配置好了,再配置npm的镜像仓库地址
node -v
npm config set registry http://registry.npm.taobao.org/


3、然后去VScode的项目终端中输入 npm install,是要去拉取依赖(package.json类似于pom.xml的dependency)
    版本信息都存储在package.json中,下载的依赖都存储与node_modules中
遇到的问题
1、node.js版本过高,改成10即可。python改成2.7

2、 node-sass 下载慢
npm i node-sass --sass_binary_site=https://npm.taobao.org/mirrors/node-sass/

9、逆向工程开发

利用代码生成器,来完成逆向工程开发

修改renren-generator的模板

修改renren-generator数据库配置

确定由哪个数据库进行逆向。由已有的数据库中的数据来反向填入之前搭建的后台管理系统,再由后台管理系统生产对应的后端代码
image.png

  • 其他服务也要修改数据库名字

    修改generator.properties的其他配置

    根据此配置文件得到逆向出的代码的目录结构,下面是给商品服务生产代码,接着会在此对优惠服务等其他微服务逆向生成代码,和下面类似。p19。 ```shell

    主目录

    mainPath=com.atguigu

    包名

    package=com.atguigu.gulimall

    模块名 和之前设置的模块名保持一致

    moduleName=gulimall-product

    作者

    author=hh

    email

    email=55333@qq.com

表前缀(类名不会包含表前缀) # 我们的pms数据库中的表的前缀都pms

如果写了表前缀,每一张表对于的javaBean就不会添加pms_前缀

tablePrefix=pms_


   - 其他服务也要修改模块名和表的前缀名
   - ![image.png](https://cdn.nlark.com/yuque/0/2021/png/22137958/1629953719397-c6f4f869-3e2a-4815-b7da-305f0358478a.png#clientId=u01f6f6e3-7663-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=234&id=ub704f3ec&margin=%5Bobject%20Object%5D&name=image.png&originHeight=467&originWidth=1137&originalType=binary&ratio=1&rotation=0&showTitle=false&size=53476&status=done&style=none&taskId=uc5660e25-bc55-417f-8e89-0b05f744a69&title=&width=568.5)
<a name="xrBgl"></a>
#### 根据自身需求进行相关删改
<a name="uGWQH"></a>
###### 在此项目中因为后期用的是spring-security,所以去除shrio注解,修改controller模板如下:
![image.png](https://cdn.nlark.com/yuque/0/2021/png/22137958/1629805320522-c3962feb-e505-4ea3-8b1b-1f52b743d79a.png#clientId=u359023c9-2c19-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=210&id=x821A&margin=%5Bobject%20Object%5D&name=image.png&originHeight=420&originWidth=598&originalType=binary&ratio=1&rotation=0&showTitle=false&size=22649&status=done&style=none&taskId=ua979706a-58cf-458f-88d0-cc53aa5eb86&title=&width=299)<br />去除shrio注解()<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/22137958/1629802244198-43a4db19-0a2f-4dc0-b1c8-5c23c28c7ba8.png#clientId=u359023c9-2c19-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=150&id=XNBsk&margin=%5Bobject%20Object%5D&name=image.png&originHeight=300&originWidth=1039&originalType=binary&ratio=1&rotation=0&showTitle=false&size=38839&status=done&style=none&taskId=ua1e7db99-fada-475d-81df-ed80f9c1c39&title=&width=519.5)

---

<a name="o70VI"></a>
### 导入代码至工程中
![image.png](https://cdn.nlark.com/yuque/0/2021/png/22137958/1629793683312-1f6d3c2d-7940-4e88-90cb-4f4cfc716e07.png#clientId=u359023c9-2c19-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=495&id=u6dcacc67&margin=%5Bobject%20Object%5D&name=image.png&originHeight=989&originWidth=2123&originalType=binary&ratio=1&rotation=0&showTitle=false&size=187440&status=done&style=none&taskId=u40518222-3f15-4638-b457-0b69c1185c3&title=&width=1061.5)<br />导入生产的代码后会报错,因为这些java代码缺少工具类,依赖,如MybatisPlus,lombok...,这需要程序员根据自己的业务需求来进行合适的增减。**缺少的依赖需要一个common模块。**<br />这是刚拷贝进工程的代码,存在大量的缺失或冗余。如下图:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/22137958/1629795091013-2b2201bb-b971-4569-b824-35f5dc7b5ba4.png#clientId=u359023c9-2c19-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=297&id=QJqNt&margin=%5Bobject%20Object%5D&name=image.png&originHeight=594&originWidth=694&originalType=binary&ratio=1&rotation=0&showTitle=false&size=41924&status=done&style=none&taskId=uc84ff19b-7d03-4396-b633-06f197b2fec&title=&width=347)<br />总之什么报错就去fast里面找。重启逆向工程。重新在页面上得到压缩包。重新解压出来,不过只把里面的controller复制粘贴到product项目对应的目录就行。

---

<a name="phWAi"></a>
### 创建common模块并对脚手架进行修改
创建一个maven模块common来进行工具类或依赖的共享;加上缺少的依赖,去除不需要的依赖,因为自己的工程中这部分可能要采用自定义的功能。<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/22137958/1629796079322-bd86bfa6-6059-4ee8-aed4-ea49cf8ab85e.png#clientId=u359023c9-2c19-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=121&id=e9qLB&margin=%5Bobject%20Object%5D&name=image.png&originHeight=161&originWidth=611&originalType=binary&ratio=1&rotation=0&showTitle=false&size=8626&status=done&style=none&taskId=uad95fd4d-2b50-43d6-ae92-2d160a462d1&title=&width=458)<br />在common的pom.xml中来配置每一个微服务缺少的工具类和依赖,并在各个微服务中加上下面代码,让其xml从属于common.xml。<br />各个微服务的pom.xml:
```xml
    <dependencies>
        <dependency>
            <groupId>com.atguigu.gulimall</groupId>
            <artifactId>gulimall-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

common的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>guli-mall</artifactId>
        <groupId>com.zsy</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>mall-common</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpcore</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

<!--        <dependency>-->
<!--            <groupId>org.hibernate</groupId>-->
<!--            <artifactId>hibernate-validator</artifactId>-->
<!--            <version>5.0.2.Final</version>-->
<!--        </dependency>-->

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <exclusions>
              <exclusion>
                <groupId>com.google.code.findbugs</groupId>
                <artifactId>jsr305</artifactId>
              </exclusion>
              </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.1.Final</version>
        </dependency>
    </dependencies>
</project>

之后的微服务开发,就只需要common这个通用服务,再结合代码生成器逆向出基本代码(这些代码包括增删改查,分页,保存等)即可。
也可以在此模板的基础上进行自定义修改,以此来快速完成开发任务
image.png


10、整合MyBatis-Plus

接下来开始对各个微服务进行启动,并测试。先导入mybatisPuls,再修改各个数据源。

导入依赖

<!-- mybatisPLUS-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.3.2</version>
</dependency>

配置

  • 配置数据源
    • 导入数据库驱动,由于所有微服务都需要数据库驱动,所以把此部分加入common中 ```xml mysql mysql-connector-java 8.0.17
javax.servlet servlet-api 2.5 provided - 在resources中新建application.yaml配置数据源yaml spring: datasource: username: root password: root url: jdbc:mysql://192.168.56.10:3306/gulimall-pms driver-class-name: com.mysql.jdbc.Driver - 配置MybatisPlus相关信息 - 使用@mapperscan,扫描mybatis的mapper(由于相关mapper文件都加上了@mapper注解,所以此步可以省略) - ![image.png](https://cdn.nlark.com/yuque/0/2021/png/22137958/1629871170121-6b47217a-8a49-44cf-8998-c2872ca4aa50.png#clientId=u404f43da-f226-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=166&id=ua53aca40&margin=%5Bobject%20Object%5D&name=image.png&originHeight=332&originWidth=440&originalType=binary&ratio=1&rotation=0&showTitle=false&size=24869&status=done&style=none&taskId=ue739089e-014e-4411-b2d4-fc29496ebd7&title=&width=220) - ![image.png](https://cdn.nlark.com/yuque/0/2021/png/22137958/1629858548380-d341d1af-272a-41a5-912a-227cd7d9f6e5.png#clientId=u404f43da-f226-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=169&id=u19e9e7c0&margin=%5Bobject%20Object%5D&name=image.png&originHeight=337&originWidth=1181&originalType=binary&ratio=1&rotation=0&showTitle=false&size=33487&status=done&style=none&taskId=u890f06f5-bc8c-4607-b923-d00e192f8c9&title=&width=590.5) - sql文件位置告诉mybatisplus映射文件xml都在哪里,同样在application.yaml中添加 - ![image.png](https://cdn.nlark.com/yuque/0/2021/png/22137958/1629871203727-c067016f-1a4a-4a76-b0d1-01abd8f76368.png#clientId=u404f43da-f226-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=213&id=uacf04b2c&margin=%5Bobject%20Object%5D&name=image.png&originHeight=426&originWidth=683&originalType=binary&ratio=1&rotation=0&showTitle=false&size=44030&status=done&style=none&taskId=u3783dfb1-93f4-4571-97b8-76d3d8c010f&title=&width=341.5)yaml # MapperScan # sql映射文件位置 mybatis-plus: mapper-locations: classpath:/mapper//*.xml //数据映射位置 global-config: db-config: id-type: auto //设置主键自增 各个微服务的yaml文件大部分内容是相同的,接下来给各个微服务配置不同的端口。也是在此properties.yml中填写。xml server: port: 9000 //给之后的微服务设置不同端口 ``` —- ## 11、SpringCloud配置
-
注册中心:分布式中,每种微服务上线都需要把其在注册中心注册,订单服务调用商品服务,就可以重注册中心中查询哪些机器商品服务已注册。查询到结果后订单服务就可以调用已注册的商品服务 - 配置中心:集中管理配置。商品服务从配置中心获取配置,配置中心修改配置,其他服务都要修改 - 网管:前端通过网关处理请求,请求在网关进行健全、过滤、路由等,由网关把请求给各个服务 - 这三个服务通过SpringCloud.Alibaba进行配置 image.png —- ### SpringCloud.Alibaba介绍 #### 简介 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用 微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布 式应用服务。 依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用 接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
https://github.com/alibaba/spring-cloud-alibaba
#### 为何使用 image.png #### 版本选择 image.png —- ### SpringCloud.Alibaba使用 #### 引入依赖 xml 在 common 项目中引入如下。进行统一管理 <dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> ### Nacos-[作为注册中心]
#### 使用SpringCloud Alibaba-Nacos[作为注册中心] 步骤 Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理 平台。他是使用 java 编写。需要依赖 java 环境 Nacos 文档地址: https://nacos.io/zh-cn/docs/quick-start.ht
1. 在common的pom.xml中修改 pom.xml 文件,引入 Nacos Discovery Starter xml <!-- 服务注册/发现--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> 2. 在各个微服务的 /src/main/resources/application.properties 配置文件中配置 Nacos Server 地址 ,也就是在注册中心注册 1. 但是此时还没有nacos server的地址,也就是还没有注册中心,所以我们要先下载nacos server。 1. 下载后cmd到下载目录,启动脚本,
运行nacos开启注册中心;之后的各个微服务的注册都要提前开启nacos! 1. image.png 3. 这时再在微服务中指定注册中心地址和显示注明微服务名 image.png 3. 把各个微服务注册到注册中心, 使用@EnableDiscoveryClient 开启服务注册发现功能 1. 在启动类GulimallCouponApplication上加上注解 java @SpringBootApplication @EnableDiscoveryClient public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 4. 启动应用后,在地址栏输入:http://127.0.0.1:8848/nacos,观察 nacos 服务列表是否已经注册上服务 下面是开启了三个微服务的列表
image.png —- #### 微服务间的远程调用 如会员想从优惠券模块中获取当前会员领取的到的所有优惠券,则会员服务会先在注册中心中查询优惠券服务都在哪些机器,会员服务得到返回后再从此结果中选择要访问的机器。
这就要使用到
Feign。 ### Feign 声明式远程调用 #### Feign简介 Feign 是一个声明式的 HTTP 客户端,它的目的就是让远程调用更加简单。Feign 提供了 HTTP 请求的模板,通过编写简单的接口和插入注解,就可以定义好 HTTP 请求的参数、格式、地 址等信息。
Feign 整合了 Ribbon(负载均衡)和 Hystrix(服务熔断),可以让我们不再需要显式地使用这 两个组件。
SpringCloudFeign 在 NetflixFeign 的基础上扩展了对 SpringMVC 注解的支持,在其实现下,我 们只需创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定。简化了 SpringCloudRibbon 自行封装服务调用客户端的开发量
#### Feign使用 java 总体步骤 /* * 想要远程调用的步骤: * 1 引入openfeign * 2 编写一个接口,接口告诉springcloud这个接口需要调用远程服务 * 2.1 在每个接口中声明每一个方法都是调用哪个远程服务的哪个请求;哪个远程服务用@FeignClient,哪个请求用 @RequestMapping * 2.2 要调用coupon服务的/coupon/coupon/member/list方法 * 3 开启远程调用功能 @EnableFeignClients,要指定远程调用功能放的基础包 * */ 1. 若会员服务想要调用优惠券服务,那么就可以在会员服务中引入Feign,这样就让其具备了调用其他服务的能力 xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> 2. 编写接口 image.png 1. 这里是测试,我们在Couponcontroller中编写了membercoupons方法,数据也是临时创建,并没有从数据库中查询。R是全系统的所有返回都可以返回R,是一个工具类。 image.png 2. 在接口上加上@FeignClient(“gulimall-coupon”),告诉此接口要调用gulimall-coupon服务;在接口中添加具体的调用内容,这部分只需写上controller中的方法签名 java //告诉spring cloud这个接口是一个远程客户端,将要调用gulimall-coupon服务.(此服务名是在nacos服务列表中找到,之前在application.properties中配置) @FeignClient("gulimall-coupon") public interface CouponFeignService { // 远程服务的url。 这块可以从coupon的controller中把方法签名复制过来 //具体是调用gulimall-coupon服务的/coupon/coupon/member/list对应的方法 //注意写全路径地址,别少了@RequestMapping中的前缀 //注意我们这个地方不是控制层,所以这个请求映射请求的不是我们服务器上的东西,而是nacos注册中心的 @RequestMapping("/coupon/coupon/member/list") public R membercoupons();//得到一个R对象 //如此一来,之后要调用membercoupons(),就会在注册中心中寻找:@FeignClient("gulimall-coupon") //再去调用@RequestMapping("/coupon/coupon/member/list")对应的方法 } 3. 开启远程调用功能, 在启动类上加上@EnableFeignClients,并且指定远程调用的接口包 1. 服务已启动就会扫描这个包,以及各个接口,各个请求 image.png - 接下来在MemberController中进行测试;引入接口;编写测试类 image.png - 通过地址:http://localhost:7000/member/member/coupons让member服务进行coupon服务的调用 image.png —- ### Nacos-[作为配置中心] #### 基本操作 ```java /
1、如何使用Nacos作为配置中心统一管理配置 1)、引入依赖, com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config *
 * 2)、创建一个bootstrap.properties。此文件优先级高于application.propertis加载。并在其中配置 Nacos Config元数据如下:
 *      spring.application.name=gulimall-coupon
 *      spring.cloud.nacos.config.server-addr=127.0.0.1:8848        #此地址和注册中心地址相同


 * 3)、需要给配置中心默认添加一个叫 数据集(Data Id)gulimall-coupon.properties。默认规则,应用名.properties

 * 4)、给 应用名.properties 添加任何配置


 * 5)、动态获取配置。
 *      @RefreshScope:动态获取并刷新配置
 *      @Value("${配置项的名}"):获取到配置。
 *      如果配置中心和当前应用的配置文件中都配置了相同的项,优先使用配置中心的配置。
![image.png](https://cdn.nlark.com/yuque/0/2021/png/22137958/1630067827485-aadb86df-9c97-404d-8898-530533586aa2.png#clientId=u2a7f906b-5aad-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=368&id=u79c319b2&margin=%5Bobject%20Object%5D&name=image.png&originHeight=736&originWidth=1648&originalType=binary&ratio=1&rotation=0&showTitle=false&size=280485&status=done&style=none&taskId=ub57f4e52-1d8a-43b4-9102-f5c62098e2f&title=&width=824)

---

<a name="fC0M6"></a>
#### 命名空及配置
```xml
* 2、细节
 *  1)、命名空间:用于配置隔离;
 *      默认:public(保留空间);默认新增的所有配置都在public空间。
 *      1、开发,测试,生产:利用命名空间来做环境隔离。
 *         注意:在bootstrap.properties;配置上,需要使用哪个命名空间下的配置,
 *         spring.cloud.nacos.config.namespace=9de62e44-cd2a-4a82-bf5c-95878bd5e871
 *      2、每一个微服务之间互相隔离配置,每一个微服务都创建自己的命名空间,只加载自己命名空间下的所有配置
 *
 *  2)、配置集:所有的配置的集合
 *
 *  3)、配置集ID:类似文件名。
 *      Data ID:类似文件名
 *
 *  4)、配置分组:
 *      默认所有的配置集都属于:DEFAULT_GROUP;
 *      1111,618,1212
 *
 * 项目中的使用:每个微服务创建自己的命名空间,使用配置分组区分环境,dev,test,prod
 *
  1. 基于开发环境进行配置隔离

image.png

  1. public和product中有相同的配置,默认情况下是使用public中的properties,若在bootstrap.properties中显示配置后,则会切换名称空间,使用其空间下配置的properties。

image.png
image.png

  1. 除了制定每个命名空间的配置id,还可以对同一命名空间下的同名properties进行分组定位。

image.png

  1. 并在bootstrap.properties中配置分组

image.png

  1. 基于微服务进行配置隔离,为每个微服务创建自己的命名空间

image.png


加载多配置集

 * 3、同时加载多个配置集
 * 1)、微服务任何配置信息,任何配置文件都可以放在配置中心中

 * 2)、只需要在bootstrap.properties说明加载配置中心中哪些配置文件即可

 * 3)、@Value,@ConfigurationProperties等,以前SpringBoot任何方法从配置文件中获取值,都能使用。
 * 配置中心有的优先使用配置中心中的,
 *
  • 之前的配置写在了application.yml中,如下:

image.png

  • 这些配置可以打散,分布在配置中心中

image.png

  • 再通过bootstrap.properties把这些配置写入

image.png

  • 这么做的目的是可以直接在配置中心修改,加载时优先加载处于配置中心中的配置

image.png


 * 3、同时加载多个配置集
 * 1)、微服务任何配置信息,任何配置文件都可以放在配置中心中
 * 2)、只需要在bootstrap.properties说明加载配置中心中哪些配置文件即可
 * 3)、@Value,@ConfigurationProperties。。。
 * 以前SpringBoot任何方法从配置文件中获取值,都能使用。
 * 配置中心有的优先使用配置中心中的,
 *
 */

网关

参考手册:https://cloud.spring.io/spring-cloud-gateway/2.2.x/reference/html/
image.png
image.png

如何使用网关

  1. 引入网关依赖

    • 网关也要依赖注册中心和配置中心,所以要继承于common模块中的注册中心和配置中心的配置;同时网关模块引入网关依赖 ```xml

      com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery org.springframework.cloud spring-cloud-starter-netflix-ribbon org.springframework.cloud spring-cloud-loadbalancer 2.2.2.RELEASE
    <!--        配置中心来做配置管理-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>

org.springframework.cloud spring-cloud-starter-gateway


2. 配置相关文件
- 在gateway服务中开启注册服务发现@EnableDiscoveryClient,配置nacos注册中心地址applicaion.properties。
- 在application.properties中进行注册中心的配置;在bootstrap.properties中进行配置中心的配置
```yaml
注册中心:
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=gulimall-gateway
server.port=88

---------------------------------------------------------------
配置中心:
spring.application.name=gulimall-gateway
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=ce7b6bef-4e25-4d24-a527-d3aff4a3a343
  1. 注意
    1. 多个断言同时存在于一个路由时,请求必须同时满足所有条件才能被这个路由匹配