依赖对应关系
一,项目搭建(knife4j+druid+mybatis-plus+spring.cloud.alibaba+spring-cloud)
spring-cloud-alibaba 父工程
<!-- 父工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
</parent>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<spring.cloud.version>Hoxton.SR3</spring.cloud.version>
<spring.cloud.alibaba.version>2.2.1.RELEASE</spring.cloud.alibaba.version>
<fastjson.version>1.2.83</fastjson.version>
<mysql-connector.version>8.0.11</mysql-connector.version>
<!-- 数据库 -->
<druid-spring-boot-starter.version>1.2.11</druid-spring-boot-starter.version>
<druid.version>1.2.11</druid.version>
<!-- mybatis plus -->
<mybatis-plus-boot-starter.version>3.5.1</mybatis-plus-boot-starter.version>
<!-- mybatis代码生成器 -->
<mybatis-plus-generator.version>3.5.3</mybatis-plus-generator.version>
<!-- mybatis代码生成器,所需要的“velocity模板引擎” -->
<velocity-engine-core.version>2.3</velocity-engine-core.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-alibaba-dependencies -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector.version}</version>
</dependency>
<!-- mybatis plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus-boot-starter.version}</version>
</dependency>
<!-- mybatis代码生成器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>${mybatis-plus-generator.version}</version>
</dependency>
<!-- mybatis代码生成器,所需要的“velocity模板引擎” -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>${velocity-engine-core.version}</version>
</dependency>
<!-- 德鲁伊配置 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid-spring-boot-starter.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- **********************swagger start ********************** -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<!-- 引入swagger-bootstrap-ui包 -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>1.8.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>3.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>3.0.0</version>
</dependency>
<!-- **********************swagger end ********************** -->
</dependencies>
</dependencyManagement>
shop-common(通用模块)
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<!-- mybatis plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<!-- mybatis代码生成器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
</dependency>
<!-- mybatis代码生成器,所需要的“velocity模板引擎” -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
</dependency>
<!-- **********************swagger start ********************** -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
</dependency>
<!-- 引入swagger-bootstrap-ui包 -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
</dependency>
<!-- **********************swagger end ********************** -->
</dependencies>
shop-user(用户服务)
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.majinwen</groupId>
<artifactId>shop-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.majinwen</groupId>
<artifactId>shop-data</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
shop-data (数据库数据操作相关)
<dependencies>
<dependency>
<groupId>org.majinwen</groupId>
<artifactId>shop-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
二,nocas服务治理
1.介绍
== Spring Cloud Alibaba Nacos Discovery
Nacos 是一个 Alibaba 开源的、易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
使用 Spring Cloud Alibaba Nacos Discovery,可基于 Spring Cloud 的编程模型快速接入 Nacos 服务注册功能。
=== 服务注册/发现: Nacos Discovery
服务发现是微服务架构体系中最关键的组件之一。如果尝试着用手动的方式来给每一个客户端来配置所有服务提供者的服务列表是一件非常困难的事,而且也不利于 服务的动态扩缩容。Nacos Discovery 可以帮助您将服务自动注册到 Nacos 服务端并且能够动态感知和刷新某个服务实例的服务列表。除此之外,Nacos Discovery 也将服务实例自身的一些元数据信息-例如 host,port, 健康检查URL,主页等内容注册到 Nacos。Nacos 的获取和启动方式可以参考 nacos.io/zh-cn/docs/… 官网]。
2.nacos作为注册中心实现步骤
(1)下载安装naocs-server
下载地址:https://github.com/alibaba/nacos/releases
(2)启动nocas
windows启动命令: startup.cmd -m standalone
访问 http://192.168.8.230:8848/nacos
(3)如何引入 Nacos Discovery 进行服务注册/发现
如果要在您的项目中使用 Nacos 来实现服务注册/发现,使用 group ID 为 com.alibaba.cloud 和 artifact ID 为 spring-cloud-starter-alibaba-nacos-discovery 的 starter。
<!--nacos客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
(4)配置nacos注册中心地址
#application.prpoerties
spring.cloud.nacos.discovery.server-addr = 127.0.0.1:8848
(5)启动类增加注解@EnableDiscoveryClient
/**
* @author xiaojing
*/
@EnableDiscoveryClient
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
(6)启动服务
三,微服务之间的调用
1,使用RestTemplate调用
(1).无负载均衡的普通调用 也可自定义策略 比较繁琐(不推荐)
通过 DiscoveryClient 获取服务的信息 通过ip的端口调用 这种方式
@Autowired
RestTemplate restTemplate;
@Autowired
DiscoveryClient discoveryClient;
@ApiOperation("测试调用商品服务")
@GetMapping("/testCallProduct")
public void testCallProduct(){
// 获取service-product的所有服务实例
final List<ServiceInstance> instances = discoveryClient.getInstances("service-product");
final int index = new Random().nextInt(instances.size());
final String forObject = restTemplate.getForObject("http://" + instances.get(index).getHost() + ":" + instances.get(index).getPort() + "/product/test", String.class);
System.out.println(forObject);
}
// 自定义负载均衡 随机策略
@ApiOperation("测试调用商品服务")
@GetMapping("/testCallProduct")
public void testCallProduct(){
// 获取service-product的所有服务实例
final List<ServiceInstance> instances = discoveryClient.getInstances("service-product");
final int index = new Random().nextInt(instances.size());
final String forObject = restTemplate.getForObject("http://" + instances.get(index).getHost() + ":" + instances.get(index).getPort() + "/product/test", String.class);
System.out.println(forObject);
}
(2).基于Ribbon 负载均衡 使用RestTemplate 调用
Nacos Discovery 适配了 Netflix Ribbon,可以使用 RestTemplate 或 OpenFeign 进行服务的调用。
Ribbon 负载均衡策略配置 七种负载均衡策略
stock-service:
ribbon:
#随机选择server
# NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #指定使用Nacos提供的负载均衡策略(优先调用同一集群的实例,基于随机&权重)
#按照顺序选择server(ribbon默认策略)
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.RoundRobinRule
#在一个配置时间段内,当选择server不成功,则一直尝试选择一个可用的server
#NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.RetryRule
#逐个考察server,如果server断路器打开,则忽略,再选择其中并发链接最低的server
#NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.BestAvailableRule
#过滤掉一直失败并被标记为circuit tripped的server,过滤掉那些高并发链接的server(active connections超过配置的阈值)
#NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.AvailabilityFilteringRule
#根据server的响应时间分配权重,响应时间越长,权重越低,被选择到的概率也就越低。响应时间越短,权重越高,被选中的概率越高,这个策略很贴切,综合了各种因素,比如:网络,磁盘,io等,都直接影响响应时间
#NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.ResponseTimeWeightedRule
#ZoneAvoidanceRule
#NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.ZoneAvoidanceRule
//只需要在RestTemplate注入容器时加上LoadBalanced注解
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Autowired
RestTemplate restTemplate;
@Autowired
DiscoveryClient discoveryClient;
@ApiOperation("测试调用商品服务")
@GetMapping("/testCallProduct")
public void testCallProduct() {
// 获取service-product的所有服务实例
final List<ServiceInstance> instances = discoveryClient.getInstances("service-product");
final int index = new Random().nextInt(instances.size());
final String forObject = restTemplate.getForObject("http://service-product/product/test", String.class);
System.out.println(forObject);
}
2.OpenFeign 远程调用
**springcloudopenfeign中文文档地址: **springdoc.cn/spring-clou…
(1)引入依赖
<!--opengfiegn-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
(2)启动类加上注解 @EnableFeignClients
/**
* @Description:
* @Author: 爱吃橙子的
* @Date: 2023/8/23
**/
@SpringBootApplication
@MapperScan(basePackages = "com.majinwen.dao")
@EnableDiscoveryClient
@EnableFeignClients
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class,args);
}
}
(3)定义接口 接口加上注解 @FeignClient
/**
* @Description:
* @Author: 爱吃橙子的
* @Date: 2023/8/25
**/
@FeignClient("service-product")
public interface ProductFeignClient {
@GetMapping("/product/test")
String test();
}
四,服务容错
常见容错方案
隔离
它是指将系统按照一定的规则划分为若干个服务模块,各个模块之间相对独立,无强依赖。当有故障发生时,能将问题和影响隔离在某个模块内部,而不扩散风险,不涉及其他模块,不影响整体的系统服务。常见的隔离方式有:线程池隔离和信号量隔离。
超时
在上游服务调用下游服务时,设置一个最大响应时间,如果超过这个时间,下游未作出反应,就断开请求,释放掉线程。
限流
限流就是限制系统的输入和输出流量已达到保护系统的目的,为了保证系统的稳定运行,一旦达到需要限制的阈值,就需要限制流量并采取少量措施以完成限制流量的目的。
熔断
在互联网系统中,当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用。这种牺牲局部,保全全体的措施叫做熔断。熔断一般有三种 状态:
熔断关闭状态:服务没有故障时,熔断器所处的状态,对调用方的调用不做任何限制。
熔断开启状态:后续对该服务接口的调用不再经过网络,直接执行本地的fallback方法。
半熔断状态:尝试恢复服务调用,允许有限的流量调用该服务,并监控调用成功率,如果成功率达到预期,则说明服务已经恢复,进入熔断关闭状态。如果成功率很低,则重新进入熔断关闭状态。
降级
降级其实就是为服务提供一个托底方案,一旦服务无法正常调用,就是用托底方案。
常见容错组件
Hystrix
Hystrix是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者是第三方库,防止级联失败,从而提升系统的可用性和容错性。
Resilience4J
Resilience4J是一款轻量级、简单、文档清晰、丰富的熔断工具,这也是Hystrix官方推荐的替代产品,不仅如此,Resilience4J还原生支持SpringBoot,而且监控也支持和promettheus等多款主流产品进行整合。
Sentinel
Sentinel是阿里巴巴开源的一款断路器实现,本身在阿里内部已经被大规模采用,非常稳定。
微服务集成Sentinel
文档:sentinelguard.io/zh-cn/docs/…
-
引入 Sentinel 依赖
<!-- sentinel--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
2.安装启动控制台
redis下载地址:github.com/tporadowski…
控制台的下载地址:github.com/alibaba/Sen…
控制台的启动命令
java -jar sentinel-dashboard.jar
3.启动应用
(1)增加配置,在应用的 /src/main/resources/application.properties 中添加基本配置信息
#sentienl的配置
spring.application.name=service-user
server.port=8071
spring.cloud.sentinel.transport.dashboard=localhost:8080
(2)启动应用,支持 IDE 直接启动和编译打包后启动。 (3)调用应用的接口
4.配置限流规则并验证
- 访问 http://localhost:8080 页面,可以在左侧看到 Sentinel-Example 应用已经注册到了控制台,单击 流控规则 ,可以看到目前的流控规则为空。
注意:如果您在控制台没有找到应用,请调用一下进行了 Sentinel 埋点的 URL 或方法,因为 Sentinel 使用了 lazy load 策略。详细的排查过程请参见 Sentinel FAQ。
- 配置 URL 限流规则:点击新增流控规则,资源名填写需要限流的 URL 相对路径,单机阈值选择需要限流的阈值,点击新增进行确认。(为了便于演示效果,这里将值设置成了 10)。
- 配置自定义限流规则:点击新增流控规则,资源名填写
@SentinelResource注解value字段的值,单机阈值选择需要限流的阈值,点击新增进行确认。(为了便于演示效果,这里将值设置成了 1)。
-
访问 URL,当 QPS 超过 10 时,可以看到限流效果如下。
超过10的拒绝
五.nacos配置中心
1.依赖引入
<!-- nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.配置 Nacos
项目中默认配置文件是 application.properties ,Nacos 配置加在此配置文件中的话,应用启动会报连接 Nacos 失败,需要创建 bootstrap.properties 或 bootstrap.yml 配置文件(添加任意一个即可),下面以 bootstrap.yml 为例:
spring:
application:
name: service-user
cloud:
nacos:
#nacose作为注册中心服务器ip和端口
discovery:
server-addr: 127.0.0.1:8848
#nacose作为配置中心服务器ip和端口
config:
server-addr: 127.0.0.1:8848
#DataId的前缀,默认值为应用名称
prefix: ${spring.application.name}
group: DEFAULT_GROUP
#DataId的后缀,同时也是配置内容的文件格式
file-extension: yaml
#配置的编码
encode: UTF-8
#获取配置的超时时间 单位为 ms
timeout: 3000
#配置的命名空间 常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源隔离等。
namespace: 763c7dbd-d086-42cd-9825-93b9cfe24508
refresh-enabled: true
shared-configs:
# 配置支持共享的 Data Id
- data-id: common.yaml
# 配置 Data Id 所在分组,缺省默认 DEFAULT_GROUP
group: DEFAULT_GROUP
# 配置Data Id 在配置变更时,是否动态刷新,缺省默认 false
refresh: true
# 引入扩展配置(同一分组或不同分组)
extension-configs:
# 配置支持共享的 Data Id
- data-id: comm.yaml
# 配置 Data Id 所在分组,缺省默认 DEFAULT_GROUP
group: DEFAULT_GROUP
# 配置Data Id 在配置变更时,是否动态刷新,缺省默认 false
refresh: true
3.加载 Nacos 配置中心配置项
在初始化类中添加 @EnableDiscoveryClient 注解即可:
/**
* @Description:
* @Author: 爱吃橙子的
* @Date: 2023/8/23
**/
@SpringBootApplication
@MapperScan(basePackages = "com.majinwen.dao")
@EnableDiscoveryClient
@EnableFeignClients
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class,args);
}
}
4.Nacos 配置中心配置项动态生效
前置条件:
bootstrap 配置文件中 nacos 的配置项 refresh-enabled: true(默认开启)
# 开启监听和自动刷新,动态感知配置变化,默认值:true
spring.cloud.nacos.config.refresh-enabled=true
方式一:@Value + @RefreshScope 获取最新值
@RestController
@RefreshScope // 配置项动态生效
public class TestController {
@NacosValue(value = "${test.data}", autoRefreshed = true)
private String data;
@Value(value = "${test.data}")
private String datas;
@GetMapping("test")
public String test() {
return "data :" + data + ",datas="+datas;
}
}
方式二:通过 applicationContext.getEnvironment.getProperty 获取最新值
@SpringBootApplication
public class NacosConfigSimpleApplication {
public static void main(String[] args) throws InterruptedException {
ConfigurableApplicationContext applicationContext =
SpringApplication.run(NacosConfigSimpleApplication.class, args);
//取到Spring的配置环境
while(true){
ConfigurableEnvironment environment = applicationContext.getEnvironment();
String username = environment.getProperty("user.name");
String age = environment.getProperty("user.age");
System.out.println("username:"+username+" | age:"+age);
TimeUnit.SECONDS.sleep(1);
}
}
}
5.配置文件读取优先级:
profile > 默认 > extension-configs(数组下标越大优先级越大) > shared-configs(数组下标越大优先级越大) 数组下标越大优先级越大 即 数组中后面引入的会覆盖前面引入的相同项
6.支持 profile 粒度的配置
spring-cloud-starter-alibaba-nacos-config 在加载配置的时候, 不仅加载了以 dataid 为 {file-extension:properties} 为前缀的文件,
还加载了 dataid 为 {profile}.${file-extension:properties} 的基础配置。
在日常开发环境中,若是遇到多套配置的情况,可以使用 spring 提供的 ${spring.profiles.active} 这个配置项配置选择哪个配置
#选择加载的文件为application-dev.properties
spring.profiles.active=dev
注意:
只有默认的配置文件才能结合 profile 使用;除了默认配置文件,其它配置文件(例如:dev)都需要写上后缀。并且后缀必须跟配置的 boostrap.properties 中配置的扩展名(spring.cloud.nacos.config.file-extension=?)一致 默认配置文件:跟服务名spring.application.name相同的DataId的配置文件(无文件扩展名),称之为默认配置文件
7.nacos数据持久化到数据库
1.配置db信息
找到Nacos的安装目录,然后找到配置文件 : conf/application.properties配置文件,添加db相关的信息如下:
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
提示:这里选择的是mysql数据库,并且配置dataSource的四要素,数据库为Nacos。
2.创建相关的表
以2.2.3版本为例 在Nacos安装目录中有一个 conf/mysql-schema.sql 脚本文件,这个是Nacos自带的,你需要创建一个数据库“nacos” 根我们上一个步骤配置的db.url中的数据库保持一致。如下:
到这里其实我们已经完成了持久化的配置,Nacos中的数据会自动持久到Mysql中,重启Nacos也不怕数据的丢失,您可以自己测试一下看看 。数据持久化是Nacos集群的基石。
当然,要做集群是一定要做持久化,做了持久化不一定非得做集群。
8.nacos增加认证
1.修改配置
2.x版本默认是不需要认证的
nacos安装目录下面 /conf/application.properties
### If turn on auth system:
nacos.core.auth.system.type=nacos
nacos.core.auth.enabled=true
2.自定义秘钥
开启鉴权之后,你可以自定义用于生成JWT令牌的密钥,nacos安装目录 /conf/application.properties中的配置信息为:
### The default token (Base64 String):
nacos.core.auth.plugin.nacos.token.secret.key= eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkiLCJleHAiOjE2OTM0NjQ0MzYsImlhdCI6MTY5MzQ2NDQyNn0.c_yOfoXpGmtCX1-KMvWQeD9qAiu-CVhYMXxVrr9ex48
### Since 1.4.1, worked when nacos.core.auth.enabled=true and nacos.core.auth.enable.userAgentAuthWhite=false.
### The two properties is the white list for auth and used by identity the request from other server.
nacos.core.auth.server.identity.key= nacos
nacos.core.auth.server.identity.value= nacos
服务的bootstrap.yaml 增加配置
spring.cloud.nacos.username = nacos
spring.cloud.nacos.password = nacos