3.项目环境
在这里我们使用的是 Linux 虚拟机来进行搭建这个项目,所以我们选用的是 VirtualBox 里搭建 CentOS 7 。 另外我们没有手动手打搭建 CentOS 7 , 而是采用 vagrant 帮我们自动搭建虚拟机的 Linux 环境。因为 vagrant 能为我们提供便捷,而且容易部署。
3.1.Linux 安装
3.1.1.VirtualBox 安装
- VirtualBox 下载地址
-
- 下载完成后,一键傻瓜式安装
3.1.2. vagrant 安装
vagrant是一个工具,用于创建和部署虚拟化开发环境的。
拿VirtualBox举例,VirtualBox会开放一个创建虚拟机的接口,Vagrant会利用这个接口创建虚拟机,并且通过Vagrant来管理,配置和自动安装虚拟机。
常见命令
| 命令 | 解释 |
|---|---|
| vagrant box list | 查看目前已有的box |
| vagrant box add | 新增加一个box |
| vagrant box remove | 删除指定box |
| vagrant init | 初始化配置vagrantfile |
| vagrant up | 启动虚拟机 |
| vagrant ssh | ssh登录虚拟机 |
| vagrant suspend | 挂起虚拟机 |
| vagrant reload | 重启虚拟机 |
| vagrant halt | 关闭虚拟机 |
| vagrant status | 查看虚拟机状态 |
| vagrant destroy | 删除虚拟机 |
- vagrant 下载地址 :https://www.vagrantup.com/downloads.html
- 下载
- 一键傻瓜式安装
- 安装完成后,需要重启电脑。 重启之后,我们可以通过命令行输入
vagrant检验自己是否安装成功
3.1.3 安装 CentOS 7
https://app.vagrantup.com/boxes/search
- 我们到 vagrant 官网查看自己需要安装的镜像。
- 命令行输入
vagrant init centos/7
这一步会为我们在 系统硬盘 下的当前用户下新建一个 Vagrantfile 文件

-
命令行输入
vagrant up这一步会自动帮我们下载 CentOS 镜像, 需要等待非常漫长的一段时间。
-
**启动 Linux 系统,命令行输入
vagrant ssh**经过漫长的等待,此时我们已经通过
vagrant安装了Linux系统了,在安装系统时,vagrant 已经帮我们搭建好了 SSH 环境,我们通过vagrant ssh就可以连接上 Linux 系统了。
-
为了避免我们每次都要配置端口转发, vagrant 也有配置,为我们实现端口转发的功能
、
此时我们只需要打开 vagrantfile文件,

然后找到这一行 ,将注释打开,然后将 private_network 的 IP 地址改为 与 VirtualBox Host-Only Network 的ip地址同一个网段 即可

<img src=https://typora-1301918612.cos.ap-guangzhou.myqcloud.com/undefined/202005/23/111004-560724.png" alt=“image-20200430145937912” style=“zoom:67%;” />
-
修改成功后,重启虚拟机,然后再查询 虚拟机的IP地址

此时的 IP 地址 已经式我们自己设置的 IP地址了
3.2 Docker 安装
3.2.1 Docker 是什么
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
3.2.1.1 Docker的应用场景
- Web 应用的自动化打包和发布。
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
- 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
3.2.1.2 Docker 的优点
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
1、快速,一致地交付您的应用程序
Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。
容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:
- 您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
- 他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
- 当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
- 测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
2、响应式部署和扩展
Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
3、在同一硬件上运行更多工作负载
Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。
3.2.2 Docker 安装
关于 Docker 如何安装,Docker的官网已经有为我们提供说明文档
需要注意的是:我们使用的vagrant 安装的Linux系统,那么我们使用的是vagrant为我们提供的 用户,而不是 root 用户。
-
Older versions of Docker were called
dockerordocker-engine. If these are installed, uninstall them, along with associated dependencies.旧版本的Docker 叫做
docker或者docker-engine,如果你安装了他们,请先卸载,保持一个独立的依赖环境。$ sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
-
SET UP THE REPOSITORY
Install the
yum-utilspackage (which provides theyum-config-managerutility) and set up the stable repository.安装
yum-utils, 设置稳定的存储库。$ sudo yum install -y yum-utils $ sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo -
Start Docker.
启动 Docker 容器
$ sudo systemctl start docker -
Docker 容器开机自启动
$ sudo systemctl enable docker
3.2.3 阿里云镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://cubt013e.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
在 Linux 中依次输入这四条命令,即可通过阿里云为我们加速下载 Docker 容器
3.3 Docker 安装MySQL
3.3.1 下载 MySQL 镜像
利用 Docker 下载镜像时非常的简单,我们只需要去到Docker Hub 的官网找到我们需要下载的镜像以及对应的版本
然后利用在 Linux 命令行中输入 docker pull mysql:5.7 (docker pull 镜像软件名:版本号)
通过命令 docker images 可以检查是否已经安装成功
3.3.2 创建一个 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
docker run -p 3306:3306 --restart always --name mymysql -v /etc/localtime:/etc/timezone:rw -v /etc/localtime:/etc/localtime:rw -e MYSQL_ROOT_PASSWORD=asdf@#123 -d mysql:5.6 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
检查是否创建实例成功,可以使用命令 docker ps

参数说明
docker run : 创建一个 docker 实例
--name: 为创建的容器取一个名字,这个名字是自己定义容器的唯一标识
-p 3306:3306: 宿主机的3306端口映射到了虚拟机的3306端口
-v /主机文件夹: docker容器文件夹 当docker容器所创建了文件时,通过主机可以 直接的访问
-V /mydata/mysql/conf:/etc/mysql:将配置文件夹挂载到主机
-v /mydata/mys/log:/var/log/mysgl:将日志文件夹挂载到主机
-v /mydata/mysql/data:/var/ib/mysgl/:将配置文件夹挂载到主机
-e MYSQL_ ROOT_ PASSWORD=root: 初始化root用户的密码
-d mysql:5.7
3.3.3 修改配置文件
vi /mydata/mysql/conf/my.cnf进入 vi 编辑器- 写入一下内容
[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
collection-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
- 重启 mysql
docker restart mysql
-
mysql 在虚拟机启动时,自启动
docker update mysql --restart=always
3.4 Docker 安装 redis
3.3.1下载redis镜像
命令:docker pull redis
redis我们直接下载最新版本的即可

3.3.2 创建一个 redis 实例并启动
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
为了避免``/mydata/redis/conf下的conf `不存在,而被认为是一个目录,我们提前创建好文件夹
3.3.3 测试 redis 是否安装成功
命令:dockers exec -it redis redis-cli

3.3.4 开启AOF的持久化方式保存
进入配置文件文件 vi /mydata/redis/conf/redis.conf ,输入下面内容
appendonly yes
3.3.5 redis 自启动
docker update redis --restart=always
3.5 安装 VS code
安装vs code 以及插件
3.6 安装 Git
3.6.1 下载git
git官网 由于下载速度太慢了,建议使用下面的链接进行下载
https://npm.taobao.org/mirrors/git-for-windows/
3.6.2 配置git
配置git,进入git bash配置作者的信息
git config --global user.name "username" //双引号下的username为自己设置
git config --global user.email "949010354@qq.com"
3.6.4 配置ssh免密登录
- 进入 git bash; 使用:
ssh-keygen -t rsa -C "949010354@qq.com", 然后连续三次回车

-
查看完整的密钥 ; 使用
cat ~/.ssh/id_rsa.pub -
登录码云

-
使用
ssh-T git@gitee.com

3.7 码云 新建仓库
- 新建一个仓库
- 克隆项目到IDEA中
3.8 创建项目微服务
微服务包括有 商品服务(product)、仓储服务(ware)、订单服务(order)、优惠券服务(coupon)、会员服务(member)
-
通过 spring initializr 进行创建微服务,每个微服务都导入 web、openfeign 场景
-
每一个服务都按照一定的规范:

包名: com.mxc.mxcmall 模块名: mxcmall-member3.最终结果
<description>mxc商城-聚合服务</description>
<packaging>pom</packaging>
<modules>
<module>mxcmall-member</module>
<module>mxcmall-coupon</module>
<module>mxcmall-order</module>
<module>mxcmall-product</module>
<module>mxcmall-ware</module>
</modules>
3.9 将mxcmall 设为总项目,聚合所有子项目
- 修改
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.mxc.mxcmall</groupId>
<artifactId>mxcmall</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mxcmall</name>
<description>mxc商城-聚合服务</description>
<packaging>pom</packaging>
<modules>
<module>mxcmall-member</module>
<module>mxcmall-coupon</module>
<module>mxcmall-order</module>
<module>mxcmall-product</module>
<module>mxcmall-ware</module>
</modules>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR4</spring-cloud.version>
</properties>
</project>
-
添加 maven 项目
-
忽略提交到Git上的垃圾文件,例如 每个项目编译出来的 target 文件、.gitignore版本控制文件,都不需要提交到git。
那我们可以在跟项目下的 .gitignore 加入下面内容
**/mvnw
**/mvnw.cmd
**/.mvn
**/target/
.idea
**/.gitignore
-
将需要提交的文件纳入版本控制
-
提交代码至 码云

3.10 数据库初始化
- 我们在初始化数据库时,选择每一个子项目微服务都对应有自己的一个数据库。创建数据库时,我们都以
mxcmall_pms,mxcmall_oms的格式进行命名,pms代表 produce manager system。基字符集我们选用 utf8mb4 的字符集, 它不但能兼容 uft-8 ,还能解决一些乱码问题。

-
创建各个微服务的数据库
2.1 商品数据库

2.2 库存数据库
2.3 用户数据库

2.4 订单数据库

2.5 优惠券/营销数据库

3.11 快速开发搭建—后端
为了能有一个快速开发的环境,我们使用开源的项目作为我们的一个脚手架,我们不需要为自己做许多繁杂的事情。在这里我们使用码云行的一个 人人开源的项目 https://gitee.com/renrenio
暂时,我们先使用这两个项目
3.11.1 克隆项目
git clone https://gitee.com/renrenio/renren-fast.git
git clone https://gitee.com/renrenio/renren-fast-vue.git

3.11.2 使用开源项目
-
将克隆的两个开源项目的
.git文件夹删除,该文件夹是默认隐藏的,需要显示隐藏,然后再删除。 -
将
renren-fast文件夹移动到 项目的 目录下。 -
将
renren-fast加入到到模块中,根目录的pom.xml文件
-
创建与后台控制相关的数据库,数据库表的创建代码在
renren-fast下的db文件夹中已经存在了。 -
修改
application-dev.yml配置文件

3.12 快速开发搭建—前端
- 前端开发少不了node.js, Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。但我们只需要关注 node.js 的 npm 功能。NPM 随同 Node JS 一起安装的包管理工具。
- 官网下载并安装 node.js ,并通过命令行 node -v 检查版本
- 配置 npm ,使用淘宝镜像
npm config set registry http://registry.npm.taobao.org/ - 第一次运行npm时,需要在 vs code 控制中输入
npm install - 在这里可能会出现 node-sass 安装失败, 使用命令
npm i node-sass --sass_binary_site=https://npm.taobao.org/mirrors/node-sass/单独安装 node-sass。 - 然后在使用
npm run dev就可以通过前后端进行联调操作。


- 浏览器访问 http://localhost:8001/#/login ,账号:admin, 密码:admin
3.13 快速开发—逆向工程
-
从 码云中克隆项目,代码生成器,
git clone https://gitee.com/renrenio/renren-generator.git -
删除克隆项目中的
.git文件夹,并放在项目之下 -
修改
application.yml配置文件下的url地址,它可以为根据数据库自动生成实体类。 -
修改
generator.properites配置文件
-
启动generator项目,并访问 http://localhost/
-
在菜单栏左右有一个 选项为 renren-fast ,然后自动生成所有代码
-
将压缩包中的 main 解压到对应 微服务中的main 文件中
-
自动生成的代码中,有许多是还不能使用的,因为缺乏一些工具类。所以我们可以通过maven的方式进行引入。
-
创建一个新的module, 为mxcmall-common, 我们希望每一个公共的类和依赖都放在 mxcmall-common中,然后每一个微服务都来访问这个模块
-
每个微服务都依赖mxcmall-common
<dependency> <groupId>com.mxc.mxcmall</groupId> <artifactId>mxcmall-common</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> -
为 mxcmall-common 中加入每个微服务需要用上的公共依赖。
-
导入mybatis-plus 依赖,详细 使用可以看官网文档: https://mp.baomidou.com/guide/install.html
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.1.tmp</version> </dependency> -
导入 lombok 依赖,它能简化我们 JavaBean的开发。
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>provided</scope> </dependency
3.导入 httpcomponents 依赖
-
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.13</version>
</dependency>
-
导入 commons-lang 依赖
<dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> -
导入 servlet 相关的依赖
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
- 从 renren-fast 中复制需要导入的公共类到mxcmall-common 中。
- 修改 renren-generator 中的 template 模板的 controller ,将
@RequiresPermissions注释,因为我们暂时不需要用到权限管理。 - 重新自动生成代码,并导入到项目中。
3.14 快速开发— crud 使用测试
-
导入 mybatis-plus 相关的依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.1.tmp</version> </dependency> -
配置数据源,导入数据库驱动的相关依赖

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
-
配置数据源,推荐使用
application.yml文件spring: datasource: username: root password: root url: jdbc:mysql://192.168.56.10:3306/mxcmall_pms driver-class-name: com.mysql.cj.jdbc.Driver -
配置 Mybatis-plus
- 扫描dao包: 在主项目下加注释:
@MapperScan("com.mxc.mxcmall.product.dao") - 告诉mybatis-plus, sql 的映射文件的具体位置
- 扫描dao包: 在主项目下加注释:
3.15 分布式组件简介:
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
3.15.1 主要功能
- 服务限流降级:默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
- 服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
- 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
- 消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
- 分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。。
- 阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
- 分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
- 阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
3.15.2 组件
Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
Dubbo:Apache Dubbo™ 是一款高性能 Java RPC 框架。
Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。
Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。
Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
3.15.3 如何引入依赖
如果需要使用已发布的版本,在 dependencyManagement 中添加如下配置。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
然后在 dependencies 中添加自己所需使用的依赖即可使用。
3.15.4 版本规范:
项目的版本号格式为 x.x.x 的形式,其中 x 的数值类型为数字,从 0 开始取值,且不限于 0~9 这个范围。项目处于孵化器阶段时,第一位版本号固定使用 0,即版本号为 0.x.x 的格式。
由于 Spring Boot 1 和 Spring Boot 2 在 Actuator 模块的接口和注解有很大的变更,且 spring-cloud-commons 从 1.x.x 版本升级到 2.0.0 版本也有较大的变更,因此我们采取跟 SpringBoot 版本号一致的版本:
- 1.5.x 版本适用于 Spring Boot 1.5.x
- 2.0.x 版本适用于 Spring Boot 2.0.x
- 2.1.x 版本适用于 Spring Boot 2.1.x
- 2.2.x 版本适用于 Spring Boot 2.2.x
3.15.5 我们的分布式组件选择:
- 结合Spring Cloud Alibaba ,我们最终的技术搭配方案:
- SpringCloud Alibaba - Nacos: 注册中心(服务发现/注册)
- SpringCloud Alibaba - Nacos: 配置中心(动态配置管理)
- Spring Cloud - Ribbon : 负载均衡
- Spring Cloud - Feign :声明式HTTP客户端(调用远程服务)
- Spring Cloud Alibaba - Sentinel:服务容错(限流、降级、熔断)
- Spring Cloud - Gateway: API网关(webflux编程模式)
- Spring Cloud - Sleuth: 调用链监控
- Spring Cloud Alibaba - Seata: 原 Fescar, 即分布式事务解决方案
3.16 Nacos 作为注册中心
Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
- 下载 nacos-server :https://github.com/alibaba/nacos/releases
- 修改 pom.xml 文件,引入 Nacos Discovery Starter 依赖。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
-
在应用的 /src/main/resources/application.properties 配置文件中配置 Nacos Server 地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 -
在主项目类中 使用 @EnableDiscoveryClient 注解开启服务注册与发现功能
-
启动 nacos-server 服务器,并在浏览器 中访问 127.0.0.1:8848/nacos/, 进入到登录页面,默认的账号密码是nacos。
-
此时还没有服务注册进来,需要自己添加需要注册的微服务

-
在配置文件中,为每一个微服务去上一个别名:
spring.application.name=mxcmall-coupon -
此时在回到可视化页面,我们可以看到已经有服务了,其中如果 服务在运行状态时,触发保护阈值为true,否则为false。

- 相同的的步骤,重复其他微服务。
3.17 OpenFeign 远程调用测试
-
OpenFeign是一种基于接口得编程方式,开发者只需要声明接口和配置注解,在调用接口方法时,Spring Cloud 就根据配置来调度对应的 REST 风格的请求,从其他微服务中获取数据。
-
使用OpenFeign 时,首先需要在产品微服务中导入 Maven 依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> -
引入open-feign
-
编写一个接口,告诉 spring cloud 这个接口需要调用远程服务,声明接口的方法对应某个远程服务的。
例如:下面是mxcmall-member 微服务中的一个接口,它使用了@FeignClient() 注释,当启动 Spring Boot 的启动文件时,就会扫描 包含 @FeignClient() 注解的接口。当我们调用 CouponFeignService() 这个方法时,Spring Cloud 就会帮我们到 “mxcmall-coupon” 这个微服务中,发送 “coupon/coupon/member/list” 请求。将返回值返回给这个方法。
@FeignClient("mxcmall-coupon")
public interface CouponFeignService {
@GetMapping("coupon/coupon/member/list")
public R memberCoupons();
}
- 为了启动 feign ,需要在Spring Boot 的启动文件中加入注解 @EnableFeignClient, 这个注解代表该项目会启动 Feign 客户端。启动文件如下所示:
@MapperScan("com.mxc.mxcmall.member.dao")
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.mxc.mxcmall.member.feign")
@SpringBootApplication
public class MxcmallMemberApplication {
public static void main(String[] args) {
SpringApplication.run(MxcmallMemberApplication.class, args);
}
}
-
两个测试方法如下
- mxcmall-member 微服务中的控制类
@RestController @RequestMapping("member/member") public class MemberController { @Autowired private MemberService memberService; @Autowired CouponFeignService couponFeignService; @GetMapping("/coupons") public R test(){ MemberEntity memberEntity = new MemberEntity(); memberEntity.setNickname("张三"); R memberCoupons = couponFeignService.memberCoupons(); return R.ok().put("member",memberEntity).put("coupons",memberCoupons.get("coupons")); }- mxcmall-coupon 微服务中的一个控制类
@RestController @RequestMapping("coupon/coupon") public class CouponController { @GetMapping("/member/list") public R memberCoupons(){ CouponEntity couponEntity = new CouponEntity(); couponEntity.setCouponName("满100-10元"); return R.ok().put("coupon",Arrays.asList(couponEntity)); } }- 当我们发送请求
http://localhost:8000/member/member/coupons时,服务器向我们响应的数据为

- 当我们在会员微服务中,调用 查询优惠券 的方法时,那么就应该要调用 优惠券微服务的数据库, 而会员微服务不存在该数据库,所以需要 feign 帮我们实现远程调用。
3.18 Nacos 作为配置中心
Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
- 首先,修改 pom.xml 文件,引入 Nacos Config Starter。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- 在应用的 /src/main/resources/bootstrap.properties 配置文件中配置 Nacos Config 元数据,这是 Spring boot 中规定的,如果配置文件中有 bootstrap.properties ,它会优先与 application.properties 被读取。
spring.application.name=nacos-config-example
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
- 编写一个测试类
@
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
@Value("${conpon.user.name}")
private String username;
@Value("${conpon.user.age}")
private String age;
@GetMapping("test")
public R test(){
return R.ok().put("name",username).put("age",age);
}
}
编写一个配置文件
conpon.user.name=zhangsan
conpon.user.age=18
4.发送请求 http://localhost:7000/coupon/coupon/test

-
当我们修改配置文件时,无法动态的修改请求时返回的值,我们都必须重新打包,然后再上线服务.这种操作会很麻烦,所以需要用到微服务中的配置中心,它能够帮我们实现实时的更新数据.
-
发送请求 http://127.0.0.1:8848/nacos , 在配置列表中添加一个新的配置
-
将配置文件中的信息都搬迁到这个配置中,并发布. 需要注意的时,Data ID 为 微服务名.properties,这是一个默认规则,否则该配置文件会不生效

-
在控制类中 标上注解 @RefreshScope , 动态获取,并刷新配置.
-
@value("${…}") 获取配置中的值,如果配置中心和配置文件中都配置了相同的项,那么优先使用配置中心的值.
885



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



