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

news2024/10/6 3:05:38

概述

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: 8201

spring:
  application:
    name: cloud-alibaba-provider-product-nacos-8201

  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        service: ${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=true
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

  profiles:
    active: dev

mybatis-plus:
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: classpath:mapper/**Mapper.xml
  type-aliases-package: com.wbz.domain

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

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        service: ${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 {
 
    @TableId
    private Long id;
 
    @TableField
    private String productName;
 
    @TableField
    private Long productPrice;
 
    @TableField
    private 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 {
 
    @Override
    public Product getProductById(Long productId) {
        return this.getById(productId);
    }
 
}
 
// 控制层类
@RestController
@RequestMapping("/product")
public class ProductController {
 
    @Resource
    private 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: 82

spring:
  application:
    name: cloud-alibaba-consumer-order-nacos-82

  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        service: ${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=true
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

  profiles:
    active: dev

mybatis-plus:
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: classpath:mapper/**Mapper.xml
  type-aliases-package: com.wbz.domain

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

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        service: ${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 {
 
    @TableId
    private Long id;
 
    @TableField
    private Long userId;
 
    @TableField
    private Long productId;
 
    @TableField
    private Integer num;
 
    @TableField
    private Long price;
 
    @TableField
    private 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    
    @LoadBalanced
    public 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 {
 
    @Resource
    private RestTemplate restTemplate;
 
    private final String PRODUCT_SERVICE_NAME = "cloud-alibaba-provider-product-nacos-8201";
 
    @Override
    public Order getOrderById(Integer id) {
        // 获取订单
        Order order = this.getById(id);
        // 拼接url
        String 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 {
 
    @Resource
    private 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:8848
        service: ${spring.application.name}
        cluster-name: SH #集群名称: 上海集群

    loadbalancer:
      nacos:
        enabled: true

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

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        service: ${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:8848
        service: ${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: true
        extension-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-82

  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      discovery:
        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: 82

spring:

  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=true
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis-plus:
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: classpath:mapper/**Mapper.xml
  type-aliases-package: com.wbz.domain

新增的配置文件是:

spring:
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      config:
        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-8201

  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      discovery:
        service: ${spring.application.name}
        cluster-name: SH #集群名称: 上海集群
      config:
        namespace: 3cd3c911-7d96-430a-8d49-38d24642592a
        group: DEFAULT_GROUP
        prefix: ${spring.application.name}
        file-extension: yml

  profiles:
    active: dev
# Nacos远程的配置文件
server:
  port: 8201

spring:

  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=true
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis-plus:
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: classpath:mapper/**Mapper.xml
  type-aliases-package: com.wbz.domain

新增的配置文件是:

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

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

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

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

相关文章

InnoDB 事务模型

文章目录 InnoDB 事务模型事务ACID特性事务隔离级别 事务操作事务并发问题事务数据读写类型Consistent Nonlocking Reads 快照读Locking Reads 加锁读 MVCC 并发控制实现原理InnoDB 隐藏列Read ViewUndo log实现过程 MVCC与隔离级别MVCC和辅助索引 幻读可重复读MVCC会出现幻读的…

腾讯自研Git客户端,助力每个人都可以轻松使用Git

工具介绍 UGit是一款腾讯自研的Git客户端&#xff0c;为了让每个人都可以轻松使用Git&#xff0c;从而提高开发效率和团队协作的流畅性。支持工蜂MR/CR&#xff0c;工蜂议题管理&#xff0c;另外对于Git的原生特性有着深度支持。 支持的系统 支持macOS 10.11、Apple Silicon和…

【数据结构】什么是哈希表(散列表)?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;哈希表的概念 &#x1f4cc;哈希函数的构造方法 &#x1f38f;直接定址法 &#x1f38f;除留余数法 &#x1f38f;平方取中法 &#x1f38f;折叠法 &#x…

自动驾驶的技术实现及原理

自动驾驶技术是现代科技领域中一项引人注目的创新&#xff0c;它具有变革运输行业并提升道路安全的潜力。随着人工智能、传感器技术以及数据处理能力的不断提升&#xff0c;自动驾驶车辆已经从实验室研究逐渐走向现实应用。 自动驾驶的技术实现及原理 1. 自动驾驶技术的核心…

【深度学习】— 多层感知机介绍、 隐藏层、从线性到非线性、线性模型的局限性

【深度学习】— 多层感知机介绍 4.1 多层感知机4.1.1 隐藏层线性模型的局限性引入隐藏层 4.2 从线性到非线性线性组合的局限性引入非线性堆叠更多隐藏层 4.1 多层感知机 在第 3 节中&#xff0c;我们介绍了 softmax 回归&#xff0c;并实现了其从零开始的实现和基于高级 API 的…

UART通信协议

什么是UART UART ( Universal Asynchronous Receiver/Transmitter&#xff0c; 通用异步收发器) 是一种常用的串行通信协议&#xff0c;用于在 计算机和外部设备之间传输数据。它是一种异步通信协议&#xff0c;也就是说数据的传输不需要事先建立好同步时钟信号。 UART&#xf…

Unity MVC框架演示 1-1 理论分析

本文仅作学习笔记分享与交流&#xff0c;不做任何商业用途&#xff0c;该课程资源来源于唐老狮 1.一般的图解MVC 什么是MVC我就不说了&#xff0c;老生常谈&#xff0c;网上有大量的介绍&#xff0c;想看看这三层都起到什么职责&#xff1f;那就直接上图吧 2.我举一个栗子 我有…

深入理解 JavaScript 事件循环机制:单线程中的异步处理核心

深入理解 JavaScript 事件循环机制&#xff1a;单线程中的异步处理核心 JavaScript 是一门单线程的编程语言&#xff0c;也就是说它在同一时间只能执行一个任务。然而&#xff0c;现代 Web 应用经常需要处理大量的异步操作&#xff0c;如用户输入、网络请求、定时器等。为了确…

Vue的基本用法及模板语法

Vue.js使用了基于 HTML 的模板语法&#xff0c;允许开发者声明式地将 DOM 绑定至底层 Vue实例的数据。所有 Vue.js的模板都是合法的 HTML&#xff0c;所以能被遵循规范的浏览器和 HTML 解析器解析。 在底层的实现上&#xff0c;Vue将模板编译成虚拟 DOM 渲染函数。结合响应系…

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

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

前缀线性基——关于目前的理解以及一些样题

怎么说呢&#xff1f;在前几天我总结了了有关线性基的一篇博客&#xff0c;线性基用来去求整个区间的异或最值问题 前缀线性基——用于统计一个区间内的异或最值问题 那么我们如何去统计呢&#xff1f;那么就要去存储一个区间的异或空间线性基&#xff0c;因此我们的思路就是用…

【python】追加写入excel

输出文件运行前&#xff08;有两张表&#xff0c;“表1”和“Sheet1”&#xff09;&#xff1a; 目录 一&#xff1a;写入单表&#xff08;删除所有旧工作表&#xff0c;写入新表&#xff09;二&#xff1a;写入多表&#xff08;删除所有旧工作表&#xff0c;写入新表&#x…

平衡二叉搜索树之 AVL 树的模拟实现【C++】

文章目录 AVL树的简单介绍全部的实现代码放在了文章末尾准备工作包含头文件类的成员变量 构造函数和拷贝构造swap和赋值运算符重载析构函数findinsert[重要]当parent的平衡因子为1/-1时&#xff0c;如何向上更新祖先节点的平衡因子呢&#xff1f;怎么旋转&#xff1f;左单旋右单…

Windows Ubuntu下搭建深度学习Pytorch训练框架与转换环境TensorRT

Windows Ubuntu下搭建深度学习Pytorch训练框架与转换环境TensorRT JetBrains2024&#xff08;IntelliJ IDEA、PhpStorm、RubyMine、Rider……&#xff09;安装包Anaconda Miniconda安装.condarc 文件配置镜像源查看conda的配置和源(channel)自定义conda虚拟环境路径conda常用命…

Chromium 中JavaScript Screen API接口c++代码实现

Screen - Web API | MDN (mozilla.org) Screen Screen 接口表示一个屏幕窗口&#xff0c;往往指的是当前正在被渲染的 window 对象&#xff0c;可以使用 window.screen 获取它。 请注意&#xff1a;由浏览器决定提供屏幕对象&#xff0c;此对象一般通过当前浏览器窗口活动状…

《python语言程序设计》2018版第8章19题几何Rectangle2D类(下)-头疼的几何和数学

希望这个下集里能有完整的代码 一、containsPoint实现 先从网上找一下Statement expected, found Py:DEDENTTAB还是空格呢??小小总结如何拆分矩形的四个点呢.我们来小小的测试一下这个函数结果出在哪里呢???修改完成variable in function should be lowercase 函数变量应该…

No.2 笔记 | 网络安全攻防:PC、CS工具与移动应用分析

引言 在当今数字化时代,网络安全已成为每个人都应该关注的重要话题。本文将总结一次关于网络安全攻防技术的学习内容,涵盖PC端和移动端的恶意程序利用,以及强大的渗透测试工具Cobalt Strike的使用。通过学习这些内容,我们不仅能够了解攻击者的手法,更能提高自身的安全意识和防…

【牛顿迭代法求极小值】

牛顿迭代法求极小值 仅供参考 作业内容与要求 作业内容 作业要求 递交报告 代码 编程实现 计算偏导数 故上述非线性方程组的根可能为 f ( x , y ) f(x, y) f(x,y)的极值点&#xff0c;至于是极小值点还是极大值点或鞍点&#xff0c;就需要使用微积分中的黑塞矩阵来判断了。…

网络基础 【HTTPS】

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

Linux之实战命令26:timeout应用实例(六十)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…