普通安装linux虚拟机太麻烦,可以利用一款开源虚拟机软件VirtualBox 。 VirtualBox会开放一个创建虚拟机的接口,Vagrant会利用这个接口创建虚拟机,并且通过Vagrant来管理,配置和自动安装虚拟机。他有一个镜像仓库,vagtrant hub。
1.下载并安装virtualbox
下载地址:https://www.virtualbox.org/wiki/Downloads
安装过程很简单,傻瓜式的一步一步点下去。下载安装之后,要开启cpu虚拟化,在计算机开机时F2进入Bios中,在configration中找到Intel Vitualization Technology,之后重启电脑。
2.下载并安装vagrant
下载地址:https://www.vagrantup.com/downloads.html
.验证cmd中输入vagrant验证是否安装成功。之后初始化centos/7系统(https://app.vagrantup.com/centos/boxes/7)。
常用命令:
初始化环境 vagrant init centos/7
启动环境:vagrant up
连接vm:vagrant ssh
重启环境:vagrant reload
查看vm 的Ip: ip addr
成功之后:会自动添加到VM中
3.虚拟机设置 :
虚拟机是采用网络地址转换-接口转发的方式,这样每在linux里安一个软件都要进行端口映射,不方便。 默认虚拟机的ip不是固定的ip。主机与虚拟机之间的交互希望通过ip进行相互的访问。
虚拟机固定ip配置: ipconfig 找到虚拟机的ip地址
修改文件 Vagrantfile中: config.vm.network "private_network", ip: "192.168.33.10",其中IP配置:为192.168.56.10之后 互相ping一下虚拟机的ip与本地主机上的ip,是否相通。
4.docker安装
安装文档: https://docs.docker.com/engine/install/centos/
docker 官网: https://www.docker.com/products/docker-hub
docker虚拟化容器技术:docker的国外镜像市场docker hub: https://hub.docker.com/
简介: Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
docker的 镜像加速用阿里云: https://www.aliyun.com/ 产品与服务-> 容器镜像服务->镜像工具->镜像加速器
1 #移除本机上的老版本
2 sudo yum remove docker \
3 docker-client \
4 docker-client-latest \
5 docker-common \
6 docker-latest \
7 docker-latest-logrotate \
8 docker-logrotate \
9 docker-engine
10
11 #配置仓储
12 sudo yum install -y yum-utils
13 sudo yum-config-manager \
14 --add-repo \
15 https://download.docker.com/linux/centos/docker-ce.repo
16
17 #安装docker Engine
18 sudo yum install docker-ce docker-ce-cli containerd.io
19
20 #开启
21 sudo systemctl start docker
22
23 #开启测试hello-world容器
24 sudo docker run hello-world
25
26 # 设置开机自启动
27 sudo systemctl enable docker
28
29 #aliyun镜像加速
30 找到centos 下的命令,直接执行
docker 中的目录挂载:
简介: 我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以实现宿主机和容器目录的双向数据自动同步
作用:我们cp命令来实现数据传递,这种方式比较麻烦;
我们通过容器目录挂载,能够轻松实现代码上传,配置修改,日志同步等需求
docker中使用的常见命令:
版本: docker –v,
检索镜像:docker images ,
其中的开机自启动:sudo systemctl enable docker
超管命令:sudo
进入root:su root
重启:docker restart mysql
查看所有运行中的镜像: docker ps
删除某个容器:docker rm mysql(名称)
进入到某个容器中: docker exec -it mysql bin/bash
查看当前目录下的所有文件:ls
查看文件中的内容 : cat my.cnf(文件名)
修改配置文件: vi redis.conf(文件名)
查询地址: whereis mysql(名称)
到目录上一级:cd ..
进入目录下一级:cd 文件名(/var/log, mysql/ )
删除文件中的所有文件夹(级联):rm -rf mysql(文件名)
退出:exit
清屏:clear,cls
文本编辑退出:esc按键 :wq
创建文件目录mkdir -p /mydata/redis/conf
创建文件:touch /mydata/redis/conf/redis.conf
5.docker 安装mysql
mysql镜像地址 :https://hub.docker.com/_/mysql?tab=tags&page=1&ordering=last_updated
安装参考文档:https://www.runoob.com/docker/docker-install-mysql.html
1 #拉取 MySQL 镜像
2 sudo docker pull mysql:5.7
3
4 #开启容器
5 sudo docker run -p 3306:3306 --name mysql \
6 -v /mydata/mysql/log:/var/log/mysql \
7 -v /mydata/mysql/data:/var/lib/mysql \
8 -v /mydata/mysql/conf:/etc/mysql \
9 -e MYSQL_ROOT_PASSWORD=root \
10 -d mysql:5.7
11
12 #查看本地镜像
13 docker images
14
15 #修改配置文件
16 vi /mydata/mysql/conf/my.conf
17
18 (i进入插入模式)
19 [client]
20 default-character-set=utf8
21 [mysql]
22 default-character-set=utf8
23 [mysqld]
24 init_connect=\'SET collation_connection = utf8_unicode_ci\'
25 init_connect=\'SET NAMES utf8\'
26 character-set-server=utf8
27 collation-server=utf8_unicode_ci
28 skip-character-set-client-handshake
29 skip-name-resolve
30 (:wq 退出)
31
32 #进行重启
33 docker restart mysql
下载客户端Navicat ,测试连接时:需要开放mysql远程权限,要不然会报错。
参考文档:
https://jingyan.baidu.com/article/2fb0ba4069797441f2ec5fa7.html
https://blog.****.net/qq_34885405/article/details/93041509
https://blog.****.net/qq_33743572/article/details/106630950
mysql> GRANT ALL PRIVILEGES ON *.* TO \'root\'@\'%\' IDENTIFIED BY \'123456\' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
其中的执行命令: 之后重新连接测试就可以了
6.安装redis
安装参考文档:https://www.runoob.com/docker/docker-install-redis.html
1 #取最新版的 Redis 镜像
2 docker pull redis:latest
3
4 #运行容器
5
6 # 1.创建文件
7 mkdir -p /mydata/redis/conf
8 touch /mydata/redis/conf/redis.conf
9 #2.运行容器
10 docker run -p 6379:6379 --name redis \
11 -v /mydata/redis/data:/data \
12 -v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
13 -d redis redis-server /etc/redis/redis.conf
14
15 # 查看镜像
16 docker images
17
18 # 直接进入redis客户端。
19 docker exec -it redis redis-cli
20
21 #测试redis
22 set a 123
23 get a
24
25 #redis 持久化
26 vi /mydata/redis/conf/redis.conf
27 (i: 插入模式)
28 appendonly yes
29 (:wq 退出)
30 #重启
31 docker restart redis
7.IDEA开发环境
7.1 开发环境的搭建
Docker命令: Java –version 版本信息
mvn–version maven的版本信息
maven中的配置文件修改: 在maven文件夹下的settings.xml中添加 修改 两个配置节点
1.配置aliyun镜像
找到<mirrors>节点,在mirrors节点中,添加:
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
2.配置jdk1.8 编译项目:修改jdk 版本信息为本机的jdk版本信息
<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 中setting 配置maven的地址设置
7.2 Intellij Idea 中添加插件 Lombok,mybatisx
Lombok:Lombok项目是一个Java库,它会自动插入编辑器和构建工具中,Lombok提供了一组有用的注释,用来消除Java类中的大量样板代码。仅五个字符(@Data)就可以替换数百行代码从而产生干净,简洁且易于维护的Java类。
mybatisx:(mybatis-plus的扩展)是一款基于 IDEA 的快速开发插件(mapper与xml之间的操作),为效率而生。支持XML跳转,生成代码,JPA提示
参考文档:https://baomidou.com/guide/mybatisx-idea-plugin.html#%E5%8A%9F%E8%83%BD
8.Java 前端开发工具用 vscode
下载地址(官网太慢,用这个比较快):https://pc.qq.com/detail/16/detail_22856.html
之后安装插件:
Auto Close Tag
Auto Rename Tag
Chinese
ESlint
HTML CSS Support
HTML Snippets
JavaScript ES6
Live Server
open in brower
Vetur
9.环境配置git-ssh
Git简介: Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目;
git代码托管平台(gitee或者github):https://gitee.com/
Git管理工具下载地址:https://git-scm.com/
tortoisegit (Git代码图形化的界面)下载地址https://tortoisegit.org/download/
1.安装完成之后桌面右键鼠标: 看到
2.安装完成之后,在git Bash 中添加基本配置
Git常见操作help:https://gitee.com/help/
配置用户名与密码,免登陆操作
# 配置用户名
git config --global user.name "username" //(名字,为提交代码时候的显示可以与注册名称不一致)
# 配置邮箱
git config --global user.email "username@qq.com" // 注册账号时用的邮箱
# 配置ssh免密登录: https://gitee.com/help/articles/4181#article-header0
ssh-keygen -t rsa -C "xxxxx@xxxxx.com"
三次回车后生成了密钥:公钥私钥
ssh -T git@gitee.com
复制生成后的 ssh key,通过仓库主页 「管理」->「部署公钥管理」->「添加部署公钥」 ,添加生成的 public key 添加到仓库中。
# 测试免密登录配置是否成功
ssh -T git@gitee.com
测试成功,就可以无密给码云推送仓库了
10.项目搭建
Git上创建仓储:https://gitee.com/help/articles/4120
要创建5个模块的微服务
-
- 商品服务product(pms)
- 存储服务ware(wms)
- 订单服务order(oms)
- 优惠券服务coupon(sms)
- 用户服务member(ums)
微服务创建的公共特点如下
1) 微服务模块创建new——Module下使用Spring Initializr(Spring初始化向导)。
之后导入两个基础组件: web ——spring web, Spring Cloud Routing——Openfeign
2) 包名与组织名,模块名之间的命名方式如下
包名: com.atguigu.gulimall.XXX(product/order/ware/coupon/member)
组织名:com.atguigu.gulimall
模块名:gulimall-XXX(product/order/ware/coupon/member)
其中包名的命名规范
个体项目(individual),指个人发起,但非自己独自完成的项目,可公开或私有项目,copyright主要属于发起者。
包名为“indi.发起者名.项目名.模块名……”
onem :
单人项目(one-man),推荐用indi,指个人发起,但非自己独自完成的项目,可公开或私有项目,copyright主要属于发起者。
包名为“onem.发起者名.项目名.模块名……”
pers :
个人项目(personal),指个人发起,独自完成,可分享的项目,copyright主要属于个人。
包名为“pers.个人名.项目名.模块名.……”
priv :
私有项目(private),指个人发起,独自完成,非公开的私人使用的项目,copyright属于个人。
包名为“priv.个人名.项目名.模块名.……”
team:
团队项目,指由团队发起,并由该团队开发的项目,copyright属于该团队所有。
包名为“team.团队名.项目名.模块名.……”
com :
公司项目,copyright由项目发起的公司所有。
包名为“com.公司名.项目名.模块名.……”
3) 总项目管理: 在总项目中添加新的pom文件,此pom文件用来管理每个微服务,之后在maven中把总项目管理的pom添加进去(root)。
对root 进行清理,编译,就是对所有微服务的全部操作。
<?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.atguigu.gulimall</groupId>
<artifactId>gulimall</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gulimall</name>
<description>聚合服务</description>
<packaging>pom</packaging>
<modules>
<module>gulimall-coupon</module>
<module>gulimall-member</module>
<module>gulimall-order</module>
<module>gulimall-product</module>
<module>gulimall-ware</module>
</modules>
</project>
4) 项目gitignore 在项目版本控制中剔除不需要提交的文件(编译生成文件等)。
剔除文件:
**/mvnw
**/mvnw.cmd
**/.mvn
**/target/
.idea
**/.gitignore
剔除总结:
- 总文件名(as:idea)。
- **/文件名(mvnw,mvnwcmd,.mvn,target,.gitignore)
剩下文件(右键)全部添加到版本控制(Add to vas)中
11. 数据库初始化创建(在虚拟机mysql中创建表)
数据库管理工具PowerDesigner,可以打开整个项目的数据表设计;所有的数据库数据再复杂也不建立外键,因为在电商系统里,数据量大,做外键关联很耗性能。其中在powerdesigner 中(database->generate-database->preview)可以查看表的所有信息。
把数据库表存储在docker虚拟机容器中的mysql中。
操作方式:连接sql服务器 192.168.56.10:3306 用root 用户进行登录
连接不成功:dos命令进入vagrant进行排除问题
启动虚拟机:Vagrant up
连接虚拟机:Vagrant ssh
查看所有运行中的镜像:sudo docker ps
查看所有已安转的镜像:sudo docker ps –a
把镜像设置成开机启动(虚拟机重启):
sudo docker update redis --restart=always
sudo docker update mysql --restart=always
检查开机启动是否设置成功。
创建数据库:字符集选utf8mb4,他能兼容utf8且能解决一些字符乱码的问题
gulimall-oms
gulimall-pms
gulimall-sms
gulimall-ums
gulimall-wms
12.人人开源项目(框架用人人,搭建自己的项目)
12.1后台管理系统中添加(renren-fast)
使用人人开源项目(https://gitee.com/renrenio)的框架,来搭建谷粒多后台管理系统。renren-fast(后台管理系统),renren-fast-vue(前端页面),renren-generator(代码生成器)。
1).renren-fast 下载下来,git文件删除,之后添加到gulimall项目中,修改总项目的pom文件(<module>renren-fast</module>)。
2).新建数据库(gulimall-admin)把renren-fast中db下的mysql.sql 文件中内容执行。
3).修改配置文件 : 查看 src\main\resources\application.yml下,数据库环境的配置文件为dev,之后修改src\main\resources\application-dev.yml的数据源配置地址、数据库名、用户名、密码。
4).测试连接:找到renren-fast 下面的main文件,编译运行,看是否有问题。gulimall\renrenfast\src\main\java\io\renren\RenrenApplication.java,运行main函数,之后在http://localhost:8080/renren-fast/ 中是否返回{“msg”:“invalid token”,“code”:401}。
其中编译之后(String 函数报红的情况:jdk版本没有设置(项目结构中可以设置))
12.2前端项目用(renren-fast-vue)在vs code 中打开项目
1)、前端开发node.js:Node.js 就是运行在服务端的 JavaScript , 一个基于Chrome JavaScript 运行时建立的一个平台, 是一个事件驱动I/O服务端JavaScript环境,基于 Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。下载地址:https://nodejs.org/en/
2)、node.js包管理工具npm,新版的nodejs已经集成了npm,相当于java中的maven,net中的nuget,通过命令"npm -v" 来测试是否成功安装,node –v 检测node是否安装成功。
3)、配置npm的淘宝镜像,默认的为国外的网站,下载速度慢。执行命令npm config set registry http://registry.npm.taobao.org/。
4)、首次运行下载现在的项目,需要把项目中包都下载下来,在控制台->终端中执行”npm install” 即可,注意在运行失败时,可以尝试重启vscode,或者以管理员的身份进行运行。(安装系统异常,python要安装)
5)、”npm run dev” 运行前端项目,前端项目运行的时候,后端搭建的服务一块运行。之后点击验证码,在后端的console 中可以看到执行的sql语句。user/pwd: admin/admin 登录系统,进行权限的认证。
12.3快速开发-逆向工程--------代码生成器(renren-generator)
1)、renren-generator下载下来,git文件删除,之后添加到gulimall项目中,修改总项目的pom文件(<module>renren-generator</module>)。
2)、修改application.yml 中的连接数据的连接地址与用户名密码、默认开启的端口号
//修改默认端口号,80端口容易被占用
server:
port: 8002
# mysql
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
#MySQL配置
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.56.10:3306/gulimall-wms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
3)、修改generator.properties 中的包名(mainPath,package),模块名(moduleName),作者(author,email),表前缀(tablePrefix)等信息
mainPath=com.atguigu
#\u5305\u540D
package=com.atguigu.gulimall
moduleName=product
#\u4F5C\u8005
author=xbx
#Email
email=xbx@gmail.com
#\u8868\u524D\u7F00(\u7C7B\u540D\u4E0D\u4F1A\u5305\u542B\u8868\u524D\u7F00)
tablePrefix=pms_
4)、在main下的RenrenApplication下的main方法直接执行。之后打开站点http://localhost:8002/,直接生成相应的代码
12.4 代码生成器生成代码问题与项目兼容
创建公共类common (new modules— maven—然后在name上输入gulimall-common),公共类添加到所有的pom文件中。
maven仓库(可以搜索任意的插件): https://mvnrepository.com/
<!--插件 mybatis-plas -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<!--公用注解 lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<scope>compile</scope>
</dependency>
<!--公共类包 -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.13</version>
<scope>compile</scope>
</dependency>
1)先解决dao与entity 中异常问题。
mybits-plus:https://mp.baomidou.com/guide/install.html#release
配置mybatis-plus 的pom文件
lombok:https://projectlombok.org/setup/maven
2)解决service中的异常
从renren-fast中copy出需要的公共类(PageUtils,Query,R),到common中的com.atguigu.common.utils; 以及xss中的全部文件,到com.atguigu.common.xss 中。
之后解决在common 中的包引用,
3)解决controller 中的异常。
在模板文件中renren-generator\src\main\resources\template\Controller.java.vm
@RequiresPermissions这些注解掉在代码器的模板中暂时注释掉。
以及 相对应的引用//importorg.apache.shiro.authz.annotation.RequiresPermissions;
12.5 数据库驱动配置与测试项目搭建情况
1)数据库驱动配置 :整合mybatis-plus:https://mp.baomidou.com/guide/install.html#release
1、整合MyBatis-Plus
1)、导入依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
2)、配置
1、配置数据源;
1)、导入数据库的驱动 my sqlconnector (用那个版本,需要根据mysql 中的版本信息定驱动信息 )。https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-versions.html
2)、在application.yml配置数据源相关信息
2、配置MyBatis-Plus;
1)、spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹
2)、告诉MyBatis-Plus,sql映射文件位置
2)数据库配置文件 application.yml (新建-文件-application.yml),配置信息如下:
#数据库连接配置
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://192.168.56.10:3306/gulimall-pms
driver-class-name: com.mysql.jdbc.Driver
# 告诉mybatis, sql的文件位置
mybatis-plus:
mapper-locations: classpath*:/mapper/**/*.xml
# classpath* 不只扫描自己的类路径,还包括引用的其他java包中的类路径
# 设置数据实体中的主键ID为自增长
global-config:
db-config:
id-type: auto
其中 :classpath 和 classpath* 区别:
classpath:只会到你的class路径中查找文件;
classpath*:不仅包含class路径,还包括jar包中(class路径)进行查找
classpath*的使用:当项目中有多个classpath路径,并同时加载多个classpath路径下(此种情况多数不会遇到)的文件,*就发挥了作用,如果不加*,则表示仅仅加载第一个classpath路径。
3) 通过测试类来测试联通性,测试代码如下:
@RunWith(SpringRunner.class)
@SpringBootTest
public class GulimallProductApplicationTests {
@Autowired
BrandService brandService;
@Test
public void contextLoads() {
//进行插入操作
// BrandEntity brandEntity=new BrandEntity();
// brandEntity.setName("huahua");
// brandService.save(brandEntity);
// System.out.println("输出操作");
//更新操作
BrandEntity brandEntity=new BrandEntity();
brandEntity.setBrandId(1401564792235810818L);
brandEntity.setDescript("ceshi");
brandService.updateById(brandEntity);
}
}
12.6 依次生成其他模块
修改12.3 中的每个模块的配置,同时为每个模块配置端口信息
gulimall-oms oms order
gulimall-pms pms product
gulimall-sms sms coupon
gulimall-ums ums member
gulimall-wms wms ware
13.搭建分布式系统的基本环境
13.1分布式系统中的基本概念
注册中心:每个微服务上线都需要把它自己注册到注册中心,这样服务之间相互调用的时候就不需要关注被调用服务当前在哪几台服务器有、那些是正常的、那些服务已经 下线。所有调用都是通过注册中心作为中转。
配置中心:各个微服务的统一管理配置中心,修改配置中心的配置,可到达修改所有机器上的该微服务配置的修改。
网关:客户端发送请求到服务器,设置一个网关,请求都先到达网关,网关对
请求进行统一认证(鉴权、过滤、路由、限流、统计等)。
13.2分布式组件的选型:
SpringCloud 家族参考官网:https://spring.io/projects/spring-cloud
1).Spring Cloud Netflix 组件
Eureka: 注册中心
Zuul: 网关
Hystrix: 断路保护
2).Spring Cloud Config 组件:配置中心
13.3、目前使用SpringCloud Alibaba系列分布式组件:
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
1)参考地址:
Spring中的地址:https://spring.io/projects/spring-cloud-alibaba
Github地址文档:https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
2)技术选型:
Spring Cloud Netflix 下的Eureka停止维护,
SpringCloud的痛点:
1.SpringCloud 部分组件停止维护与更新,给开发带来不便
2.SpringCloud 部分环境搭建复杂,没有完善的可视化界面,我们需要大量的二次开发与定制
3. SpringCloud配置复杂,难以上手,部分配置差别难以区分与合理应用。
SpringCloud Alibaba 的优势:
阿里使用过的组件经历了考验,性能强悍,设计合理,现在开源出来大家用成套的产品搭配完善的可视化界面给开发运维带来极大的便利,搭建简单,学习曲线低。
结合SpringCloud Alibaba我们最终的技术搭配方案:
SpringCloud Alibaba –Nacos:注册中心(服务发现/注册)
SpringCloud Alibaba –Nacos:配置中心(动态配置管理)
SpringCloud-Ribbon :负载均衡
SpringCloud-Feign:声明式HTTP客户端(调用远程服务)
SpringCloud Alibaba-Sentinel服务熔断(限流,降级、熔断)
SpringCloud-Gateway:API网关(webflux 编程模式)
SpringCloud-Sleuth:调用链监控
SpringCloud Alibaba- Seata:原Fescar,分布式事务解决方案
13.4、SpringCloud 引用项目中
其中alibaba阿里仓库地址中,搜索版本信息:https://maven.aliyun.com/mvn/search
添加的common中的pom文件中
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
dependencyManagement依赖管理,相当于以后再dependencies里引spring cloud alibaba就不用写版本号
14. Nacos作为注册中心使用:
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
14.1接入
a.Nacos的pom文件引入,在common中添加公共的引用;
b.在应用application.yml 配置文件中配置,服务器地址名称与唯一服务名
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
application: name: gulimall-member
c. 使用 @EnableDiscoveryClient 注解开启服务注册与发现功能
14.2启动 Nacos Server
Nacos下载: https://github.com/alibaba/nacos/releases
单机模式运行:startup.cmd -m standalone
集群模式(默认双击startup.cmd),需要添加额外的配置:https://www.cnblogs.com/xiaoyao-001/p/11925867.html
注意事项:默认双击startup.cmd 为集群模式,没有集群模式的配置,会直接报错。切换集群模式到单机模式,startup.cmd用notepad++打开,之后修改里面的模式为单机模式 set MODE="standalone"。启动成功之后显示,cmd命令窗口不能关闭,关闭之后可视化站点打不开,服务默认关闭。
之后可视化站点查看(本机ID+端口号+/nacos)(此站点既包含注册中心服务的管理也包含配置中心的管理): http://192.168.1.8:8848/nacos/index.html#/login
账号密码nacos
服务管理中可以看到注册的各个服务
14.3测试服务之间的调用需要支持open-Feign的引用
在coupon中调用member中的服务,来测试连通性,是否走注册中心
a.在CouponController中添加测试方法
@RequestMapping("/member/list")
public R membercoupons(){
CouponEntity couponEntity = new CouponEntity();
couponEntity.setCouponName("满100减10");
return R.ok().put("coupons",Arrays.asList(couponEntity));
}
b.在member服务中添加一个声明式的远程调用
//这是一个声明式的远程调用
@FeignClient("gulimall-coupon")
public interface CouponFeignService {
@RequestMapping("/coupon/coupon/member/list")
public R membercoupons();
}
c.在MemberController中添加调
@Autowired
CouponFeignService couponFeignService;
@RequestMapping("/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"));
}
d.member服务与coupon服务启动,注册到注册中心中,之后调用
调用服务:http://localhost:8000/member/member/coupons
返回:
调用异常问题处理:
调用过程中如果出现构建失败的可以参考: https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E,检查自己的SpringCloud,Spring Boot,Spring Cloud Alibaba之间的版本的是否兼容。
应为包版本问题导致的问题可以参考:https://blog.****.net/weixin_45729934/article/details/110310119
15. Feign声明式远程调用
15.1pom文件引入open-feign引用
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>3.0.3</version>
</dependency>
15.2 编写一个接口,告诉SpringCloud这个接口需要调用远程服务
添加Feign文件包,在里面添加接口接口服务类
15.3开启远程调用功能
GulimallMemberApplication启动类上添加注解@EnableFeignClients(basePackages = "com.atguigu.gulimall.member.feign")
16. Nacos作为配置中心的使用:
16.1pom文件接入在commom中
16.2在应用的 /src/main/resources/bootstrap.properties 配置文件中配置 Nacos Config 元数据
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
16.3 @Value值用来注入,@RefreshScope 打开动态刷新功能
16.4测试验证
@RefreshScope
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
@Autowired
private CouponService couponService;
@Value("${coupon.user.name}")
String userName;
@Value("${coupon.user.age}")
int age;
@RequestMapping("/test")
public R test(){
return R.ok().put("userName",userName).put("age",age);
}
}
输入测试网址: http://localhost:7000/coupon/coupon/test
返回:{"msg":"success","code":0,"userName":"james","age":17}
16.5在已经启动的启动 Nacos Server中添加配置
在测试网址中返回:{"msg":"success","code":0,"userName":"james2","age":20}
结论:如果配置中心和当前应用的配置文件中都配置了相同的项,优先使用配置中心的配置。
16.6配置中心的进阶
1)、命名空间:配置隔离
默认:public(保留空间);默认新增的所有配置都在public空间。
a.开发,测试,生产:利用命名空间来做环境隔离。 在可视化配置界面的命名空间中添加。添加成功之后每个命名空间会自动生成一个UUID,在项目配置文件中直接配置这个UUID。
注意:在bootstrap.properties;配置上,需要使用哪个命名空间下的配置,
spring.cloud.nacos.config.namespace=9de62e44-cd2a-4a82-bf5c-95878bd5e871
b.每一个微服务之间互相隔离配置,每一个微服务都创建自己的命名空间,只加 载自己命名空间下的所有配置
2)、配置集:所有配置的集合
例如一个yml文件。
3)、配置集ID:类似文件名
其中Data ID:类似文件名。例如一个yml文件的名称。
4)、配置分组:
默认所有的配置集都属于:DEFAULT_GROUP;可以自定义配置比如:1111,618,1212。在项目中的使用:
每个微服务创建自己的命名空间,使用配置分组区分环境,dev,test,prod。在bootstrap.properties上添加配置spring.cloud.nacos.config.group=dev
测试地址中执行的结果:
{"msg":"success","code":0,"userName":"dev","age":21}
5)、同时加载多个配置集
a.微服务任何配置信息,任何配置文件都可以放在配置中心中
b.只需要在bootstrap.properties说明加载配置中心中哪些配置文件即可
spring.cloud.nacos.config.extension-configs[0].data-id=datasource.yml
spring.cloud.nacos.config.extension-configs[0].group=dev
spring.cloud.nacos.config.extension-configs[0].refresh=true
spring.cloud.nacos.config.extension-configs[1].data-id=mybatis.yml
spring.cloud.nacos.config.extension-configs[1].group=dev
spring.cloud.nacos.config.extension-configs[1].refresh=true
c.@Value,@ConfigurationProperties。。。
以前SpringBoot任何方法从配置文件中获取值,都能使用。
配置中心有的优先使用配置中心中的
d.测试用例中的测试结果
测试用例1(配置中心): http://localhost:7000/coupon/coupon/test
结果:{"msg":"success","code":0,"userName":"dev","age":21}
测试用例2(数据库连接):http://localhost:7000/coupon/coupon/list
结果:{"msg":"success","code":0,"page":{"totalCount":0,"pageSize":10,"totalPage":0,"currPage":1,"list":[]}}
17. 网关 Spring Cloud Gateway
参考官网址:https://docs.spring.io/spring-cloud-gateway/docs/2.2.8.RELEASE/reference/html/
参考博文:https://www.cnblogs.com/crazymakercircle/p/11704077.html
17.1网关中的基本概念:
-
- Route: The basic building block of the gateway. It is defined by an ID, a destination URI, a collection of predicates, and a collection of filters. A route is matched if the aggregate predicate is true.路由是由一个ID,一个目的URl,一个断言集合,一个过滤器集合组成。当一个断言满足条件,才能命中该路由规则。
-
- Predicate: This is a Java 8 Function Predicate. The input type is a Spring Framework
ServerWebExchange
. This lets you match on anything from the HTTP request, such as headers or parameters. 就是java里的断言函数,匹配请求里的任何信息,包括请求头或者参数 - Filter: These are instances of
GatewayFilter
that have been constructed with a specific factory. Here, you can modify requests and responses before or after sending the downstream request. 可以在发送下游请求之前或之后修改请求和响应 - 常见的使用规则如下:
- 转发规则(predicates),假设 转发uri都设定为http://localhost:9023
规则 实例 说明 Path - Path=/gate/,/rule/ ## 当请求的路径为gate、rule开头的时,转发到http://localhost:9023服务器上 Before - Before=2017-01-20T17:42:47.789-07:00[America/Denver] 在某个时间之前的请求才会被转发到 http://localhost:9023服务器上 After - After=2017-01-20T17:42:47.789-07:00[America/Denver] 在某个时间之后的请求才会被转发 Between - Between=2017-01-20T17:42:47.789-07:00[America/Denver],2017-01-21T17:42:47.789-07:00[America/Denver] 在某个时间段之间的才会被转发 Cookie - Cookie=chocolate, ch.p 名为chocolate的表单或者满足正则ch.p的表单才会被匹配到进行请求转发 Header - Header=X-Request-Id, \d+ 携带参数X-Request-Id或者满足\d+的请求头才会匹配 Host - Host=www.hd123.com 当主机名为www.hd123.com的时候直接转发到http://localhost:9023服务器上 Method - Method=GET 只有GET方法才会匹配转发请求,还可以限定POST、PUT等请求方式
- Predicate: This is a Java 8 Function Predicate. The input type is a Spring Framework
过滤器规则(Filter):
过滤规则 | 实例 | 说明 |
---|---|---|
PrefixPath | - PrefixPath=/app | 在请求路径前加上app |
RewritePath | - RewritePath=/test, /app/test | 访问localhost:9022/test,请求会转发到localhost:8001/app/test |
SetPath | SetPath=/app/{path} | 通过模板设置路径,转发的规则时会在路径前增加app,{path}表示原请求路径 |
RedirectTo | 重定向 | |
RemoveRequestHeader | 去掉某个请求头信息 |
注:当配置多个filter时,优先定义的会被调用,剩余的filter将不会生效
17.2使用原理如下:
当客户端请求到达网关,网关根据断言判断请求是否符合某个路由规则,对于符合规则的,经过过滤器到达请求的服务。
17.3创建项目作为API网关
1)新建项目:
New- modules—Spring Initializr(SDK 1.8)。
组织名:com.atguigu.gulimall;
模块名:gulimall-gateway;包名:com.atguigu.gulimall.gateway 。之后在下一步的依赖中添加(Gateway)的引用。
2)添加引用包:
a. Spring Cloud Boot,Spring Cloud,gulimall-common 排除包Mybatis的引用
pom中排除引用排包的方式:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</exclusion>
</exclusions>
</dependency>
在gateway的pom中排除mybatis-plus的引用:
<dependency>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</exclusion>
<exclusion>
<artifactId>mysql-connector-java</artifactId>
<groupId>mysql</groupId>
</exclusion>
</exclusions>
</dependency>
注解排包方式: @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
b.Nacos 注册中心,配置中心。其中在bootstrap.properties 中添加nacos的配置:
注册中心:注册服务名字,应用名,开启服务的注册与发现(@EnableDiscoveryClient)。
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=gulimall-gateway
配置中心:命名空间,所属组织,应用名。
spring.cloud.nacos.config.namespace=baf42f2f-955c-48e4-bc80-5eac322ab469
spring.cloud.nacos.config.group=dev
server.port= 88
3)测试作为API路由功能(在application.yml中添加路由规则):
spring:
cloud:
gateway:
routes:
- id: test_route
uri: https://www.baidu.com
predicates:
- Query= url,baidu
- id: qq_route
uri: https://www.qq.com
predicates:
- Query= url,qq
启动gulimall-gateway;