【微服务】服务注册与发现、分布式配置管理 - Nacos

概述

Nacos是阿里巴巴旗下的一个开源产品,目前市场使用率还是比较高的。在最初开源时,Nacos选择内部三个产品合并并统一开源,这三个产品分别是:非持久化注册中心(Configserver)、持久化注册中心(VIPServer)以及配置中心(Diamond)。Nacos官方将其定位为一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。因此Nacos不仅仅可以用来进行服务注册和发现,还可以用来进行分布式配置管理,当然还有其他功能,这里不做过多介绍。

截至目前,Nacos几乎支持了所有的主流语言,比如:Java、Go、C++、Nodejs、Python等等。

经过前面的介绍大家已经对另外两个产品Eureka和Consul有了一定的了解。从我学习之后的角度来看,我个人认为Nacos完胜Eureka和Consul。首先,Eureka只能用于服务注册和发现,并且它自身还得搭建一个服务,更重要的是它界面还是英文的,更难受了,所以Eureka完败。其次,Consul的功能和Nacos差不多,都可以用于服务注册和发现以及分布式配置管理,但是我认为Nacos在一些细节上做的比Consul好很多,具体功能见下述介绍。

安装

1. 在官网上找到对应下载版本,我下载的是2.2.3版本。

2. 解压下载好的文件

在bin目录中存放的是Naocs的启停脚本,cmd结尾的表示是windows平台的启停脚本、sh结尾的则是Linux平台的启停脚本。

conf目录中放的是Nacos的配置文件。

target目录中放的是存放Nacos应用的jar包。

3. 启动Nacos

在初始环节,都是使用单机版本来学习测试,但是Nacos中默认的则是集群模式,所以需要在启动命令上加入standalone,表示单机版本。启动命令为startup.cmd -m standalone。

4. 关闭Nacos

关闭Nacos时,使用命令shutdown.cmd即可,不过其实直接关闭小黑框就行。

5. 打开Nacos管理界面

输入URL:127.0.0.1:8848,出现如下画面证明启动成功:

服务注册与发现

和学习Consul时一样,重新建立两个模块来学习Nacos。

搭建商品服务

建模块

写pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.wbz</groupId><artifactId>spring-cloud-test</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>cloud-alibaba-provider-product-nacos-8201</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!--注册中心--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--Lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--Druid--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId></dependency><!--MySQL驱动--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><!--MP--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId></dependency></dependencies></project>

相较于基础工程的pom依赖,新增了一个Nacos注册中心的依赖:

        <!--注册中心--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>

写yml文件

server:port: 8201spring:application:name: cloud-alibaba-provider-product-nacos-8201cloud:nacos:discovery:server-addr: 127.0.0.1:8848service: ${spring.application.name}mvc:pathmatch:matching-strategy: ant_path_matcher # 路径匹配策略datasource:url: jdbc:mysql://127.0.0.1:3306/cloud_product?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&allowMultiQueries=trueusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverprofiles:active: devmybatis-plus:configuration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImplmapper-locations: classpath:mapper/**Mapper.xmltype-aliases-package: com.wbz.domain

相较于基础工程的yml文件,新增了一个Nacos注册中心的配置文件信息:

spring:cloud:nacos:discovery:server-addr: 127.0.0.1:8848service: ${spring.application.name}

改主启动类

@MapperScan("com.wbz.mapper")
@SpringBootApplication
public class ProductProviderApplicationAlibabaNacos8201 {public static void main(String[] args) {SpringApplication.run(ProductProviderApplicationAlibabaNacos8201.class, args);}}

写业务类

// model
/*** 产品表*/@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("product_detail")
public class Product {@TableIdprivate Long id;@TableFieldprivate String productName;@TableFieldprivate Long productPrice;@TableFieldprivate Integer state;@TableField@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private LocalDateTime createTime;@TableField@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private LocalDateTime updateTime;}// 持久层接口
public interface ProduceMapper extends BaseMapper<Product> {
}// 服务层接口
public interface ProductService extends IService<Product> {Product getProductById(Long productId);}// 服务层实现类
@Service
public class ProductServiceImpl extends ServiceImpl<ProduceMapper, Product> implements ProductService {@Overridepublic Product getProductById(Long productId) {return this.getById(productId);}}// 控制层类
@RestController
@RequestMapping("/product")
public class ProductController {@Resourceprivate ProductService productService;@GetMapping("/query/{productId}")public Product getProductById(@PathVariable Long productId) {return this.productService.getProductById(productId);}}

测试项目

启动项目之后,输入URL:127.0.0.1:8201/product/query/1001,出现如下画面就算搭建成功:

搭建订单服务

建模块

写pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.wbz</groupId><artifactId>spring-cloud-test</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>cloud-alibaba-consumer-order-nacos-82</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!--注册中心--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--Lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--Druid--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId></dependency><!--MySQL驱动--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><!--MP--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId></dependency><!--负载均衡--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency></dependencies></project>

相较于基础工程,工程新增的pom依赖就是注册中心,并且直接加上了负载均衡,否则还会报错:

        <!--注册中心--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--负载均衡--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>

写yml文件

server:port: 82spring:application:name: cloud-alibaba-consumer-order-nacos-82cloud:nacos:discovery:server-addr: 127.0.0.1:8848service: ${spring.application.name}mvc:pathmatch:matching-strategy: ant_path_matcher # 路径匹配策略datasource:url: jdbc:mysql://127.0.0.1:3306/cloud_order?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&allowMultiQueries=trueusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverprofiles:active: devmybatis-plus:configuration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImplmapper-locations: classpath:mapper/**Mapper.xmltype-aliases-package: com.wbz.domain

相较于基础工程,新增的yml文件就是配置注册中心的配置信息:

spring:cloud:nacos:discovery:server-addr: 127.0.0.1:8848service: ${spring.application.name}

改主启动类

@MapperScan("com.wbz.mapper")
@SpringBootApplication
public class OrderConsumerApplicationAlibabaNacos82 {public static void main(String[] args) {SpringApplication.run(OrderConsumerApplicationAlibabaNacos82.class, args);}}

写业务类

// JavaBean
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("order_detail")
public class Order {@TableIdprivate Long id;@TableFieldprivate Long userId;@TableFieldprivate Long productId;@TableFieldprivate Integer num;@TableFieldprivate Long price;@TableFieldprivate Integer deleteFlag;@TableField@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private LocalDateTime createTime;@TableField@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private LocalDateTime updateTime;@TableField(exist = false)private Product product;}// RestTemplate控制类
@Configuration
public class RestTemplateConfig {@Bean    @LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}}// mapper层
public interface OrderMapper extends BaseMapper<Order> {
}// service接口
public interface OrderService extends IService<Order> {Order getOrderById(Integer id);}// service实现类
@Slf4j
@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {@Resourceprivate RestTemplate restTemplate;private final String PRODUCT_SERVICE_NAME = "cloud-alibaba-provider-product-nacos-8201";@Overridepublic Order getOrderById(Integer id) {// 获取订单Order order = this.getById(id);// 拼接urlString url = "http://" + this.PRODUCT_SERVICE_NAME + "/product/query/" + order.getProductId();log.info(url);// 远程调用Product product = this.restTemplate.getForObject(url, Product.class);order.setProduct(product);// 返回结果return order;}}// controller实现类
@RestController
@RequestMapping("/order")
public class OrderController {@Resourceprivate OrderService orderService;@GetMapping("/query/{id}")public Order getOrderById(@PathVariable Integer id) {return this.orderService.getOrderById(id);}}

注意添加上负载均衡的注解。

测试项目

项目启动之后,输入URL:127.0.0.1:82/order/query/1,出现如下界面就算搭建成功:

两个模块都启动并测试成功之后,打开Nacos的管理界面,会出现如下内容:

特性一:负载均衡

复制商品服务,观察负载均衡是否成功

对于如何启动多个实例,在负载均衡中已经进行过简单介绍,不了解的同学可以移步去看一下。我是启动了三个实例,然后进行测试,发现负载均衡算法是轮询的方式。

权重配置

所谓的权重配置,就是给每个服务配置不相同的权限,这样当请求过来,再次进行负载均衡的时候,就不再会按照轮询的方式进行发送请求。

点击详情进去

点击编辑进去

点击权重进行修改,每个权重默认的大小是1,可以把其中一个修改成0.1,其他不变。

修改之后,刷新页面,在权重一列就可以看到改变了。

多次发送请求查看效果,发现好像还是轮询机制,并没有用到权重,这是因为默认使用SpringCloudLoadBalancer的策略,所以我们需要新增一个配置文件。由于这是客户端负载均衡,所以我们只需要在订单服务中加一个配置文件即可:

spring:cloud:loadbalancer:nacos:enabled: true

加上之后,再次进行测试,发现8203端口号的被调用次数明显变少了。

服务下线

在下述页面还有一个下线功能,单机之后,服务就会下线,此后服务就不会再接收请求,直到再次单机上线。

服务下线功能也需要加上负载均衡配置才能生效。 

同集群优先访问

Nacos把同一个机房内的实例,划分为一个集群,所以同集群优先访问,在一定程度上可以理解为同机房优先访问。假设商品服务有机房在上海,有机房在北京,而订单服务机房在上海,肯定是优先访问上海机房,如果上海机房无响应,那才会访问北京机房,有点就近原则的意思。

给订单服务配置集群信息,设置在上海:

spring:cloud:nacos:discovery:server-addr: 127.0.0.1:8848service: ${spring.application.name}cluster-name: SH #集群名称: 上海集群loadbalancer:nacos:enabled: true

 给一个订单服务设置集群信息在上海,一个设置在北京:

spring:cloud:nacos:discovery:server-addr: 127.0.0.1:8848service: ${spring.application.name}cluster-name: SH #集群名称: 上海集群loadbalancer:nacos:enabled: true
-DServer.port=8202 -Dspring.cloud.nacos.discovery.cluster-name=BJ

重启服务之后,多次访问接口,发现北京的不被调用。将上海机房的下线,再次进行调用,此时北京机房的才可以被调用。

特性二:健康检查机制

Nacos作为注册中心,需要感知服务的健康状态,才能为服务调用提供更好的服务。Nacos提供了两种健康检查机制:

1. 客户端主动上报机制:

  • 客户端通过心跳上报方式告知Nacos健康状态,默认心跳间隔5秒。
  • Nacos会在超过15秒未接收到心跳后将其设置为不健康状态,超过30秒实例将被删除。

2. 服务端反向探测机制:

  • Nacos主动探知客户健康状态,默认间隔为20秒。
  • 健康检查失败后实例会被标记为不健康,不会被立即删除。

特性三:服务实例类型

Nacos的服务实例分为临时实例和非临时实例。

  • 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认都是服务实例。
  • 非临时实例:如果实例宕机,不会从服务列表中删除,也可以叫永久实例。

Nacos对两种实例的健康检查机制是不一样的,临时实例是客户端上报机制,非临时实例则是服务端反向探测机制。

在配置文件中进行配置,非永久实例就可以变成永久实例。

spring:cloud:nacos:discovery:server-addr: 127.0.0.1:8848service: ${spring.application.name}ephemeral: false # 非临时实例

重启项目之后,发现还是临时实例或者直接报错,那么就是因为Nacos已经存储了实例的类型,所以会收到影响,可以先停掉Nacos,然后将Nacos的data文件中的protocol文件删除,然后再次重启,就会发现设置成功,如下图:

设置为非临时实例之后,即使停掉服务,该实例也会存在,不会删除。 

数据模型

在微服务项目中有很多的服务,每个服务都有相对的开发环境、测试环境、生产环境等等,那么如何对这些微服务配置进行分组和命名空间管理呢?

Nacos采用了分层处理:Namespace、Group、DataId。

DataId

每一个配置文件在Nacos中都有一个唯一标识符,称为DataId。DataId的命名格式为${prefix}-${spring.profiles.active}.${file-extension}。prefix默认是spring.application.name的值,也可以通过spring.cloud.nacos.config/discovery.prefix来配置;spring.profiles.active即对应当前的项目环境;file-extension为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config/discovery.file-extension来配置,目前只支持两种格式,properties和yaml,默认是properties。

微服务启动时,会从Nacos读取多个配置文件(三种):

1. ${prefix}-${spring.profiles.active}.${file-extension}

2. ${prefix}.${file-extension}

3. ${prefix}

Group

Group是对配置文件进行分组的意思,不同的配置可以归属到不同的组中,例如按照微服务的业务模块进行分组。默认是DEFAULT_GROUP。

Namespace

Namespace是最外一层,主要用来实现隔离,例如测试环境、开发环境、生产环境等都可以分开命名,这样就不会互相干扰。

需要注意的是,注册中心的命名与配置中心的命名没有任何关系,即使他们的名字相同,那也没有关系,他们之间是完全隔离的。并且,即使都是配置中心的,不同命名之间也没有任何关系。

测试

建模块

改pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.wbz</groupId><artifactId>spring-cloud-test</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>cloud-alibaba-config-nacos-20020</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!--配置中心--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!--bootstrap--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency><!--注册中心--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies></project>

改yml文件

server:port: 20020 # 端口号spring:application:name: cloud-alibaba-config-nacos-20020 # 服务名cloud:nacos:server-addr: 127.0.0.1:8848 # nacos的地址discovery:namespace: c2d6616a-114e-4012-af31-bc65d944a249 # 命名空间group: DEFAULT_GROUP # 组service: {spring.application.name} # 服务名config:namespace: ${spring.cloud.nacos.discovery.namespace} # 命名空间group: ${spring.cloud.nacos.discovery.group} # 组prefix: ${spring.application.name} # DataId的第一个组成部分file-extension: yml # DataId的第三个组成部分shared-configs: # 共享配置- group:- data-id:- refresh: trueextension-configs: # 扩展配置- group:- data-id:- refresh: true# 主配置 > 扩展配置 > 共享配置(扩展配置和共享配置都可以配置多个)# 扩展配置主要用来 修改共享配置中的一些内容# 例如共享配置中配置了url,但是该服务并不一样,所以就要进行修改profiles:active: dev # 环境,也是DataI的第二个组成部分

写主启动类

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

写业务代码

@RequestMapping("/config")
@RestController
public class ConfigController {@Value("${upper}")private String cloudAlibabaConfigNacos20020DevYml;@Value("${middle}")private String cloudAlibabaConfigNacos20020Yml;@Value("${lower}")private String cloudAlibabaConfigNacos20020;// 用来测试DataId三种文件都会读取的内容@GetMapping("/test")public void test() {System.out.println(cloudAlibabaConfigNacos20020DevYml);System.out.println(cloudAlibabaConfigNacos20020Yml);System.out.println(cloudAlibabaConfigNacos20020);}}

 Nacos上创建一个config的命名空间,然后创建如下三个文件,三个文件中的内容依次是upper、middle、lower。

项目只要能启动成功,其实就证明没有问题。 

如果想要实现动态刷新的话,其实也只需要加上@RefreshScope注解在对应的类上。其实像这种注解都是官方来定义的,然后开发组件的公司只需要定义背后的方法即可。

分布式配置管理

这里就不过多介绍,有对分布式配置管理不熟悉的可以去Consul文章中查看具体内容。

首先在命名空间创建一个dev,表示是生产环境的代码。

然后在配置管理中创建两个配置文件,并且都属于DEFAULT_GROUP。

订单服务配置管理

引入依赖

由于要引入分布式配置管理,所以引入阿里巴巴配置中心的依赖和bootstrap配置文件的依赖。

        <!--配置中心--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!--bootstrap--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency>

修改配置文件 

新建一个bootstrap.yml文件,并将原先的application.yml文件进行分门别类的放到Nacos的远程配置文件和bootstrap.yml配置文件中。

# bootstap.yml上的配置文件
spring:application:name: cloud-alibaba-consumer-order-nacos-82cloud:nacos:server-addr: 127.0.0.1:8848discovery:service: ${spring.application.name}cluster-name: SH #集群名称: 上海集群ephemeral: true # 是否非临时实例,true表示是临时实例,false表示不是临时实例config:namespace: 3cd3c911-7d96-430a-8d49-38d24642592a # 命名空间group: DEFAULT_GROUP # 组prefix: ${spring.application.name} # DataId的第一部分file-extension: yml # DataId的第三部分shared-configs:- # 表示共享哪里的配置文件,-表示可以有多个的意思 loadbalancer:nacos:enabled: true # Nacos开启负载均衡,可以进行权重、下线、同集群优先访问等profiles:active: dev # DataId的第一部分
# Nacos远程的配置文件
server:port: 82spring:mvc:pathmatch:matching-strategy: ant_path_matcher # 路径匹配策略datasource:url: jdbc:mysql://127.0.0.1:3306/cloud_order?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&allowMultiQueries=trueusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Drivermybatis-plus:configuration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImplmapper-locations: classpath:mapper/**Mapper.xmltype-aliases-package: com.wbz.domain

新增的配置文件是:

spring:cloud:nacos:server-addr: 127.0.0.1:8848config:namespace: 3cd3c911-7d96-430a-8d49-38d24642592a group: DEFAULT_GROUP # 组prefix: ${spring.application.name} file-extension: yml shared-configs:- 

启动之后只要不报错就证明配置成功。 

订单服务配置管理

引入依赖

由于要引入分布式配置管理,所以引入阿里巴巴配置中心的依赖和bootstrap配置文件的依赖。

        <!--配置中心--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!--bootstrap--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency>

修改配置文件 

新建一个bootstrap.yml文件,并将原先的application.yml文件进行分门别类的放到Nacos的远程配置文件和bootstrap.yml配置文件中。

spring:application:name: cloud-alibaba-provider-product-nacos-8201cloud:nacos:server-addr: 127.0.0.1:8848discovery:service: ${spring.application.name}cluster-name: SH #集群名称: 上海集群config:namespace: 3cd3c911-7d96-430a-8d49-38d24642592agroup: DEFAULT_GROUPprefix: ${spring.application.name}file-extension: ymlprofiles:active: dev
# Nacos远程的配置文件
server:port: 8201spring:mvc:pathmatch:matching-strategy: ant_path_matcher # 路径匹配策略datasource:url: jdbc:mysql://127.0.0.1:3306/cloud_product?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&allowMultiQueries=trueusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Drivermybatis-plus:configuration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImplmapper-locations: classpath:mapper/**Mapper.xmltype-aliases-package: com.wbz.domain

新增的配置文件是:

spring:cloud:nacos:server-addr: 127.0.0.1:8848config:namespace: 3cd3c911-7d96-430a-8d49-38d24642592agroup: DEFAULT_GROUPprefix: ${spring.application.name}file-extension: yml

启动之后只要不报错就证明配置成功。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/881094.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue2接入高德地图实现折线绘制、起始点标记和轨迹打点的完整功能(提供Gitee源码)

目录 一、申请密钥 二、安装element-ui 三、安装高德地图依赖 四、完整代码 五、运行截图 六、官方文档 七、Gitee源码 一、申请密钥 登录高德开放平台&#xff0c;点击我的应用&#xff0c;先添加新应用&#xff0c;然后再添加Key。 ​ 如图所示填写对应的信息&…

网络基础 【HTTP】

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux初窥门径⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a; &#x1f4bb;操作环境&#xff1a; CentOS 7.6 华为云远程服务器 &#x1f339;关注我&#x1faf5;带你学习更多Linux知识…

模拟算法(5)_数青蛙

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 模拟算法(5)_数青蛙 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. 题目链接…

【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,1-1

文件下载与邀请翻译者 学习英特尔开发手册&#xff0c;最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册&#xff0c;会是一件耗时费力的工作。如果有愿意和我一起来做这件事的&#xff0c;那么&#xff…

空域中低通滤波器和高通滤波器的互补关系——Unsharp masking的理论基础

空域中从一个单位冲激中减去一个低通核产生一个高通核。 对应地&#xff0c;频域中数字滤波器低通转高通可以通过1-低通高通实现。模拟滤波器不行。 从原始图像减去模糊图像称为Unsharp masking。这是Unsharp masking的理论基础。锐化的程度由这个正比例系数控制。

计算机网络(十) —— IP协议详解,理解运营商和全球网络

目录 一&#xff0c;关于IP 1.1 什么是IP协议 1.2 前置认识 二&#xff0c;IP报头字段详解 三&#xff0c;网段划分 3.1 IP地址的构成 3.2 网段划分 3.3 子网划分 3.4 IP地址不足问题 四&#xff0c;公网IP和私有IP 五&#xff0c;理解运营商和全球网络 六&#xff…

Linux 进程状态、僵尸进程与孤儿进程

目录 0.前言 1. 进程状态 1.1 定义 1.2 常见进程 2.僵尸进程 2.1 定义 2.2 示例 2.3 僵尸进程的危害与防止方法 3. 孤儿进程 3.1 介绍 3.2 示例 4.小结 &#xff08;图像由AI生成&#xff09; 0.前言 在上一篇文章中&#xff0c;我们介绍了进程的基本概念、进程控制块&#…

C语言自定义类型联合和枚举(25)

文章目录 前言一、联合体联合体的声明联合体的特点联合体和结构体内存布局对比联合体的大小计算联合体的实际使用样例礼品兑换单判断当前机器是大端还是小端 二、枚举枚举的定义枚举类型的声明枚举类型的优点枚举类型的使用 总结 前言 关于自定义类型除了我们常用的结构体&…

Python机器视觉:01- 利用列表和切片操作 - 做一个弧线和图片相交的mask区域

前言&#xff1a; Python的列表处理&#xff0c;在机器视觉中经常被用到&#xff0c;这里结合基本的概念机器视觉实践案例&#xff0c;成文如下&#xff1a; 本身将实现一个&#xff0c;弧线的mask填充&#xff1a;这个mask是我的一个天文项目的应用&#xff0c;目的在于将月…

实现Xshell与虚拟机中Linux服务器的连接(附常见错误解决)

前言 Xshell是一个强大的安全终端模拟软件&#xff0c;它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。Xshell 通过互联网到远程主机的安全连接以及它创新性的设计和特色帮助用户在复杂的网络环境中享受他们的工作。 本文将介绍Xshell与虚拟机中Linux服务器连接…

Web APIs——Dom获取属性操作

1.变量声明 1.1以后声明变量我们优先使用哪个&#xff1f; const 有了变量先给const&#xff0c;如果发现它后面是要被修改的&#xff0c;再改为let 1.2 为什么const声明的对象可以修改里面的属性&#xff1f; 因为对象是引用类型&#xff0c;里面存储的是地址&#x…

自动驾驶核心技术:感知融合、规划决策、控制执行

1、前言 简单来说&#xff0c;实现自动驾驶需要解决三个核心问题&#xff1a;“我在哪?我要去哪?我该如何去?”能完整解决这三个问题就是真正的自动驾驶。 目前&#xff0c;自动驾驶汽车关键技术主要包括环境感知、精准定位、决策与规划、控制与执行、高精地图与车联网V2X以…

大学生就业招聘:Spring Boot系统的设计与实践

5系统详细实现 5.1 用户模块的实现 5.1.1 求职信息管理 大学生就业招聘系统的用户可以管理自己的求职信息&#xff0c;可以对自己的求职信息添加修改删除操作。具体界面的展示如图5.1所示。 图5.1 求职信息管理界面 5.1.2 首页 用户登录可以在首页看到招聘信息展示也一些求职…

Flet介绍:平替PyQt的好用跨平台Python UI框架

随着Python在各个领域的广泛应用&#xff0c;特别是在数据科学和Web开发领域&#xff0c;对于一个简单易用且功能强大的用户界面&#xff08;UI&#xff09;开发工具的需求日益增长。传统的Python GUI库如Tkinter、PyQt虽然功能强大&#xff0c;但在易用性和现代感方面略显不足…

算法篇1:双指针思想的运用(1)--C++

一.算法解析 双指针&#xff0c;顾名思义就是两个指针&#xff0c;常见的算法中&#xff0c;我们可以看到两种&#xff1a; 1.对撞指针&#xff1a;一般用于顺序结构&#xff0c;也称为左右指针。 对撞指针从两端向中间移动。一个指针从最左端开始&#xff0c;另一个从最右端…

比较搜索难度曲线5s1-4和4s1

在行列可自由变换的条件下&#xff0c;平面上的5点结构只有34个,4点结构有16个 (A,B)---6*n*2---(0,1)(1,0) 让B全是0。当收敛误差为7e-4&#xff0c;收敛199次取迭代次数平均值。让隐藏层节点数n分别为10&#xff0c;15&#xff0c;20&#xff0c;25&#xff0c;30&#xff…

C(十四)while、for、do-while循环综合(一)

uu们&#xff0c;小弟我本科在读&#xff0c;文章我会一直坚持更新下去&#xff0c;包括但不限于C初阶、C进阶、数据结构、C、Linux、MySQL、项目、QT开发、各种算法&#xff08;之后会持续更新&#xff09;&#xff0c;并且站在小白的视角尽可能通俗易懂地把这些写出来&#x…

【Android】获取备案所需的公钥以及签名MD5值

目录 重要前提 获取签名MD5值 获取公钥 重要前提 生成jks文件以及gradle配置应用该文件。具体步骤请参考我这篇文章&#xff1a;【Android】配置Gradle打包apk的环境_generate signed bundle or apk-CSDN博客 你只需要从头看到该文章的配置build.gradle&#xff08;app&…

25重庆长安深蓝控制器开发面试经验 深蓝最常见面试问题总结

【面试经历】 秋招气氛组选手的第一场面试,9.17网申,9.24电话约面,9.26线上面试。问得很细,全长约1个小时 1. 自我介绍、项目介绍 2.项目细节,遇到了哪些困难;有没有PCB设计经验DC-DC芯片选型,电源噪声的原因、怎么消除、 3.画BUCK和BOOST拓扑图,讲原理 4.了解MCU的主…

西电25考研 VS 24考研专业课大纲变动汇总

01专业课变动 西安电子科技大学专业课学长看到953网络安全基础综合变为 893网络安全基础综合&#xff0c;这是因为工科要求都必须是8开头的专业课&#xff0c;里面参考课本还是没变的&#xff0c;无非就是变了一个名字 对于其他变动专业课也是同理的 02专业课考纲内容变化 对于…