目录
alibaba各组件之间的版本、与SpringBoot的版本对应关系:
谷粒商城最终的技术搭配方案:
SpringCloud Alibaba-Nacos:注册中心和配置中心
SpringCloud Alibaba-Gateway:API网关
SpringCloud Alibaba-Openfeign:服务之间的调用
SpringCloud Alibaba-Sentinel:服务容错
SpringCloud Alibaba-Sleuth:调用链监控
SpringCloud Alibaba-Seata:分布式事务解决方案
alibaba各组件之间的版本、与SpringBoot的版本对应关系:
版本对应说明地址:版本说明 · alibaba/spring-cloud-alibaba Wiki · GitHub
服务中使用的boot是2.3.7版本,cloud使用的是Hoxton.SR9,应该要去使用alibaba2.2.7的版本
Nacos下载的地址:Nacos 快速开始
先在Windows操作系统上使用Nacos
点击startup.cmd启动nacos
访问下面的地址进入它的图形用户界面,默认用户名和密码都是:nacos
http://localhost:8848/nacos
Nacos使用指南:Spring Cloud Alibaba Reference Documentation
搭建Nacos注册中心
①在common的pom文件中导入依赖管理
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.7.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
②在common的pom文件中导入nacos的依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
③在yml配置文件中配置注册中心的地址和服务名称
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
application:
name: gulimall-product
④在启动类中添加@EnableDiscoveryClient
远程服务调用
member服务要调用coupon服务的获取会员优惠券的方法,需要使用open-feign进行远程的服务调用
①pom文件中导入open-feign的依赖,创建服务的时候已经选择
②创建接口
1)、告诉接口需要调用的服务名
2)、 告诉接口调用服务的那个方法
③启动open-feign,告诉需要扫描的包
open-feign的执行流程:
①先扫描需要调用服务的包
②获取服务名到注册中心找相应的服务,如果存在则调用指定的方法,否则调用失败
搭建Nacos配置中心
指南:Spring Cloud Alibaba Reference Documentation
①在common的pom文件中导入Nacos作为配置中心的依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
②创建bootstrap.properties配置文件,并且配置配置中心的地址和服务名
spring.application.name=gulimall-member
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
Nacos配置中心动态刷新配置
以前我们获取配置文件中的配置项使用下面的方式:
缺陷十分明显,当我们需要修改配置文件时,需要重新打包再发布
解决方案:Nacos动态更新
并没有动态更新,原因是没有使用动态更新注解
服务会默认去配置中心找 服务名.properties的配置文件,如果服务中心配置文件和配置文件中的配置文件有相同的配置项,则默认优先加载配置中心的配置文件的配置项
Nacos命名空间与配置分组
1.命名空间
作用:配置隔离
说明:Nacos配置中心默认的命令空间是public,发布的配置文件默认也是在public命令空间下的
使用一:将命名空间分为开发(dev)、生产(prod)、测试(test),将开发、测试、生产之间配置隔离
使用二:每一个服务一个命名空间,服务之间的配置隔离
出现问题:点击确定之后卡着不动了
出现原因:之前使用过低版本的nacos,需要清空一下浏览器的缓存
解决方案:
参考文章:https://github.com/alibaba/nacos/issues?q=customNamespaceId
①创建服务的命名空间
② 在bootstrap.properties文件中配置命名空间
spring.cloud.nacos.config.namespace=47353e14-12d9-420f-b82c-249f760ff794
2.数据集ID(Data Id):类似于文件名
3.配置分组
说明:配置中心默认分组为:DEFAULT_GROUP
在bootstrap.properties配置文件中配置命名空间和分组:
spring.application.name=gulimall-member
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=4c819c0a-d055-4bc8-9cbc-dee92aca56d2
spring.cloud.nacos.config.group=test
谷粒商城中的一个服务对应一个命名空间达到服务之间的配置隔离,配置分组来区分开发、测试、生成环境
Nacos配置多配置集
当我们服务越来越复杂,配置项越来越多的时候,我们希望进行一个配置划分,例如配置数据源一个配置文件,配置mybatis框架的一个文件...
创建数据源配置文件
创建mybatis配置文件
创建其它配置项配置文件
spring.application.name=gulimall-member
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=4c819c0a-d055-4bc8-9cbc-dee92aca56d2
#spring.cloud.nacos.config.group=dev
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
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
先加载DEFAULT_GROUP 服务名.properties配置文件
由于没有DEFAULT_GROUP下的 服务名.properties配置文件,所以加载了服务中的配置文件
然后再去加载扩充的配置文件
配置文件生效:
搭建gateway网关
学习文档:Spring Cloud Gateway
网关的组成:
网关的执行流程:
简而言之:请求到达网关,网关通过断言判断是否符合路由规则,如果符合将请求发送给对应的服务,不过在这之前需要进行过滤的。
routes:是个数组,可以配置多个路由
uri:请求的目的地
predicates:数组,可以配置多个,具体配置可以参考学习文档
filters: 数组,可以添加多个
添加一个请求头,X-Request-red对应的值为blue
接下来开始搭建网关并进行简单的测试:
①使用spring初始化向导创建gateway服务
②导入common依赖,因为gateway需要注册到nacos中,common中已经有了nacos的依赖
③编写配置文件
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
application:
name: gulimall-gateway
server:
port: 88
④启动类中添加开启服务注册的注解@EnableDiscoveryClient,由于common中还有数据源的依赖,因此需要排除数据源的依赖
简单测试:
访问网关,请求路径携带qq或者百度,由网关路由到qq或者百度主页面
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
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
application:
name: gulimall-gateway
server:
port: 88