文章目录
1、BOM统一管理
- 配置:
<properties>
<!-- 声明 ${spring-cloud-alibaba.version}变量的地方,供后续依赖引用使用-->
<spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version>
</properties>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
-
作用:
这是Spring Cloud Alibaba 的 BOM(依赖管理)用于统一管理 Spring Cloud Alibaba 各个组件(如 Nacos、Sentinel、RocketMQ 等)的版本,防止版本冲突、版本不匹配问题 -
导入位置
需要放到父项目的pom.xml
件中这个配置是声明spring cloud alibaba的管理配置用,并不是依赖,只能放到下面依赖管理中:
<dependencyManagement> </dependencyManagement>
2、服务注册与服务发现
- 配置
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
-
作用
用于服务注册和服务发现 -
导入位置
任何涉及到服务注册和服务发现的子项目,都要在其pom.xml
中配置
3、负载均衡
配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
作用
顾名思义,确保在远程调用服务时,合理的分摊给可用服务器
导入位置
远程调用服务的发起方的`pom.xml`文件
注意事项
想要远程调用,还需要给restTemplate加上@LoadBalanced
注解:
@Configuration
public class BeanConfig {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
与此同时,调用的url要使用被调用服务的名称:
public OrderInfo selectOrderById(Integer id) {
OrderInfo orderInfo = orderMapper.selectOrderById(id);
//product-service是一个服务名称,根据实际服务名称填写
String url="http://product-service/product/"+orderInfo.getProductId();
ProductInfo forObject = restTemplate.getForObject(url, ProductInfo.class);//第二个参数是需要返回的参数类型
orderInfo.setProductInfo(forObject);
return orderInfo;
}
4、权重配置
权重概述
在nacos平台我们可以直接对某一个服务的权重进行修改(0-1)数值越大,当前服务承担的任务量越大:
当weight为0时,发起的请求不会通过这个服务。
配置
# 告诉nacos启用自己的负载均衡策略
spring:
cloud:
loadbalancer:
nacos:
enabled: true
导入位置
子项目src/main/resources路径下的application.yml
文件
作用
告诉nacos启用nacos的负载均衡策略
注意:
如果不开启nacos的负载均衡策略,weight只会在被识别为0(停止服务),或者1(开启服务)
5、同集群优先访问
集群概述
这里说的集群指的是服务器集群,也就是提供同种类型服务的服务器集合。这些集合可能被放置在不同的地理位置。不同地理位置的集群之间进行通信会有一定延迟,因此可以设置同集群优先访问的方式优先向里用户最近的服务器发起请求,来提升响应速度。
配置
spring:
cloud:
nacos:
discovery:
server-addr: 开启nacos的服务器的IP:端口号
cluster-name: 自定义的集群名称
导入位置
子项目src/main/resources路径下的application.yml
文件
注意:
同集群优先访问需要开启nacos的负载均衡策略才会生效,也就是第4点中的配置!!!
6、临时和非临时实例
概述
临时和非临时实例涉及nacos对客户端的健康检查机制,nacos健康检查机制有两种:
客户端主动上报机制:
- 客⼾端通过⼼跳上报⽅式告知服务端(nacos注册中⼼)健康状态, 默认⼼跳间隔5秒;
- nacos会在超过15秒未收到⼼跳后将实例设置为不健康状态, 超过30秒将实例删除;
- nacos中临时实例使用的就是主动上报机制;
服务器反向探测机制:
- nacos主动探知客⼾端健康状态(发送信息,看客服端是否有反应), 默认间隔为20秒;
- 健康检查失败后(客户端没有反应)实例会被标记为不健康, 不会被⽴即删除;
- nacos中非临时实例使用的时反向探测机制;
配置
spring:
cloud:
nacos:
discovery:
ephemeral: false # 设置为⾮临时实例 / ephemeral是短暂的意思
导入位置
子项目src/main/resources路径下的application.yml
文件
常见问题
1、Nacos服务实例类型不允许改变
出现如下报错:
errMsg: Current service DEFAULT_GROUP@@product-service is
ephemeral service, can't register persistent instance. ;
原因:
Nacos会记录每个服务实例的IP和端⼝号, 当发现IP和端⼝都没有发⽣变化时, Nacos不允许⼀个
服务实例类型发⽣变化, ⽐如从临时实例,变为⾮临时实例, 或者从⾮临时实例, 变成临时实例
解决办法:
- 停掉nacos
- 删除nacos ⽬录下 /data/protocol/raft 信息, ⾥⾯会保存应⽤实例的元数据信息
2、服务正常,但是健康状态显示为false
解决办法:
如何解决健康检查不通过的问题-阿里云帮助中心
7、环境隔离
概述
在程序开发过程中,服务器需要分为开发环境、测试环境、发布环境等。
nacos也提供了这样的支持。nacos使用namespace(命名空间)对不同服务器环境进行隔离,每个环境之间服务是不可见的。
配置
1、创建namespce
这一步相当于定义不同的服务器环境。首先打开nacos控制台点击命名空间,创建自定的环境,可以创建多个,pulic是默认的命名空间无法。
创建后会有一个命名空间的ID:
2、添加配置
spring:
cloud:
nacos:
discovery:
#下面是刚才创建的自动生成的命名空间ID
namespace: f7336070-5de6-451e-823a-9f78f42a398e
配置文件的地址是:子项目src/main/resources路径下的
application.yml
文件
作用
用于区分不同的开发环境
8、配置中心
概述
nacos提供了配置中心的服务,便于我们统一的管理修改naocs的相关配置信息
配置
nacos控制台
配置管理->配置列表->创建配置,定义DataID以及配置项:
DataID可以先填写项目名称,等一下会重点讲解这个字段。
加入测试的配置文件点击发布即可:
获取配置
- 引⼊Nacos Config依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud 2020.*之后版本需要引⼊bootstrap-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
- 加入bootstrap配置文件
yml和properties格式都可以,把这个配置文件放到application.yml相同路径中:
bootstrap会比apllication配置文件更早进行加载
配置内容:
spring:
application:
# 这里的name要和nacos控制台中DataID匹配,才能准确读取对应配置信息
name: product-service
cloud:
nacos:
config:
server-addr: nacos控制台IP地址:端口号
#下面如果设置namespace会从指定的命名空间下去读取配置文件
namespace: f7336070-5de6-451e-823a-9f78f42a398e
- 编写程序
package com.hyy.product.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/config")
@RefreshScope//热更新,nacos配置中心配置文件更改后,会自动加载最新更新的配置文件
public class NacosController {
//通过value关键字从nacos配置中心获取配置信息
@Value("${nacos.test.num}")
private Integer num;
@RequestMapping("/get")
public Integer get(){
return num;
}
}
- 访问接口
这样我们就从配置中心获取配置了。
DataID
完整格式:
${prefix}-${spring.profiles.active}.${file-extension}
-
prefix
默认值为spring.application.name
。(这是我们刚才为什么设置成项目名称的原因) 也可以通过配置项
spring.cloud.nacos.config.prefix
来自定义。 -
spring.profiles.active
即当前环境对应的 profile。
当spring.profiles.active
为空时,对应的连接符-
也将不存在,
dataId 的拼接格式会变成:${prefix}.${file-extension}
-
file-extension
为配置内容的数据格式,可以通过配置项
spring.cloud.nacos.config.file-extension
来配置。
目前仅支持properties
和yaml
类型。如果没有这个配置默,文件类型默认是properties
。
微服务启动时会读取多个配置文件,配置文件的读取优先级:
product-service-dev.properties > product-service.properties > product-service