本文主要介绍如何搭建分布式开发基本环境
一、基本概念
1. 注册中心
在分布式系统中,每一个微服务上线,都需要注册到注册中心。(方便服务的远程调用,比如订单想调用商品服务,直接从注册中心获得)
对应 SpringCloud 里的 Netflix 组件中的 Eureka
2. 配置中心
用于集中管理配置,服务实时获取配置中心的配置,进行修改
对应 SpringCloud 里的 Spring Cloud Config 组件
3. 网关
前端请求经过网关进行鉴权、过滤等操作
对应 SpringCloud 里的 Netflix 组件中的 Zuul
二、分布式使用的组件
我们不使用 SpringCloud 原生组件,而是使用 SpringCloud Alibaba 中提供的组件
原因:SpringCloud 中的部分组件停止维护了,并且环境搭建复杂。而 SpringCloud Alibaba 具有完善的可视化界面,学习曲线低。
最终我们需要用的组件为:
- Nacos —— 注册配置中心
- Ribbon + Feign —— 远程调用 、负载均衡
- Sentinel —— 服务熔断降级
- GateWay —— API 网关
- Sleuth —— 调用链监控
- Seata —— 分布式事务
三、Nocas + Feign 基本使用
Nocas 示例文档: https://github.com/alibaba/spring-cloud-alibaba/blob/2021.x/README-zh.md
1. 导入 spring-cloud-alibaba 组件
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.9.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
2. 使用 Nacos 组件作为注册中心
1) 导入依赖到我们微服务项目的聚合服务
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2) 下载 Nacos 服务器
https://nacos.io/zh-cn/docs/quick-start.html
如果安装了 git ,可以使用 git 下载
git clone https://github.com/alibaba/nacos.git
解压后,通过 cmd 启动 bin 目录
然后通过下列命令启动
startup.cmd -m standalone
3)在项目中注册微服务到 Nacos 中
- 在需要注册到配置中心的微服务项目 yml 文件中配置 Nocos 服务器地址以及当前服务名
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
application:
name: mall-coupon
- 在项目启动类中加入
@EnableDiscoveryClient
注解
4)访问 nacos 客户端首页,地址为http://127.0.0.1:8848/nacos —— Nacos 初始登录名和登录密码都为 nacos
3. 使用 Feign 进行服务的远程调用
Feign : 一个声明式的 HTTP 客户端
使用 Feign 远程调用其他服务步骤:
1) 导入 openfeign 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2) 创建 feign 包,在里面编写一个接口,其作用是告诉 springcloud,这个接口需要调用远程服务
3) 在接口中声明接口的每个方法调用的是远程服务的那个请求
代码示例:
package com.wanqing.mall.member.feign;
import com.wanqing.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient("mall-coupon") // 找 mall-coupon 位置
public interface CouponFeignService {
@RequestMapping("coupon/coupon/member/list")
public R memberCoupons();
}
解释:
- 在需要调用远程服务的接口处 ,使用 @FeignClient(“远程服务名”) 注释
- 接口中声明的方法为远程服务中的方法名
4)通过在项目启动类中加入@EnableFeignClients(basePackages = "feign包位置")
注释,开启远程调用功能
@EnableFeignClients(basePackages = "com.wanqing.mall.member.feign")
4. 使用 Nocas 作为配置中心
1)引入 Nacos 作为配置中心的依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2)创建 bootstrap.properties 文件,bootstrap.properties 文件内容为微服务名字和配置中心地址
spring.application.name=mall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
bootstrap.properties 文件创建位置:
3)需要给配置中心中添加一个数据集 Date-Id, 其默认名字为 应用名.properties ,然后为这个数据集中添加所有配置
4)在服务中设置动态获取并刷新配置 —— 优先使用配置中心的配置
- 在需要动态获取配置的类前加入
@RefreshScope
注解
@RefreshScope
- 使用
@Value("${配置项的值}")
获取配置的值
@Value("${user.uname}")
5. Nocas 配置中心细节
5.1 命名空间
命名空间的核心是为了实现配置隔离,其默认为 public , 默认新增的配置都在 public 空间下
- 命名空间可实现环境隔离
通过在 bootstrap.properties 配置文件中加入命名空间的唯一 id 配置,修改获取配置的命名空间
spring.cloud.nacos.config.namespace=cc753734-cca7-4ff0-b332-f627b34502dc
通过命名空间,可实现 开发环境、生产环境、测试环境的 隔离
- 基于每个微服务间互相隔离配置,即每个微服务都创建自己的命名空间
5.2 配置集
所以配置的集合就是配置集,类似配置文件
5.3 配置集 ID
配置集 ID 就是配置文件名字
5.4 配置分组
默认所有的配置集都属于 DEFAULT_GROUP
在创建配置时,可设置配置组,对不同的情况,我们可以使用不同的配置组的配置文件
通过在 bootstrap.properties 配置文件中加入配置组的唯一 id 配置,修改获取配置的配置组
spring.cloud.nacos.config.group=1111
命名空间和配置组项目中的用法:
- 每个微服务有其自己的命名空间
- 对每个微服务的命名空间使用配置分组区分其环境
# 该微服务的命名空间
spring.cloud.nacos.config.namespace=69fca09f-2013-433a-83fd-8d4397eff83c
# 该微服务当前配置使用的组
spring.cloud.nacos.config.group=dev
5.5 加载多配置集
在项目中,对不同位置的配置拆分成不同的配置文件
例如,将完整的 application.yml 文件拆分成关于数据源的,关于 mybatis 的配置文件 和其他等等配置,将其加入到 Nocas 中
通过在 bootstrap.properties 配置文件中加入如下配置,动态获取配置中心中的配置
# 加入配置文件及其分组
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[1].data-id=mybatis.yml
spring.cloud.nacos.config.extension-configs[1].group=dev
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[0].refresh=true
总结: 我们可以将微服务中所有配置配置到配置中心中,项目中只保留一 bootstrap.properties 配置文件即可