3.项目环境

在这里我们使用的是 Linux 虚拟机来进行搭建这个项目,所以我们选用的是 VirtualBox 里搭建 CentOS 7 。 另外我们没有手动手打搭建 CentOS 7 , 而是采用 vagrant 帮我们自动搭建虚拟机的 Linux 环境。因为 vagrant 能为我们提供便捷,而且容易部署。

3.1.Linux 安装

3.1.1.VirtualBox 安装

  1. VirtualBox 下载地址
  2. 下载完成后,一键傻瓜式安装

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 删除虚拟机

  1. vagrant 下载地址 :https://www.vagrantup.com/downloads.html
  2. 下载

  1. 一键傻瓜式安装
  2. 安装完成后,需要重启电脑。 重启之后,我们可以通过命令行输入 vagrant 检验自己是否安装成功

3.1.3 安装 CentOS 7

https://app.vagrantup.com/boxes/search

  1. 我们到 vagrant 官网查看自己需要安装的镜像。

  1. 命令行输入 vagrant init centos/7

这一步会为我们在 系统硬盘 下的当前用户下新建一个 Vagrantfile 文件

  1. 命令行输入 vagrant up

    这一步会自动帮我们下载 CentOS 镜像, 需要等待非常漫长的一段时间。

  2. **启动 Linux 系统,命令行输入 vagrant ssh **

    经过漫长的等待,此时我们已经通过 vagrant 安装了 Linux 系统了,在安装系统时,vagrant 已经帮我们搭建好了 SSH 环境,我们通过 vagrant ssh 就可以连接上 Linux 系统了。

  3. 为了避免我们每次都要配置端口转发, vagrant 也有配置,为我们实现端口转发的功能

此时我们只需要打开 vagrantfile文件,

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

<img src=https://typora-1301918612.cos.ap-guangzhou.myqcloud.com/undefined/202005/23/111004-560724.png" alt=“image-20200430145937912” style=“zoom:67%;” />

  1. 修改成功后,重启虚拟机,然后再查询 虚拟机的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的官网已经有为我们提供说明文档

Docker 安装说明文档

需要注意的是:我们使用的vagrant 安装的Linux系统,那么我们使用的是vagrant为我们提供的 用户,而不是 root 用户。

  1. Older versions of Docker were called docker or docker-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
    

  1. SET UP THE REPOSITORY

    Install the yum-utils package (which provides the yum-config-manager utility) 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
    
  2. Start Docker.

    启动 Docker 容器

    $ sudo systemctl start docker
    
  3. Docker 容器开机自启动

    $ sudo systemctl enable docker
    

3.2.3 阿里云镜像加速器

sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://cubt013e.mirror.aliyuncs.com"]
}
EOFsudo systemctl daemon-reloadsudo 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 修改配置文件

  1. vi /mydata/mysql/conf/my.cnf 进入 vi 编辑器
  2. 写入一下内容
[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
  1. 重启 mysql

docker restart mysql

  1. 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/conftouch /mydata/redis/conf/redis.confdocker 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免密登录

  1. 进入 git bash; 使用: ssh-keygen -t rsa -C "949010354@qq.com", 然后连续三次回车

  1. 查看完整的密钥 ; 使用 cat ~/.ssh/id_rsa.pub

  2. 登录码云

  3. 使用 ssh-T git@gitee.com

3.7 码云 新建仓库

  1. 新建一个仓库

  1. 克隆项目到IDEA中

3.8 创建项目微服务

微服务包括有 商品服务(product)、仓储服务(ware)、订单服务(order)、优惠券服务(coupon)、会员服务(member)

  1. 通过 spring initializr 进行创建微服务,每个微服务都导入 web、openfeign 场景

  2. 每一个服务都按照一定的规范:

    包名:  com.mxc.mxcmall
    模块名: mxcmall-member
    

    3.最终结果

    <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 设为总项目,聚合所有子项目

  1. 修改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>
  1. 添加 maven 项目

  2. 忽略提交到Git上的垃圾文件,例如 每个项目编译出来的 target 文件、.gitignore版本控制文件,都不需要提交到git。

那我们可以在跟项目下的 .gitignore 加入下面内容


**/mvnw
**/mvnw.cmd
**/.mvn
**/target/
.idea
**/.gitignore
  1. 将需要提交的文件纳入版本控制

  2. 提交代码至 码云

3.10 数据库初始化

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

  1. 创建各个微服务的数据库

    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.gitgit clone https://gitee.com/renrenio/renren-fast-vue.git

3.11.2 使用开源项目

  1. 将克隆的两个开源项目的.git文件夹删除,该文件夹是默认隐藏的,需要显示隐藏,然后再删除。

  2. renren-fast 文件夹移动到 项目的 目录下。

  3. renren-fast 加入到到模块中,根目录的pom.xml文件

  4. 创建与后台控制相关的数据库,数据库表的创建代码在 renren-fast 下的 db 文件夹中已经存在了。

  5. 修改 application-dev.yml 配置文件

3.12 快速开发搭建—前端

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

  1. 浏览器访问 http://localhost:8001/#/login ,账号:admin, 密码:admin

3.13 快速开发—逆向工程

  1. 从 码云中克隆项目,代码生成器,git clone https://gitee.com/renrenio/renren-generator.git

  2. 删除克隆项目中的 .git 文件夹,并放在项目之下

  3. 修改 application.yml配置文件下的url地址,它可以为根据数据库自动生成实体类。

  4. 修改 generator.properites 配置文件

  1. 启动generator项目,并访问 http://localhost/

  2. 在菜单栏左右有一个 选项为 renren-fast ,然后自动生成所有代码

  3. 将压缩包中的 main 解压到对应 微服务中的main 文件中

  4. 自动生成的代码中,有许多是还不能使用的,因为缺乏一些工具类。所以我们可以通过maven的方式进行引入。

  5. 创建一个新的module, 为mxcmall-common, 我们希望每一个公共的类和依赖都放在 mxcmall-common中,然后每一个微服务都来访问这个模块

  6. 每个微服务都依赖mxcmall-common

    
    <dependency><groupId>com.mxc.mxcmall</groupId><artifactId>mxcmall-common</artifactId><version>0.0.1-SNAPSHOT</version></dependency>
    
  7. 为 mxcmall-common 中加入每个微服务需要用上的公共依赖。

    1. 导入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>
      
    2. 导入 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>
  1. 导入 commons-lang 依赖

          <dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency>
    
  2. 导入 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>
  1. 从 renren-fast 中复制需要导入的公共类到mxcmall-common 中。
  2. 修改 renren-generator 中的 template 模板的 controller ,将 @RequiresPermissions 注释,因为我们暂时不需要用到权限管理。
  3. 重新自动生成代码,并导入到项目中。

3.14 快速开发— crud 使用测试

  1. 导入 mybatis-plus 相关的依赖

            <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.3.1.tmp</version></dependency>
    
  2. 配置数据源,导入数据库驱动的相关依赖

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.19</version>
</dependency>
  1. 配置数据源,推荐使用 application.yml 文件

    spring:datasource:username: rootpassword: rooturl: jdbc:mysql://192.168.56.10:3306/mxcmall_pmsdriver-class-name: com.mysql.cj.jdbc.Driver
    
  2. 配置 Mybatis-plus

    1. 扫描dao包: 在主项目下加注释: @MapperScan("com.mxc.mxcmall.product.dao")
    2. 告诉mybatis-plus, sql 的映射文件的具体位置

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 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

  1. 下载 nacos-server :https://github.com/alibaba/nacos/releases
  2. 修改 pom.xml 文件,引入 Nacos Discovery Starter 依赖。
 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
  1. 在应用的 /src/main/resources/application.properties 配置文件中配置 Nacos Server 地址

     spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
    
  2. 在主项目类中 使用 @EnableDiscoveryClient 注解开启服务注册与发现功能

  3. 启动 nacos-server 服务器,并在浏览器 中访问 127.0.0.1:8848/nacos/, 进入到登录页面,默认的账号密码是nacos。

  4. 此时还没有服务注册进来,需要自己添加需要注册的微服务

  1. 在配置文件中,为每一个微服务去上一个别名:

    spring.application.name=mxcmall-coupon
    
  2. 此时在回到可视化页面,我们可以看到已经有服务了,其中如果 服务在运行状态时,触发保护阈值为true,否则为false。

  1. 相同的的步骤,重复其他微服务。

3.17 OpenFeign 远程调用测试

  1. OpenFeign是一种基于接口得编程方式,开发者只需要声明接口和配置注解,在调用接口方法时,Spring Cloud 就根据配置来调度对应的 REST 风格的请求,从其他微服务中获取数据。

  2. 使用OpenFeign 时,首先需要在产品微服务中导入 Maven 依赖

            <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
    
  3. 引入open-feign

  4. 编写一个接口,告诉 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();}
  1. 为了启动 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);}}
  1. 两个测试方法如下

    1. mxcmall-member 微服务中的控制类
    @RestController
    @RequestMapping("member/member")
    public class MemberController {@Autowiredprivate MemberService memberService;@AutowiredCouponFeignService 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"));}
    
    1. 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));}
    }
    
    1. 当我们发送请求 http://localhost:8000/member/member/coupons时,服务器向我们响应的数据为

    1. 当我们在会员微服务中,调用 查询优惠券 的方法时,那么就应该要调用 优惠券微服务的数据库, 而会员微服务不存在该数据库,所以需要 feign 帮我们实现远程调用。

3.18 Nacos 作为配置中心

Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

  1. 首先,修改 pom.xml 文件,引入 Nacos Config Starter。
 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>
  1. 在应用的 /src/main/resources/bootstrap.properties 配置文件中配置 Nacos Config 元数据,这是 Spring boot 中规定的,如果配置文件中有 bootstrap.properties ,它会优先与 application.properties 被读取。
 spring.application.name=nacos-config-examplespring.cloud.nacos.config.server-addr=127.0.0.1:8848
  1. 编写一个测试类
@
@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

  1. 当我们修改配置文件时,无法动态的修改请求时返回的值,我们都必须重新打包,然后再上线服务.这种操作会很麻烦,所以需要用到微服务中的配置中心,它能够帮我们实现实时的更新数据.

  2. 发送请求 http://127.0.0.1:8848/nacos , 在配置列表中添加一个新的配置

  3. 将配置文件中的信息都搬迁到这个配置中,并发布. 需要注意的时,Data ID 为 微服务名.properties,这是一个默认规则,否则该配置文件会不生效

  4. 在控制类中 标上注解 @RefreshScope , 动态获取,并刷新配置.

  5. @value("${…}") 获取配置中的值,如果配置中心和配置文件中都配置了相同的项,那么优先使用配置中心的值.

个人电商项目(mxcmall)的环境配置相关推荐

  1. Java从零到企业级电商项目实战: linux环境配置

    阿里云镜像 https://opsx.alibaba.com/mirror https://blog.csdn.net/jameshadoop/article/details/54881295(修改y ...

  2. 大数据 互联网架构阶段 电商项目简介

    电商项目简介 零.目录 电商项目特点 电商项目技术难点 电商项目简介 开发工具 电商项目架构 开发环境 一.电商项目特点 分布式 数十台服务器,甚至百台.千台.万台,包括:Nigix负载均衡集群.To ...

  3. 电商项目——商品服务-API-属性分组——第十一章——上篇

    电商项目--初识电商--第一章--上篇 电商项目--分布式基础概念和电商项目微服务架构图,划分图的详解--第二章--上篇 电商项目--电商项目的虚拟机环境搭建_VirtualBox,Vagrant-- ...

  4. Django电商项目—项目规划和环境搭建

    Django商品 我们要做一个Django电商项目,那么在开始我们需要将项目分析,功能块,还有逻辑弄清楚, 1.功能块 版本 优化思想 商城项目: 买家:购物车 卖家:店铺 商品 我们首先要先把他们的 ...

  5. 第5章--电商项目-mysql实战--数据库主从配置

    第5章–电商项目-mysql实战 问题1:如何解决单点问题??? 解决方法-–MYSQL主从复制架构 步骤:配参数 在master服务器上建立复制账号 初始化Slave数据 启动基于日志点的复制链路 ...

  6. Java项目:网上电商项目(前后端分离+java+vue+Springboot+ssm+mysql+maven+redis)

    源码获取:博客首页 "资源" 里下载! 一.项目简述 本系统功能包括: 一款基于Springboot+Vue的电商项目,前后端分离项目,前台后台都有,前台商品展示购买,购物车分类, ...

  7. 推荐几个9月爆火的 GitHub 电商项目 赶紧收藏

    原文链接:https://mp.weixin.qq.com/s/pBZR6n8gxl19LAIBsH6XPg 逛逛GitHub. 每天推荐一个好玩的 GitHub 开源项目. 01. 新蜂电商 第一个 ...

  8. 从头开始 启动开源电商项目jShop

    从头开始 启动开源电商项目jShop 1. 引言 干了三年C#, 有了转Java 的念想,所以尝试学习一下java web,java语法本身和C#没有太多的差别,所以打算看看开源的java项目,开源的 ...

  9. 项目是采用目前比较流行的 SpringBoot/SpringCloudAlibaba构建新零售微服务电商项目

    简介: 技术架构 项目是采用目前比较流行的 SpringBoot/SpringCloudAlibaba构建新零售微服务电商项目,从项目中台架构技术选型.模块设计.基础设施的构建.分布式解决方 案.互联 ...

最新文章

  1. LeetCode简单题之判断字符串的两半是否相似
  2. 我在家乡写代码(一)
  3. python安装第三方库-python第三方库的四种安装方法
  4. NLP深度学习:基于TensorFlow实现Skip-Gram模型
  5. 上机考试系统 commons-fileupload 上传与下载 压缩为 zip 文件 删除文件夹下所有内容...
  6. python的GUI编程和tkinter学习笔记——第一个GUI程序
  7. VC6.0加载lib文件的三种方法
  8. HDU - 5493 Queue 2015 ACM/ICPC Asia Regional Hefei Online(线段树)
  9. 非线性拟合matlab代码,Matlab非线性拟合
  10. 【数据结构教程 李春葆】上机实验--第一章实验题
  11. 人工神经网络——学习策略
  12. R语言使用epiDisplay包的logistic.display函数获取二分类logistic回归模型的汇总统计信息(自变量初始和调整后的优势比及置信区间,回归系数的Wald检验的p值、简化汇总结果
  13. 【洞见研报】研报速读:新能源汽车产业链全景图谱——自动驾驶
  14. C++添加防火墙例外——检测目标程序不在例外列表时才进行添加,防止重复添加
  15. Mysql语句+Linux指令一步入门
  16. BNET通信区块链项目CEO刘建军受邀参加2018“区块链共识大会”
  17. Libc堆管理机制及漏洞利用技术(一)
  18. 2021-12-01 股票模拟交易心得2
  19. 代码审计利器-Seay源代码审计系统
  20. java kafka消息的发送与接收

热门文章

  1. 数字通信和数据通信有何不同
  2. 手机有监控功能?分分钟查询手机使用记录!早点知道就好了!
  3. r5 5500u和r7 5700u哪个好 r55500u和r75700u区别有多大
  4. win7 系统增加自定义分辨率_【文献转载】GT5000便携式多参数土壤呼吸测量系统用于棉花田间土壤二氧化碳释放量的测量...
  5. 海康、华为、中兴、联影...找工作记录
  6. MyBatis 中的 choose、then、otherwise
  7. C语言学习之假如我国国民生产总值的年增长率为7%,计算10年后我国国民生产总值与现在相比增长多少百分比。计算公式为p=(1+r)ⁿ r为年增长率,n为年数,p为与现在相比的倍数。
  8. LeapFTP 3.0注册码
  9. es6 javascript的字符串对象新增团员方法
  10. Service pack