谷粒商城0-44集总结
gitee地址:https://gitee.com/zheng-linmou/guli-mall-basics
基础篇接口文档地址
https://easydoc.net/doc/75716633/ZUqEdvA4/hKJTcbfd
1.前期搭建
1.1.创建自己的gitee仓库,并且拉下来
在idea里面登录你的gitee的账号
在里面直接进行拉去下来。
1). 修改我们的pom文件 package设置为pom 来进行maven的聚合的管理
2). 然后就是添加5个模块(根据我们sql文件创建不同的springboot的项目)
3). 注意我们的版本依赖(很重要) springboot 版本 使用的是2.1.8.RELEASE 在创建springboot项目的时候选择springOpenfeign 来进行微服务的实现, 然后我们还要修改springcloud的版本 Greenwich.SR3
如果你的不是这个版本那么你就需要自己去根据网上的版本的对应来进行修改 不然后面一些服务是无法启动的
版本冲突的。
4). 创建完了所有的模块后,对我们总的pom文件进行修改,实现maven的聚合。
1.2.虚拟机
首先我们需要准备一个服务器或者是虚拟机,来保证我们的服务不在本地的window下面运行,因为window系统用来跑项目就可以了,减少了电脑的消耗,我们可以准备使用云服务,可以去阿里云 或者 腾讯云上面去买一个
运行内存尽量大一点就可以了。
1.3.docker启动服务
当我们准备好上面这一步以后我们就可以通过云服务来实现我们docker来启动我们的容器 如 mysql redis …等等
使用我们的finalShell来进行连接我们的服务器进行服务的部署。
当我们拉去下来mysql:5.7 和 redis:6.2.7
我们必须使用容器挂载来进行启动 不然下次启动的时候我们的数据就没有了
1). 启动mysql的命令
首先我们在conf文件下面创建一个my.cnf的文件里面来配置我们数据库的字符集
里面的内容就是设置我们字符集的
my.cnf
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
下面就是我们的命令(进行容器的挂载)
docker run -d -p 3306:3306 --privileged=true -v /zlm/mysql/log:/var/log/mysql -v /zlm/mysql/data:/var/lib/mysql -v /zlm/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=1234 --name mysql mysql:5.7
使用docker ps 来查看你的容器是否启动成功了
2). 下面就是启动我们的redis
准备文件redis.conf 也是来配置我们的redis的配置文件 来
里面的内容也是网上找的到进行复制 但是需要修改一些配置(这里就展示一部分)
redis.conf
# Redis configuration file example.
#
# Note that in order to read the configuration file, Redis must be
# started with the file path as first argument:
#
# ./redis-server /path/to/redis.conf
# Note on units: when memory size is needed, it is possible to specify
# it in the usual form of 1k 5GB 4M and so forth:
#
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
#
# units are case insensitive so 1GB 1Gb 1gB are all the same.
################################## INCLUDES ###################################
# Include one or more other config files here. This is useful if you
# have a standard template that goes to all Redis servers but also need
# to customize a few per-server settings. Include files can include
# other files, so use this wisely.
#
# Notice option "include" won't be rewritten by command "CONFIG REWRITE"
# from admin or Redis Sentinel. Since Redis always uses the last processed
# line as value of a configuration directive, you'd better put includes
# at the beginning of this file to avoid overwriting config change at runtime.
#
# If instead you are interested in using includes to override configuration
# options, it is better to use include as the last line.
#
# include /path/to/local.conf
# include /path/to/other.conf
################################## MODULES #####################################
# Load modules at startup. If the server is not able to load modules
# it will abort. It is possible to use multiple loadmodule directives.
#
# loadmodule /path/to/my_module.so
# loadmodule /path/to/other_module.so
################################## NETWORK #####################################
# By default, if no "bind" configuration directive is specified, Redis listens
# for connections from all the network interfaces available on the server.
# It is possible to listen to just one or multiple selected interfaces using
# the "bind" configuration directive, followed by one or more IP addresses.
#
# Examples:
#
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1 #注意这个一定要注释掉才行
下面就是启动命令:
docker run -p 6379:6379 --name myr3 --privileged=true -v /zlm/redis/redis.conf:/etc/redis/redis.conf -v /zlm/redis/data:/data -d redis:6.2.7 redis-server /etc/redis/redis.conf
1.4.将课件里面的sql文件导入进入数据库里面
分别创建不同的数据库,我们这块就是使用 openfeign 来进行调用的
创建5个数据库 后面我们单独对每一个表的结构进行分析,现在我们先导入这些sql语句来创建表结构和一些数据
进行创建 注意先试用notepad++l进行加载文件 因为给的这个sql文件中文编码是有问题的。
1.5.下面就是开发框架人人开源
这个是gitee上面的一个开源的文件,有vue的后台管理系统,还能帮助我们生成我们每一个数据库里面的crud和我们的idea里面的基本结构 里面还有
1). 先进行下载下来
可以使用命令行
git clone 项目的地址
注意当我们下载下来后 把里面的.git文件删除 因为后面我们自己上传到自己的gitee里面去
1.5.1.后端导入进项目里面去
将我们renren-fast-master里面的sql文件导入进入到数据库里面
注意又要重新创建一个新的数据库。因为我们遵从微服务的方式来进行实现。
1.5.1.1.代码快速生成
1). 修改我们代码生成器里面的配置 ,要对应成我们自己的数据库然后进行代码的生成。
在我们的代码生成器里面的yml的数据库连接那里进行修改,修改为我们的数据库和账号和密码
2). generator.properties 里面就是修改我们每一个表是否要去掉前缀,生成在哪个包里面等等这样的设置。
3). 直接启动这个模块
运行“renren-generator”
访问:<http://localhost:80/
点击“renren-fast”,能够看到它将“renren-fast”的所有表都列举了出来:
选择所有的表,然后点击“生成代码”,将下载的“renren.zip”,解压后取出main文件夹,放置到“gulimall-product”项目的main目录中。
下面的几个module,也采用同样的方式来操作。
将逆向生成的代码逆直接覆盖我们原本项目的main方法然后依次这样操作。
1.5.2.前端vue项目
也是下载到本地然后删除.git文件然后使用vscode进行打开,下载使用命令下来我们的依赖
前提是要有node.js 配置一下我们的仓储为淘宝的一个仓库,这样镜像就在国内,下载速度是非常快的
npm install
依赖下载完成后直接配置我们的后台的api的baseUrl来进行服务的启动
启动我们后端的renren-fast-master这个服务,前端也进行启动
npm run dev
访问这个自带的端口号 8001
然后就可以进行登录了
1.6.nacos的配置
下载:
你可以使用你的服务器进行部署这个服务,也可以使用window ,window的话就是下载下来,然后进入到bin目录里面
使用命令
这个就不是启动集群
startup.cmd -m standalone
为什么要配置nacos因为我们的数据库之间是分开的比如我们这个前端人人界面只能访问我们我们数据库的
gulimall-admin的数据库,其他的商品服务是访问不到的,那要怎么样才能进行跨数据的访问。
就是使用微服务的调用,那怎样才知道你能调用其他数据库里面的数据,那么就需要配合中心,也就是现在非常流行的nacos,把每一个服务注册进去,然后统一管理就可以进行微服务之间的调用
优点:
并且我们的nacos还可以进行配置,进来的服务是优先加载我们nacos里面的配置文件的,如果没有再去加载本地的配置文件,
还可以环境的隔离,热部署等等,都是非常方便的一个配置中心。
由于我们每个模块都要使用nacos那么我们就新建一个模块,里面就来配置我们的nacos这样其他模块要想使用nacos直接引入我们的模块就可以了。
1). 依赖的引入
<!-- 服务注册/发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
其他模块要想使用nacos直接引入就可以了
2). 配置nacos
需要配置服务名称,还需要配置nacos的服务地址 最后还要在启动类上加上一个注解来进行服务的发现
# nacos 服务注册中心
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # 这个就是服务的地址
application:
name: gulimall-product # 这个就是我们服务的名称
最终进入到nacos的网址去 8848端口
3). nacos的配置中心
为什么要使用nacos的配置中心,当我们有服务注册进入到nacos里面后,我们的服务就会优先去读取nacos里面的配置文件,并且还能做到隔离,非常符合我们的低耦合高聚合,所以我们是非常喜欢使用这样的方式的。
1.引入依赖
<!--配置中心来做配置管理-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.配置bootstrap配置文件
# nacos服务的名称
spring.application.name=gulimall-coupon
# 配置文件的地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
3.设置命名空间
这个就是用来进行服务之间配置文件的隔离
给每个服务下面的bootstrap进行配置bootstrap的配置
# 读取nacos的配置文件 设置命名空间 进行环境隔离的uuid
spring.cloud.nacos.config.namespace=892b79e9-c43c-4901-b805-7d13b05393e2
分组:比如dev环境,prod环境,还是其他环境都可以设置分组,来读取不同环境下的配置文件,每一个分组下都对应不同的配置文件
比如我们要使用dev环境则
# nacos的分组
# 不指定的话就是读取我们笨的的配置文件里面的
spring.cloud.nacos.config.group=prod
下面我们就可以不使用本地的yml文件,使用nacos上面的配置文件,根据不同的资源设置不用的名称,比如DataSource.yml就是专门连接数据库的,mybatis-plus就是专门用来设置mp的进行了解耦的处理
那我们怎样使用多个nacos上多个配置文件喃?
# nacos的多个配置 ?????yml??????nacos???????
spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml
spring.cloud.nacos.config.ext-config[0].group=dev
# 进行自动的更新 直接在nacos里面修改就可以了
spring.cloud.nacos.config.ext-config[0].refresh=true
spring.cloud.nacos.config.ext-config[1].data-id=mybatis-plus.yml
# 进行不同的分组
spring.cloud.nacos.config.ext-config[1].group=dev
# 进行自动的更新 直接在nacos里面修改就可以了
spring.cloud.nacos.config.ext-config[1].refresh=true
spring.cloud.nacos.config.ext-config[2].data-id=other.yml
spring.cloud.nacos.config.ext-config[2].group=dev
# 进行自动的更新 直接在nacos里面修改就可以了
spring.cloud.nacos.config.ext-config[2].refresh=true
这样就能直接读取命名空间里你专门分组里面那些配置文件就可以了。
注意:
- 我们的data-id必须是你的服务的名称,后面可以加上你是什么环境也可以不然后可以使properties文件,也可以是yml文件。
- 大部分的功能就是上面实现的。
1.7.gateway网关
当我们访问人人快速开发品台的时候我们只能访问监听8080端口,不能监听其他端口,也就是无法调用其他的服务,那么我们这个时候就可以使用nginx 或者 使用gateway来进行服务的转载,
但是我们的前端是8001,而后端是不用的接口,所以会报跨域的错误,因此我们可以直接使用gateway,来进行统一的跨域的处理。
我们在项目里新创建一个模块,就是网关模块。
也是springboot项目。
也进行配置nacos,命名空间,bootstrap文件配置等等
1). 去除DataSource的引入
但是我们这个模块也需要common里面的nacos的依赖,但是common里面也是包括mp的一些配置,如果我们gateway没有配置数据库的DataSource的话就会报错,那么我可以在gateway的启动类上加上注解。
然后我们前端的监听的端口号就要进行修改 我网关的端口号就是88
2). 修改gateway的yml的负载
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
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
# 注意这个是有顺序的 如果上面的接收到了就不会走到下面的那些路由的规则
# product的路由
- id: product_route
uri: lb://gulimall-product
predicates:
# 如果你访问的是/api/product/....什么的
- Path=/api/product/**
filters:
# 进行路径重写 只要product以及后面的把api进行截取了
# 然后重载到uri的服务里面去 去找这个method请求
- RewritePath=/api(?<segment>/?.*),/$\{segment}
# 这个就是整合第三方服务
- id: third_party_route
uri: lb://gulimall-third-party
predicates:
# 如果是/api/thirdparty/...什么请求
- Path=/api/thirdparty/**
filters:
# - 逗号前面的截取掉
- RewritePath=/api/thirdparty/(?<segment>/?.*),/$\{segment}
- id: admin_route
uri: lb://renren-fast
predicates:
- Path=/api/**
filters:
- RewritePath=/api(?<segment>/?.*),/renren-fast/$\{segment}
# 前端项目, ,/api
application:
name: gulimall-gateway
server:
port: 88
例子:就比如我们第三方服务
3). 统一跨域处理
这个是固定的统一做了跨域处理 就不用在每个controller上面加上@CrossOrigin
package com.atguigu.gulimall.gateway.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
@Configuration
public class GulimallCorsConfiguration {
@Bean
public CorsWebFilter corsWebFilter(){
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration corsConfiguration = new CorsConfiguration();
//1、配置跨域
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.setAllowCredentials(true);
source.registerCorsConfiguration("/**",corsConfiguration);
return new CorsWebFilter(source);
}
}
最终进行登录的测试看是否能调用到我们的gulimall-admin的接口
1.8.OpenFeign的远程调用
在gulimall-coupon服务里面的controller里面创建新的一个方法,来从gulimall-member里面调用这个方法
那么我们在写在gulimall-coupon里面
我们在member服务里面进行调用
下面使用自动装配的方式来实现