一、谷粒项目介绍
微服务划分图:
二、环境准备
1、安装 vagrant
VirtualBox 进行安装需要 cpu 开始虚拟化,在开始启动的时候设置主板, CPU configuration, 然后点击 Intel Vitualization Technology
Vagrant: https://releases.hashicorp.com/vagrant/2.2.5/vagrant_2.2.5_x86_64.msi
VirtualBox: https://download.virtualbox.org/virtualbox/6.0.10/VirtualBox-6.0.10-132072-Win.exe
PowerDesigner: http://forspeed.onlinedown.net/down/powerdesigner1029.zip
2、安装 Centos7
1 | vagrant init centos/7 |
执行以上命令后,会在用户的 home 目录下生成 Vagrantfile 文件 。
启动虚拟机环境
1 | vagrant up |
注意:
下载镜像的时候下载速度的很慢,可以使用下载到本地,然后使用 “ vagrant box add ”添加,再“vagrant up” 。
Centos7:http://cloud.centos.org/centos/7/vagrant/x86_64/images/ 下载时选择后缀为 .box
把下载的镜像添加到 virtualBox 中
下载的镜像:
1 | vagrant box add centos/7 G:\Vagrant\CentOS-7.box |
出现:box: Successfully added box ‘centos/7’ (v0) for ‘virtualbox’!
启动:
1 | vagrant up |
vagrant ssh 开启 SSH,并登录到 CentOS7
1 | vagrant ssh |
配置网络
- 查询 window IP 信息
- 配置网络信息,打开”Vagrantfile”文件
1 | config.vm.network "private_network", ip: "192.168.56.10" |
修改完之后需要重启 vagrant , vagrant reload
。
- 检查宿主机和 virtualBox 之间的通信是否正常
- 考虑需要给虚拟上传文件和远程登录,需要修改“/etc/ssh/sshd_config”
1 | vim /etc/ssh/sshd_config |
- 重启 SSHD
1 | systemctl restart sshd |
- 使用 Xshell 测试连接
3、安装 docker
安装参考:https://docs.docker.com/engine/install/centos/
1 | #卸载系统之前的docker |
配置阿里云镜像加速:https://cr.console.aliyun.com/cn-qingdao/instances/mirrors
1 | sudo mkdir -p /etc/docker |
4、安装 mysql
建议:
把用户切换为 root 来操作,可以不使用 sudo
1 | #切换 |
1 | docker pull mysql:5.7 |
- 我们设置了目录映射,可以不使用
docker exec -it mysql bin/bash
可以直接在境外执行
1 | vi /mydata/mysql/conf/my.conf |
添加以下内容:
1 | [client] |
重启 docker mysql 容器
1 | docker restart mysql |
5、安装 redis
1 | [root@localhost ~]# docker pull redis |
- 启动 docker redis
1 | [root@localhost ~]# mkdir -p /mydata/redis/conf |
1 | docker run -p 6379:6379 --name redis \ |
- 设置 redis 容器在 docker 启动的时候启动
1 | docker update redis --restart=always |
三、创建 maven 工程
四、执行 sql 脚本
gulimall_oms.sql
gulimall_pms.sql
gulimall_sms.sql
gulimall_ums.sql
gulimall_wms.sql
pms_catelog.sql
sys_menus.sql
五、clone 人人开源
克隆到本地:
1 | git clone https://gitee.com/renrenio/renren-fast-vue.git |
将拷贝下来的“renren-fast”删除“.git”后,拷贝到“gulimall”工程根目录下,然后将它作为 gulimall 的一个 module
创建“gulimall_admin”的数据库,然后执行“renren-fast/db/mysql.sql”中的 SQl 脚本
修改“application-dev.yml”文件,默认为 dev 环境,修改连接 mysql 的 url 和用户名密码
1 | spring: |
启动“gulimall_admin”,然后访问“http://localhost:8080/renren-fast/”
安装 node.js,并且安装仓库
1 | npm config set registry http://registry.npm.taobao.org/ |
1 | PS D:\tmp\renren-fast-vue> npm config set registry http://registry.npm.taobao.org/ |
1 | PS D:\tmp\renren-fast-vue> npm run dev |
常见问题 1:“Module build failed: Error: Cannot find module ‘node-sass”
运行过程中,出现“Module build failed: Error: Cannot find module ‘node-sass’报错问题”,解决方法
用 npm install -g cnpm –registry=https://registry.npm.taobao.org ,从淘宝镜像那下载,然后 cnpm 下载成功。
最后输入 cnpm install node-sass –save。npm run dev 终于能跑起来了!!!
————————————————
版权声明:本文为 CSDN 博主「夕阳下美了剪影」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38401285/article/details/86483278
常见问题 2:cnpm - 解决 “ cnpm : 无法加载文件 C:\Users\93457\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本。有关详细信息 。。。 “
https://www.cnblogs.com/500m/p/11634969.html
所有问题的根源都在“node_modules”,npm install 之前,应该将这个文件夹删除,然后再进行安装和运行。
再次运行 npm run dev 恢复正常:
六、clone renren-generator
clone
https://gitee.com/renrenio/renren-generator.git
然后将该项目放置到“gulimall”的跟路径下,然后添加该 Module,并且提交到 github 上
修改配置
renren-generator/src/main/resources/generator.properties
1 | #代码生成器,配置信息 |
运行“renren-generator”
点击“renren-fast”,能够看到它将“renren-fast”的所有表都列举了出来:
选择所有的表,然后点击“生成代码”,将下载的“renren.zip”,解压后取出 main 文件夹,放置到“gulimall-product”项目的 main 目录中。
下面的几个 module,也采用同样的方式来操作。
但是针对于“undo_log”,存在一个问题
它的数据类型是“longblob”类型,逆向工程后,对应的数据类型未知:
这个问题该要怎么解决?
整合 mybatis-plus
1)、导入依赖
1 | <dependency> |
2)、配置
1、配置数据源;
1)、导入数据库的驱动。https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-versions.html
2)、在 application.yml 配置数据源相关信息
1 | spring: |
2、配置 MyBatis-Plus;
1)、使用@MapperScan
2)、告诉 MyBatis-Plus,sql 映射文件位置
1 | mybatis-plus: |
七、微服务注册中心
要注意 nacos 集群所在的 server,一定要关闭防火墙,否则容易出现各种问题。
搭建 nacos 集群,然后分别启动各个微服务,将它们注册到 Nacos 中。
1 | application: |
查看注册情况:
http://192.168.137.14:8848/nacos/#/serviceManagement?dataId=&group=&appName=&namespace=
八、使用 openfen
1)、引入 open-feign
1 | <dependency> |
2)、编写一个接口,告诉 SpringCLoud 这个接口需要调用远程服务
修改“io.niceseason.gulimall.coupon.controller.CouponController”,添加以下 controller 方法:
1 |
|
新建“io.niceseason.gulimall.member.feign.CouponFeignService”接口
1 |
|
修改“io.niceseason.gulimall.member.GulimallMemberApplication”类,添加上”@EnableFeignClients”:
1 |
|
声明接口的每一个方法都是调用哪个远程服务的那个请求
3)、开启远程调用功能
io.niceseason.gulimall.member.controller.MemberController
1 |
|
(4)、访问http://localhost:8000/member/member/coupons
停止“gulimall-coupon”服务,能够看到注册中心显示该服务的健康值为 0:
再次访问:http://localhost:8000/member/member/coupons
启动“gulimall-coupon”服务,再次访问,又恢复了正常。
九、配置中心
1)修改“gulimall-coupon”模块
添加 pom 依赖:
1 | <dependency> |
创建 bootstrap.properties 文件,该配置文件会优先于“application.yml”加载。
1 | spring.application.name=gulimall-coupon |
2)传统方式
为了详细说明 config 的使用方法,先来看原始的方式
创建“application.properties”配置文件,添加如下配置内容:
1 | coupon.user.name="zhangsan" |
修改“io.niceseason.gulimall.coupon.controller.CouponController”文件,添加如下内容:
1 |
|
启动“gulimall-coupon”服务:
访问:http://localhost:7000/coupon/coupon/test>
这样做存在的一个问题,如果频繁的修改 application.properties,在需要频繁重新打包部署。下面我们将采用 Nacos 的配置中心来解决这个问题。
3)nacos config
1、在 Nacos 注册中心中,点击“配置列表”,添加配置规则:
DataID:gulimall-coupon
配置格式:properties
文件的命名规则为:${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
${spring.application.name}:为微服务名
${spring.profiles.active}:指明是哪种环境下的配置,如 dev、test 或 info
${spring.cloud.nacos.config.file-extension}:配置文件的扩展名,可以为 properties、yml 等
2、查看配置:
3、修改“io.niceseason.gulimall.coupon.controller.CouponController”类,添加“@RefreshScope”注解
1 |
|
这样都会动态的从配置中心读取配置.
4、访问:http://localhost:7000/coupon/coupon/test
能够看到读取到了 nacos 中的最新的配置信息,并且在指明了相同的配置信息时,配置中心中设置的值优先于本地配置。
4)Nacos 支持三种配置加载方方案
Nacos 支持“Namespace+group+data ID”的配置解决方案。
Namespace 方案
通过命名空间实现环境区分
下面是配置实例:
1、创建命名空间:
“命名空间”—>“创建命名空间”:
创建三个命名空间,分别为 dev,test 和 prop
2、回到配置列表中,能够看到所创建的三个命名空间
下面我们需要在 dev 命名空间下,创建“gulimall-coupon.properties”配置规则:
3、访问:http://localhost:7000/coupon/coupon/test
并没有使用我们在 dev 命名空间下所配置的规则,而是使用的是 public 命名空间下所配置的规则,这是怎么回事呢?
查看“gulimall-coupon”服务的启动日志:
1 | 2020-04-24 16:37:24.158 WARN 32792 --- [ main] c.a.c.n.c.NacosPropertySourceBuilder : Ignore the empty nacos configuration and get it based on dataId[gulimall-coupon] & group[DEFAULT_GROUP] |
**”gulimall-coupon.properties”**,默认就是 public 命名空间中的内容中所配置的规则。
4、指定命名空间
如果想要使得我们自定义的命名空间生效,需要在“bootstrap.properties”文件中,指定使用哪个命名空间:
1 | spring.cloud.nacos.config.namespace=a2c83f0b-e0a8-40fb-9b26-1e9d61be7d6d |
这个命名空间 ID 来源于我们在第一步所创建的命名空间
5、重启“gulimall-coupon”,再次访问:http://localhost:7000/coupon/coupon/test
但是这种命名空间的粒度还是不够细化,对此我们可以为项目的每个微服务 module 创建一个命名空间。
6、为所有微服务创建命名空间
7、回到配置列表选项卡,克隆 pulic 的配置规则到 coupon 命名空间下
切换到 coupon 命名空间下,查看所克隆的规则:
8、修改“gulimall-coupon”下的 bootstrap.properties 文件,添加如下配置信息
1 | spring.cloud.nacos.config.namespace=7905c915-64ad-4066-8ea9-ef63918e5f79 |
这里指明的是,读取时使用 coupon 命名空间下的配置。
9、重启“gulimall-coupon”,访问:http://localhost:7000/coupon/coupon/test
DataID 方案
通过指定 spring.profile.active 和配置文件的 DataID,来使不同环境下读取不同的配置,读取配置时,使用的是默认命名空间 public,默认分组(default_group)下的 DataID。
默认情况,Namespace=public,Group=DEFAULT GROUP,默认 Cluster 是 DEFAULT
通过制定spring.profiles.active=dev
可以制定xxx-dev.properties
的配置文件
Group 方案
通过 Group 实现环境区分
实例:通过使用不同的组,来读取不同的配置,还是以上面的 gulimall-coupon 微服务为例
1、新建“gulimall-coupon.properties”,将它置于“tmp”组下
2、修改“bootstrap.properties”配置,添加如下的配置
1 | spring.cloud.nacos.config.group=tmp |
3、重启“gulimall-coupon”,访问:http://localhost:7000/coupon/coupon/test
5)同时加载多个配置集
当微服务数量很庞大时,将所有配置都书写到一个配置文件中,显然不是太合适。对此我们可以将配置按照功能的不同,拆分为不同的配置文件。
如下面的配置文件:
1 | server: |
我们可以将,
数据源有关的配置写到一个配置文件中:
1 | spring: |
和框架有关的写到另外一个配置文件中:
1 | mybatis-plus: |
也可以将上面的这些配置交给 nacos 来进行管理。
实例:将“gulimall-coupon”的“application.yml”文件拆分为多个配置,并放置到 nacos 配置中心
1、创建“datasource.yml”,用于存储和数据源有关的配置
1 | spring: |
在 coupon 命名空间中,创建“datasource.yml”配置
2、将和 mybatis 相关的配置,放置到“mybatis.yml”中
1 | mybatis-plus: |
3、创建“other.yml”配置,保存其他的配置信息
1 | server: |
现在“mybatis.yml”、“datasource.yml”和“other.yml”共同构成了微服务的配置。
4、修改“gulimall-coupon”的“bootstrap.properties”文件,加载“mybatis.yml”、“datasource.yml”和“other.yml”配置
1 | spring.cloud.nacos.config.extension-configs[0].data-id=mybatis.yml |
“spring.cloud.nacos.config.ext-config”已经被废弃,建议使用“spring.cloud.nacos.config.extension-configs”,根据自己的版本选择配置。
5、注释“application.yml”文件中的所有配置
6、重启“gulimall-coupon”服务,然后访问:http://localhost:7000/coupon/coupon/test
7、访问:http://localhost:7000/coupon/coupon/list,查看是否能够正常的访问数据库
小结:
1)、微服务任何配置信息,任何配置文件都可以放在配置中心;
2)、只需要在 bootstrap.properties 中,说明加载配置中心的哪些配置文件即可;
3)、@Value, @ConfigurationProperties。都可以用来获取配置中心中所配置的信息;
4)、配置中心有的优先使用配置中心中的,没有则使用本地的配置。
十、 网关
1、注册“gulimall-gateway”到 Nacos
1)创建“gulimall-gateway”
SpringCloud gateway
2)添加“gulimall-common”依赖和“spring-cloud-starter-gateway”依赖
1 | <dependency> |
3)“io.niceseason.gulimall.gulimallgateway.GulimallGatewayApplication”类上加上“@EnableDiscoveryClient”注解
4)在 Nacos 中创建“gateway”命名空间,同时在该命名空间中创建“gulimall-gateway.yml”
5)创建“bootstrap.properties”文件,添加如下配置,指明配置中心地址和所属命名空间
1 | spring.application.name=gulimall-gateway |
6)创建“application.properties”文件,指定服务名和注册中心地址
1 | spring.application.name=gulimall-gateway |
7)启动“gulimall-gateway”
启动报错:
1 | Description: |
解决方法:在“io.niceseason.gulimall.gulimallgateway.GulimallGatewayApplication”中排除和数据源相关的配置
1 |
重新启动
访问:http://192.168.137.14:8848/nacos/#,查看到该服务已经注册到了 Nacos 中
2、案例
1)创建“application.yml”
1 | spring: |
2)启动“gulimall-gateway”
3)测试
访问:http://localhost:88/hello?url=baidu