语雀文档库: https://www.yuque.com/imoyt/zssuuf

一、谷粒项目介绍

image-20210414213117182

微服务划分图:

image-20210414213155787

二、环境准备

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

image-20210414215651818

执行以上命令后,会在用户的 home 目录下生成 Vagrantfile 文件 。

image-20210414215905880

启动虚拟机环境

1
vagrant up

image-20210414221547897

注意: 下载镜像的时候下载速度的很慢,可以使用下载到本地,然后使用 “ vagrant box add ”添加,再“vagrant up” 。

​ Centos7:http://cloud.centos.org/centos/7/vagrant/x86_64/images/ 下载时选择后缀为 .box

把下载的镜像添加到 virtualBox 中

下载的镜像:

image-20210414222350199

1
vagrant box add centos/7 G:\Vagrant\CentOS-7.box

image-20210414222731212

出现:box: Successfully added box ‘centos/7’ (v0) for ‘virtualbox’!

启动:

1
vagrant up

image-20210414222909448

vagrant ssh 开启 SSH,并登录到 CentOS7

1
2
3
vagrant ssh

[vagrant@localhost ~]$ ip addr

image-20210414223243878

配置网络

  • 查询 window IP 信息

image-20210414223433377

  • 配置网络信息,打开”Vagrantfile”文件
1
config.vm.network "private_network", ip: "192.168.56.10"

修改完之后需要重启 vagrant , vagrant reload

  • 检查宿主机和 virtualBox 之间的通信是否正常

image-20210414224816353

  • 考虑需要给虚拟上传文件和远程登录,需要修改“/etc/ssh/sshd_config”
1
2
3
4
5
vim /etc/ssh/sshd_config

#修改
PermitRootLogin yes
PasswordAuthentication yes
  • 重启 SSHD
1
systemctl restart sshd
  • 使用 Xshell 测试连接

image-20210414231856044

3、安装 docker

安装参考:https://docs.docker.com/engine/install/centos/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#卸载系统之前的docker
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

sudo yum install -y yum-utils

# 配置镜像
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

# 使用这个
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

sudo yum install docker-ce docker-ce-cli containerd.io


sudo systemctl start docker
# 设置开机自启动
sudo systemctl enable docker


docker -v
sudo docker images

配置阿里云镜像加速:https://cr.console.aliyun.com/cn-qingdao/instances/mirrors

1
2
3
4
5
6
7
8
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://chqac97z.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

4、安装 mysql

建议: 把用户切换为 root 来操作,可以不使用 sudo

1
2
#切换
su root
1
2
3
4
5
6
7
8
docker pull mysql:5.7
# --name指定容器名字 -v目录挂载 -p指定端口映射 -e设置mysql参数 -d后台运行
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

image-20210414233526440

  • 我们设置了目录映射,可以不使用 docker exec -it mysql bin/bash 可以直接在境外执行
1
vi /mydata/mysql/conf/my.conf

添加以下内容:

1
2
3
4
5
6
7
8
9
10
11
[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
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve

重启 docker mysql 容器

1
docker restart mysql

5、安装 redis

1
[root@localhost ~]# docker pull redis

image-20210414234111794

  • 启动 docker redis
1
2
3
[root@localhost ~]# mkdir -p /mydata/redis/conf
[root@localhost ~]# touch /mydata/redis/conf/redis.conf
[root@localhost ~]# echo "appendonly yes" >> /mydata/redis/conf/redis.conf
1
2
3
4
5
6
7
8
docker 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


# 直接进去redis客户端。
docker exec -it redis redis-cli
  • 设置 redis 容器在 docker 启动的时候启动
1
docker update redis --restart=always

image-20210415000241651

三、创建 maven 工程

四、执行 sql 脚本

gulimall_oms.sql
gulimall_pms.sql
gulimall_sms.sql
gulimall_ums.sql
gulimall_wms.sql
pms_catelog.sql
sys_menus.sql

五、clone 人人开源

https://gitee.com/renrenio

1587609877028

克隆到本地:

1
2
3
git clone https://gitee.com/renrenio/renren-fast-vue.git

git clone https://gitee.com/renrenio/renren-fast.git

将拷贝下来的“renren-fast”删除“.git”后,拷贝到“gulimall”工程根目录下,然后将它作为 gulimall 的一个 module

创建“gulimall_admin”的数据库,然后执行“renren-fast/db/mysql.sql”中的 SQl 脚本

修改“application-dev.yml”文件,默认为 dev 环境,修改连接 mysql 的 url 和用户名密码

1
2
3
4
5
6
7
8
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.137.14:3306/gulimall_admin?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: root

启动“gulimall_admin”,然后访问“http://localhost:8080/renren-fast/

1587616296253

安装 node.js,并且安装仓库

1
npm config set registry http://registry.npm.taobao.org/
1
2
3
4
5
6
7
8
9
PS D:\tmp\renren-fast-vue> npm config set registry http://registry.npm.taobao.org/
PS D:\tmp\renren-fast-vue> npm install
npm WARN ajv-keywords@1.5.1 requires a peer of ajv@>=4.10.0 but none is installed. You must install peer dependencies yourself.
npm WARN sass-loader@6.0.6 requires a peer of node-sass@^4.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.9 (node_modules\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.9: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})

up to date in 17.227s
PS D:\tmp\renren-fast-vue>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PS D:\tmp\renren-fast-vue> npm run dev

> renren-fast-vue@1.2.2 dev D:\tmp\renren-fast-vue
> webpack-dev-server --inline --progress --config build/webpack.dev.conf.js

10% building modules 5/10 modules 5 active ...-0!D:\tmp\renren-fast-vue\src\main.js(node:19864) Warning: Accessing non-existent property 'cat' of module exports inside circular dependency
(Use `node --trace-warnings ...` to show where the warning was created)
(node:19864) Warning: Accessing non-existent property 'cd' of module exports inside circular dependency
(node:19864) Warning: Accessing non-existent property 'chmod' of module exports inside circular dependency
(node:19864) Warning: Accessing non-existent property 'cp' of module exports inside circular dependency
(node:19864) Warning: Accessing non-existent property 'dirs' of module exports inside circular dependency
(node:19864) Warning: Accessing non-existent property 'pushd' of module exports inside circular dependency
(node:19864) Warning: Accessing non-existent property 'popd' of module exports inside circular dependency
(node:19864) Warning: Accessing non-existent property 'echo' of module exports inside circular dependency
(node:19864) Warning: Accessing non-existent property 'tempdir' of module exports inside circular dependency
(node:19864) Warning: Accessing non-existent property 'pwd' of module exports inside circular dependency

常见问题 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 恢复正常:

1587637858665

六、clone renren-generator

clone

https://gitee.com/renrenio/renren-generator.git

然后将该项目放置到“gulimall”的跟路径下,然后添加该 Module,并且提交到 github 上

修改配置

renren-generator/src/main/resources/generator.properties

1
2
3
4
5
6
7
8
9
10
11
12
#代码生成器,配置信息

mainPath=com.bigdata
#包名
package=com.bigdata.gulimall
moduleName=product
#作者
author=cosmoswong
#Email
email=cosmoswong@sina.com
#表前缀(类名不会包含表前缀)
tablePrefix=pms_

运行“renren-generator”

访问:<http://localhost:80/

1587638853416

点击“renren-fast”,能够看到它将“renren-fast”的所有表都列举了出来:

1587638968519

选择所有的表,然后点击“生成代码”,将下载的“renren.zip”,解压后取出 main 文件夹,放置到“gulimall-product”项目的 main 目录中。

下面的几个 module,也采用同样的方式来操作。

但是针对于“undo_log”,存在一个问题

1587657745923

它的数据类型是“longblob”类型,逆向工程后,对应的数据类型未知:

1587657812283

这个问题该要怎么解决?

整合 mybatis-plus

1)、导入依赖

1
2
3
4
5
6
7
8
9
<dependency>

<groupId>com.baomidou</groupId>

<artifactId>mybatis-plus-boot-starter</artifactId>

<version>3.2.0</version>

</dependency>

2)、配置

1、配置数据源;

1)、导入数据库的驱动。https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-versions.html

2)、在 application.yml 配置数据源相关信息

1
2
3
4
5
6
spring:
datasource:
username: root
password: root
url: jdbc:mysql://#:3306/gulimall_pms
driver-class-name: com.mysql.cj.jdbc.Driver

2、配置 MyBatis-Plus;

1)、使用@MapperScan

2)、告诉 MyBatis-Plus,sql 映射文件位置

1
2
3
4
5
6
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml
global-config:
db-config:
#主键自增
id-type: auto

七、微服务注册中心

要注意 nacos 集群所在的 server,一定要关闭防火墙,否则容易出现各种问题。

搭建 nacos 集群,然后分别启动各个微服务,将它们注册到 Nacos 中。

1
2
3
4
5
6
application:
name: gulimall-coupon
cloud:
nacos:
discovery:
server-addr: 192.168.137.14

查看注册情况:

http://192.168.137.14:8848/nacos/#/serviceManagement?dataId=&group=&appName=&namespace=

1587694451601

八、使用 openfen

1)、引入 open-feign

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2)、编写一个接口,告诉 SpringCLoud 这个接口需要调用远程服务

修改“io.niceseason.gulimall.coupon.controller.CouponController”,添加以下 controller 方法:

1
2
3
4
5
6
@RequestMapping("/member/list")
public R memberCoupons(){
CouponEntity couponEntity = new CouponEntity();
couponEntity.setCouponName("discount 20%");
return R.ok().put("coupons",Arrays.asList(couponEntity));
}

新建“io.niceseason.gulimall.member.feign.CouponFeignService”接口

1
2
3
4
5
@FeignClient("gulimall_coupon")
public interface CouponFeignService {
@RequestMapping("/coupon/coupon/member/list")
public R memberCoupons();
}

修改“io.niceseason.gulimall.member.GulimallMemberApplication”类,添加上”@EnableFeignClients”:

1
2
3
4
5
6
7
8
9
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "io.niceseason.gulimall.member.feign")
public class GulimallMemberApplication {

public static void main(String[] args) {
SpringApplication.run(GulimallMemberApplication.class, args);
}
}

​ 声明接口的每一个方法都是调用哪个远程服务的那个请求

3)、开启远程调用功能

io.niceseason.gulimall.member.controller.MemberController

1
2
3
4
5
6
7
8
9
@RequestMapping("/coupons")
public R test(){
MemberEntity memberEntity=new MemberEntity();
memberEntity.setNickname("zhangsan");
R memberCoupons = couponFeignService.memberCoupons();

return memberCoupons.put("member",memberEntity).put("coupons",memberCoupons.get("coupons"));
}

(4)、访问http://localhost:8000/member/member/coupons

1587701348764

停止“gulimall-coupon”服务,能够看到注册中心显示该服务的健康值为 0:

1587701521184

再次访问:http://localhost:8000/member/member/coupons

1587701587456

启动“gulimall-coupon”服务,再次访问,又恢复了正常。

九、配置中心

1)修改“gulimall-coupon”模块

添加 pom 依赖:

1
2
3
4
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

创建 bootstrap.properties 文件,该配置文件会优先于“application.yml”加载。

1
2
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=192.168.137.14:8848

2)传统方式

为了详细说明 config 的使用方法,先来看原始的方式

创建“application.properties”配置文件,添加如下配置内容:

1
2
coupon.user.name="zhangsan"
coupon.user.age=30

修改“io.niceseason.gulimall.coupon.controller.CouponController”文件,添加如下内容:

1
2
3
4
5
6
7
8
9
@Value("${coupon.user.name}")
private String name;
@Value("${coupon.user.age}")
private Integer age;

@RequestMapping("/test")
public R getConfigInfo(){
return R.ok().put("name",name).put("age",age);
}

启动“gulimall-coupon”服务:

访问:http://localhost:7000/coupon/coupon/test>

1587716583668

这样做存在的一个问题,如果频繁的修改 application.properties,在需要频繁重新打包部署。下面我们将采用 Nacos 的配置中心来解决这个问题。

3)nacos config

1、在 Nacos 注册中心中,点击“配置列表”,添加配置规则:

1587716911435

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、查看配置:

1587717125580

3、修改“io.niceseason.gulimall.coupon.controller.CouponController”类,添加“@RefreshScope”注解

1
2
3
4
@RestController
@RequestMapping("coupon/coupon")
@RefreshScope
public class CouponController {

这样都会动态的从配置中心读取配置.

4、访问:http://localhost:7000/coupon/coupon/test

1587717485283

能够看到读取到了 nacos 中的最新的配置信息,并且在指明了相同的配置信息时,配置中心中设置的值优先于本地配置。

4)Nacos 支持三种配置加载方方案

Nacos 支持“Namespace+group+data ID”的配置解决方案。

详情见:https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-config.adoc

Namespace 方案

通过命名空间实现环境区分

下面是配置实例:

1、创建命名空间:

“命名空间”—>“创建命名空间”:

1587718802109

创建三个命名空间,分别为 dev,test 和 prop

2、回到配置列表中,能够看到所创建的三个命名空间

1587718889316

下面我们需要在 dev 命名空间下,创建“gulimall-coupon.properties”配置规则:

1587719108947

3、访问:http://localhost:7000/coupon/coupon/test

1587721184218

并没有使用我们在 dev 命名空间下所配置的规则,而是使用的是 public 命名空间下所配置的规则,这是怎么回事呢?

查看“gulimall-coupon”服务的启动日志:

1
2
3
4
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]
2020-04-24 16:37:24.163 INFO 32792 --- [ main] c.a.nacos.client.config.utils.JVMUtil : isMultiInstance:false
2020-04-24 16:37:24.169 INFO 32792 --- [ main] b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-gulimall-coupon.properties,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-gulimall-coupon,DEFAULT_GROUP'}]

**”gulimall-coupon.properties”**,默认就是 public 命名空间中的内容中所配置的规则。

4、指定命名空间

如果想要使得我们自定义的命名空间生效,需要在“bootstrap.properties”文件中,指定使用哪个命名空间:

1
spring.cloud.nacos.config.namespace=a2c83f0b-e0a8-40fb-9b26-1e9d61be7d6d

这个命名空间 ID 来源于我们在第一步所创建的命名空间

1587718802109

5、重启“gulimall-coupon”,再次访问:http://localhost:7000/coupon/coupon/test

1587720311349

但是这种命名空间的粒度还是不够细化,对此我们可以为项目的每个微服务 module 创建一个命名空间。

6、为所有微服务创建命名空间

1587720714101

7、回到配置列表选项卡,克隆 pulic 的配置规则到 coupon 命名空间下

1587720883244

切换到 coupon 命名空间下,查看所克隆的规则:

1587720963699

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

1587721184218

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”组下

1587721616021

2、修改“bootstrap.properties”配置,添加如下的配置

1
spring.cloud.nacos.config.group=tmp

3、重启“gulimall-coupon”,访问:http://localhost:7000/coupon/coupon/test

1587721844449

5)同时加载多个配置集

当微服务数量很庞大时,将所有配置都书写到一个配置文件中,显然不是太合适。对此我们可以将配置按照功能的不同,拆分为不同的配置文件。

如下面的配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server:
port: 7000

spring:
datasource:
#MySQL配置
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.137.14:3306/gulimall_sms?useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: root
password: root

application:
name: gulimall-coupon
cloud:
nacos:
discovery:
server-addr: 192.168.137.14:8848

mybatis-plus:
global-config:
db-config:
id-type: auto
mapper-locations: classpath:/mapper/**/*.xml

我们可以将,

数据源有关的配置写到一个配置文件中:

1
2
3
4
5
6
7
spring:
datasource:
#MySQL配置
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.137.14:3306/gulimall_sms?useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: root
password: root

和框架有关的写到另外一个配置文件中:

1
2
3
4
5
mybatis-plus:
global-config:
db-config:
id-type: auto
mapper-locations: classpath:/mapper/**/*.xml

也可以将上面的这些配置交给 nacos 来进行管理。

实例:将“gulimall-coupon”的“application.yml”文件拆分为多个配置,并放置到 nacos 配置中心

1、创建“datasource.yml”,用于存储和数据源有关的配置

1
2
3
4
5
6
7
spring:
datasource:
#MySQL配置
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.137.14:3306/gulimall_sms?useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: root
password: root

在 coupon 命名空间中,创建“datasource.yml”配置

1587722798375

2、将和 mybatis 相关的配置,放置到“mybatis.yml”中

1
2
3
4
5
mybatis-plus:
global-config:
db-config:
id-type: auto
mapper-locations: classpath:/mapper/**/*.xml

1587722710432

3、创建“other.yml”配置,保存其他的配置信息

1
2
3
4
5
6
7
8
9
10
server:
port: 7000

spring:
application:
name: gulimall-coupon
cloud:
nacos:
discovery:
server-addr: 192.168.137.14:8848

1587722998265

现在“mybatis.yml”、“datasource.yml”和“other.yml”共同构成了微服务的配置。

4、修改“gulimall-coupon”的“bootstrap.properties”文件,加载“mybatis.yml”、“datasource.yml”和“other.yml”配置

1
2
3
4
5
6
7
8
9
10
11
12
spring.cloud.nacos.config.extension-configs[0].data-id=mybatis.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=datasource.yml
spring.cloud.nacos.config.extension-configs[1].group=dev
spring.cloud.nacos.config.extension-configs[1].refresh=true


spring.cloud.nacos.config.extension-configs[2].data-id=other.yml
spring.cloud.nacos.config.extension-configs[2].group=dev
spring.cloud.nacos.config.extension-configs[2].refresh=true

“spring.cloud.nacos.config.ext-config”已经被废弃,建议使用“spring.cloud.nacos.config.extension-configs”,根据自己的版本选择配置。

5、注释“application.yml”文件中的所有配置

6、重启“gulimall-coupon”服务,然后访问:http://localhost:7000/coupon/coupon/test

1587724212905

7、访问:http://localhost:7000/coupon/coupon/list,查看是否能够正常的访问数据库

1587724350548

小结:

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
2
3
4
5
6
7
8
9
<dependency>
<groupId>io.niceseason.gulimall</groupId>
<artifactId>gulimall-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

3)“io.niceseason.gulimall.gulimallgateway.GulimallGatewayApplication”类上加上“@EnableDiscoveryClient”注解

4)在 Nacos 中创建“gateway”命名空间,同时在该命名空间中创建“gulimall-gateway.yml”

1587729576178

5)创建“bootstrap.properties”文件,添加如下配置,指明配置中心地址和所属命名空间

1
2
3
spring.application.name=gulimall-gateway
spring.cloud.nacos.config.server-addr=192.168.137.14:8848
spring.cloud.nacos.config.namespace=1c82552e-1af0-4ced-9a48-26f19c2d315f

6)创建“application.properties”文件,指定服务名和注册中心地址

1
2
3
spring.application.name=gulimall-gateway
spring.cloud.nacos.discovery.server-addr=192.168.137.14:8848
server.port=88

7)启动“gulimall-gateway”

启动报错:

1
2
3
4
5
Description:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class

解决方法:在“io.niceseason.gulimall.gulimallgateway.GulimallGatewayApplication”中排除和数据源相关的配置

1
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

重新启动

访问:http://192.168.137.14:8848/nacos/#,查看到该服务已经注册到了 Nacos 中

1587730035866

2、案例

现在想要实现针对于“http://localhost:88/hello?url=baidu”,转发到“https://www.baidu.com”,针对于“http://localhost:88/hello?url=qq”的请求,转发到“https://www.qq.com/”

1)创建“application.yml”

1
2
3
4
5
6
7
8
9
10
11
12
spring:
cloud:
gateway:
routes:
- id: baidu_route
uri: https://www.baidu.com
predicates:
- Query=url, baidu
- id: qq_route
uri: https://www.qq.com/
predicates:
- Query=url, qq

2)启动“gulimall-gateway”

3)测试

访问:http://localhost:88/hello?url=baidu

访问:http://localhost:88/hello?url=qq

Gateway 官方文档