016-019 快速开发-使用人人开源搭建后台管理系统
使用gitee上的人人开源工程搭建一个后台管理系统。
我们主要用到renren-fast(后端)、renren-fast-vue(前端)和renren-generator(生成器)。
renren-fast
将renren-fast项目clone到本地的gulimall目录下。将其中的.git文件删掉。
使用IntelliJ IDEA打开renren-fast,并将它配置到gulimall的总pom.xml文件中。
初始化数据库:
- 使用SQLyog连上MySQL。创建数据库:gulimall_admin
- 在数据库gulimall_admin中执行SQL脚本:renren-fast/db/maysql.sql
数据库初始化完成。
配置数据源:
- 打开配置文件src/resources/application.yml,我们可以看到当前环境为dev环境。
- 打开同目录下的配置文件application-dev.yml,修改数据源信息。
数据源配置完成。
运行renren-fast:
- 执行src/main/java/io/renren/RenrenApplication类中的main方法。
renren-fast-vue
将renren-fast-vue项目clone到本地的gulimall目录下。将其中的.git文件删掉。
使用VsCode打开renren-fast-vue项目。
导入依赖:
npm install
执行npm install时有报错,我最终解决了问题,不过不确定自己的哪些操作起了作用,请查阅评论区或百度解决。
运行renren-fast-vue:
npm run dev
项目成功启动后,可使用浏览器访问该项目:http://localhost:8001
如果此时前后端项目都在运行,可以完成管理员登录操作(用户名、密码都是admin)。
renren-generator
将renren-generator项目clone到本地的gulimall目录下。将其中的.git文件删掉。
使用IntelliJ IDEA打开renren-generator,并将它配置到gulimall的总pom.xml文件中。
后边在使用renren-generator的时候会遇到一个缺少依赖包的问题,我们在这里解决了。
打开src/main/resources/template路径下的Controller.java.vm文件,将导入的RequiresPermissions类注释掉,然后注释掉下面所有涉及@RequiresPermissions注解的代码。
接下来,我们使用renren-generator生成各个微服务的增删改查代码。
(因为我们创建了5个微服务,所以下面的步骤一共要执行5次)
以gulimall-product服务为例:
1.配置数据源
2.其他配置信息
3.整合spring和mybatis-plus
在src/main/resources/路径下创建文件application.yaml:(视频中在这里设置了主键自增,我是到后面做增删改查时才回过头来添加的)
spring:
datasource:
username: root
password: root
url: jdbc:mysql://192.168.56.10:3306/gulimall_pms
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
mapper-locations: classpath*:/mapper/**/*.xml
4.运行renren-generator
执行src/main/java/io/renren/RenrenApplication类中的main方法。
运行成功后,访问http://localhost:80,进入renren-fast页面,选择所有表,点生成代码。
得到一个压缩文件,解压后得到一个main文件夹和若干sql文件。将main文件夹覆盖到gulimall-product/src/路径下。
此时,你会发现生成的代码中缺了很多类,之后生成其他微服务的代码也会缺很多类,我们不想挨个儿补充每个微服务中缺少的类,所以创建一个通用服务来提供这些缺少的类。
我们创建一个gulimall-common服务,将以后每个微服务都需要的东西放进去。
将它配置到gulimall的总pom.xml文件中。
然后在gulimall-common/pom.xml中添加依赖:
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</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>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.13</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.2.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.2.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.30</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
解决其他微服务导入renren-generator生成的代码后的类缺失问题。
- 在gulimall-product服务的pom.xml文件中添加对gulimall-common的依赖(之后的每个服务都需要添加):
<dependency> <groupId>com.atguigu.gulimall</groupId> <artifactId>gulimall-common</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
- 在gulimall-common的src/main/java/路径下创建com.atguigu.common.utils包,将renren-fast/src/main/java/io/renren/common/utils/路径下的Constant、PageUtils、Query、R类复制到utils包内。
- 在gulimall-common的src/main/java/路径下创建io.renren.common包,将renren-fast/src/main/java/io/renren/common/路径下的xss包、exception包复制到common包内。
- 在io.renren.common包下创建utils包,将renren-fast/src/main/java/io/renren/common/utils/路径下的R.java文件复制到utils包内。
测试一下:
接下来回过头依次使用renren-generator生成其他服务的代码。
在测试gulimall-ware时可能会出现错误:找不到Longblob类。把Longblob改成byte[]即可。
给每个服务配置端口号:
gulimall-coupon服务:7000
gulimall-member服务:8000
gulimall-order服务:9000
gulimall-product服务:10000(后来因为端口号冲突改成了12000)
gulimall-ware服务:11000
终于搞定:
020 分布式组件-Spring Cloud Alibaba简介
Spring Cloud Alibaba致力于提供微服务开发的一站式解决方案。
依托Spring Cloud Alibaba,只需要添加一些注解和少量的配置,就可以将Spring Cloud应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
根据Spring Boot版本选择Spring Cloud、Spring Cloud Alibaba的版本:
在gulimall-common服务的pom.xml文件中添加依赖:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
021 分布式组件-搭建Nacos注册中心
1.添加Nacos依赖
在gulimall-common服务的pom.xml文件中添加依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2.下载Nacos Server
Windows系统下载那个zip文件。
解压缩后,如果直接运行bin文件夹下的startup.cmd会启动失败,因为Nacos默认是以集群模式启动的。
我们使用比较偷懒的方法:修改startup.cmd文件:
再次运行startup.cmd,Nacos启动成功。
3.配置需要注册的服务
在每个服务(coupon、member、order、product、ware)的src/main/resources/application.properties文件中配置Nacos Server:
使用@EnableDiscoveryClient 注解开启服务的注册与发现功能:
重启各个服务。
4.查看服务
访问 http://127.0.0.1/8848/nacos
默认的用户名和密码都是nacos
登录成功后查看服务列表:
发现各服务已成功注册。
补充:
在往gitee上push代码时,我有些纠结是否应该把nacos也推上去,如果推的话,nacos本身就有100多兆的代码,这些代码跟项目的相关性并不大,但如果不推的话,在其他电脑上下载项目源码后,还得特意去下载nacos。
我问了身边的大佬,大佬建议我买一个云服务器,把nacos部署到服务器上,这样就不用往代码仓库里推nacos代码,以后也不用每次启动项目前都手动启动nacos了。等这个项目做得差不多了我就去氪云服务器。
022 分布式组件-测试Spring Cloud OpenFeign远程调用
1.添加openfeign依赖
在创建各个微服务时已经导入了openfeign依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.开启远程调用功能
我们创建一个feign包,以后将所有调用其他服务的接口都放在这个包下:
然后在GulimallMemberApplication.java中使用注解:
@EnableFeignClients(basePackages = "com.atguigu.gulimall.member.feign")
这样在启动gulimall-member服务时,会扫描feign包(找到@FeignClient,接下来讲)。
3.编写一个远程调用的接口
我们在gulimall-coupon中随便找一个Controller类,在里面写一个要被远程调用的方法:
将这个要被调用的方法抽象化,添加到gulimall-member服务的feign 包的CouponFeignService.java中:
通过@FeignClient和@RequestMapping两个注解,可以连结分别位于两个服务中的抽象和实现。
4.测试远程调用
在gulimall-member中随便找一个Controller类,在里面中写一个test方法:
重启gulimall-coupon服务和gulimall-member服务。
在重启gulimall-member服务时报了一个错误:
No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer?
解决方法:修改gulimall-common的pom.xml文件:(从Nacos依赖中移除ribbon,并引入loadbalancer)
再重启就成功了。
打开浏览器访问:
http://127.0.0.1:8000/member/member/coupons
经验证,远程调用成功:
023 分布式组件-Nacos配置中心
1.在gulimall-common服务的pom.xml文件中添加依赖
dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2021.1</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.0.3</version>
</dependency>
2.在每个服务中创建配置文件src/main/resources/bootstrap.properties
3.给每个服务在Nacos配置中心添加对应的配置集
(Nocos本地启动后访问http://127.0.0.1:8848/nacos/)
Data ID为“应用名.properties”
4.在项目中动态地获取配置
这里要使用@RefreshScope和@Value两个注解:
@Value注解想要获得一个howareyou值,我们需要在项目中给它设一个默认值,否则服务启动会失败。
重启服务,点下方链接进行测试:
http://localhost:7000/coupon/coupon/test
这里的机制是:当配置中心运行正常且包含gulimall-coupon.properties这个配置集时,读取该配置集中的配置。当配置中心挂掉时,读取本地的默认值。
Namespace和Group
命名空间:用于进行租户粒度的配置隔离。默认为public。
我们可以新建几个命名空间:
然后在配置列表页面会出现这些命名空间:
不同命名空间中的配置是相互隔离的(且可重复的),默认会使用public命名空间中的配置。
如果想要使用其他命名空间的配置,可以在bootstrap.properties中配置:(我仍然打算使用public的配置,就注释掉了)
那一长串是:
组:使用起来跟命名空间差不多。默认所有配置集都属于DEFAULT_GROUP。
可以使用多配置集:
可以看到,对比namespace,使用group的一个优点是在bootstrap.properties中配置内容是可读的(test_group),在namespace和group结合使用的情境下,可以考虑把更可能发生变化的配置项设计为group。
之前有提到过不往gitee上推nacos代码,所以大部分配置仍然使用本地版本。
026 分布式组件-使用Gateway创建&测试API网关
1.创建模块gulimall-gateway
2.添加依赖
gulimall-gateway不再依赖gulimall-common。在pom.xml文件中添加对nacos的依赖:
<!-- Nacos:服务注册/发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
<version>3.0.3</version>
</dependency>
<!-- Nacos:配置管理 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2021.1</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.0.3</version>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.开启网关服务的注册&发现
使用配置中心管理配置。
启动gulimall-gateway服务。
启动成功。