Dubbo配置

news2024/11/25 18:40:10

dubbo配置官网参考

1.配置原则

在这里插入图片描述

JVM 启动 -D 参数优先,这样可以使用户在部署和启动时进行参数重写,比如在启动时需改变协议的端口。

XML 次之,如果在 XML 中有配置,则 dubbo.properties 中的相应配置项无效。

Properties 最后,相当于缺省值,只有 XML 没有配置时,dubbo.properties 的相应配置项才会生效,通常用于共享公共配置,比如应用名。

2.启动时检查

**Dubbo **缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 **Spring **初始化完成,以便上线时,能及早发现问题,默认 check=“true”

可以通过 **check=“false”**关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。

另外,如果你的 **Spring **容器是懒加载的,或者通过 API 编程延迟引用服务,请关闭 check,否则服务临时不可用时,会抛出异常,拿到 **null **引用,如果 check=“false”,总是会返回引用,当服务恢复时,能自动连上。

order-service-consumer消费者为例,在consumer.xml中添加配置

<!--配置当前消费者的统一规则,当前所有的服务都不启动时检查-->
<dubbo:consumer check="false"></dubbo:consumer>

添加后,即使服务提供者不启动,启动当前的消费者,也不会出现错误。

3.全局超时配置

服务提供方:

<!-- 全局超时配置-->
<dubbo:provider timeout="5000" />

<!-- 指定接口以及特定方法超时配置 -->
<dubbo:service interface="com.tianxia.dubbo.api.UserService" ref="userServiceImpl">
    <dubbo:method name="getUserAddressList" timeout="3000"></dubbo:method>
</dubbo:service>

服务消费方:

<!-- 全局超时配置-->
<dubbo:consumer check="false" timeout="5000"/>

<!-- 指定接口以及特定方法超时配置 -->
<dubbo:reference interface="com.tianxia.dubbo.api.UserService" id="userService" check="false" timeout="5000">
    <dubbo:method name="getUserAddressList" timeout="3000"></dubbo:method>
</dubbo:reference>

配置原则:

dubbo推荐在Provider上尽量多配置Consumer端属性

  1. 作服务的提供者,比服务使用方更清楚服务性能参数,如调用的超时时间,合理的重试次数,等等
  2. 在Provider配置后,Consumer不配置则会使用Provider的配置值,即Provider配置可以作为Consumer的缺省值。否则,Consumer会使用Consumer端的全局设置,这对于Provider不可控的,并且往往是不合理的

配置的覆盖规则:

  1. 方法级配置别优于接口级别
  2. Consumer端配置 优 Provider配置 优于 全局配置
  3. 最后是Dubbo Hard Code的配置值(见配置文档)

在这里插入图片描述

4.重试次数

<dubbo:service interface="com.tianxia.dubbo.api.UserService" ref="userServiceImpl">
   <!--retries 重试次数,第一次调用不算,配合超时时间一起使用-->
    <dubbo:method name="getUserAddressList" timeout="3000" retries="3"></dubbo:method>
</dubbo:service>

5.多版本

服务提供者中复制多个impl。起不同的名字

在这里插入图片描述

<!-- 4、暴露服务 让别人调用 ref指向服务的真正实现对象 -->
<dubbo:service interface="com.tianxia.dubbo.api.UserService" ref="userServiceImpl" version="1.0.0">
    <!-- 指定接口以及特定方法超时配置 -->
    <dubbo:method name="getUserAddressList" timeout="3000" retries="3"></dubbo:method>
</dubbo:service>
<!-- 服务的实现 -->
<bean id="userServiceImpl" class="com.tianxia.dubbo.service.impl.UserServiceImpl"/>

<!-- 4、暴露服务 让别人调用 ref指向服务的真正实现对象 -->
<dubbo:service interface="com.tianxia.dubbo.api.UserService" ref="userServiceImpl02" version="2.0.0">
    <!-- 指定接口以及特定方法超时配置 -->
    <dubbo:method name="getUserAddressList" timeout="3000" retries="3"></dubbo:method>
</dubbo:service>

配置多个文件的路径及信息。
服务消费者调用时,可自由配置版本

消费者

<!-- 调用远程暴露的服务,生成远程服务代理 指定版本-->
<dubbo:reference interface="com.tianxia.dubbo.api.UserService" id="userService" check="false" version="1.0.0"/>

<!-- 调用远程暴露的服务,生成远程服务代理 随机版本-->
<dubbo:reference interface="com.tianxia.dubbo.api.UserService" id="userService" check="false" version="*"/>

6.本地存根

import cn.hutool.core.util.StrUtil;
import com.tianxia.dubbo.api.UserService;
import com.tianxia.dubbo.entity.UserAddress;

import java.util.List;

/**
 * 本地存根
 * @author liqb
 * @date 2023-05-29 22:09
 */
public class UserServiceStub implements UserService {
    
    private final UserService userService;

    /**
     * 传入的是userService远程的代理对象
     * @author liqb
     * @date 2023-05-29 22:11
     * @param userService
     */
    public UserServiceStub(UserService userService) {
        this.userService = userService;
    }

    @Override
    public List<UserAddress> getUserAddressList(String userId) {
        System.out.println("UserServiceStub......");
        if (StrUtil.isNotBlank(userId)) {
            return userService.getUserAddressList(userId);
        }
        return null;
    }
}
<!-- 调用远程暴露的服务,生成远程服务代理 -->
<dubbo:reference interface="com.tianxia.dubbo.api.UserService" id="userService" check="false" version="1.0.0" stub="com.tianxia.dubbo.service.impl.UserServiceStub"/>

7.dubbo与springboot整合的三种方式

导入Dubbo的依赖 和 zookeeper 客户端

  1. 导入dubbo-starter。在application.properties配置属性,使用@Service【暴露服务】,使用@Reference【引用服务】
    1. 配置类 application.properties
      ## 指定当前服务
      dubbo.application.name=boot-user-service-provider
      ## 指定注册中心的位置
      dubbo.registry.address=127.0.0.1:2181
      dubbo.registry.protocol=zookeeper
      ## 指定通信规则
      dubbo.protocol.name=dubbo
      dubbo.protocol.port=20880
      
      ## 连接监控中心
      dubbo.monitor.protocol=registry
      
    2. 启动类
      import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;
      
      /**
       * 启动类
       * @author liqb
       * @date 2023-05-28 21:36
       */
      @EnableDubbo // 开启基于注解的dubbo功能
      @SpringBootApplication
      public class UserServiceApplication {
          public static void main(String[] args) {
              SpringApplication.run(UserServiceApplication.class, args);
          }
      }
      
    3. UserServiceImpl
      import com.tianxia.dubbo.api.UserService;
      import com.tianxia.dubbo.entity.UserAddress;
      import org.springframework.stereotype.Service;
      
      import java.util.Arrays;
      import java.util.List;
      
      /**
       * 用户服务实现类
       * @author liqb
       * @date 2023-05-28 16:48
       */
      @Service
      @com.alibaba.dubbo.config.annotation.Service
      public class UserServiceImpl implements UserService {
      
          /**
           * 按照用户id返回所有的收货地址
           * @author liqb
           * @date 2023-05-28 16:48
           * @param userId 用户id
           * @return
           */
          @Override
          public List<UserAddress> getUserAddressList(String userId) {
              UserAddress address1 = new UserAddress(1, "河南省郑州巩义市宋陵大厦2F", "1", "安然", "150360313x", "Y");
              UserAddress address2 = new UserAddress(2, "北京市昌平区沙河镇沙阳路", "1", "情话", "1766666395x", "N");
      
              return Arrays.asList(address1,address2);
          }
      }
      
  2. 保留Dubbo 相关的xml配置文件,使用@ImportResource导入Dubbo的xml配置文件
    1. 配置类 provider.xml
      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
             xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
      		http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd
      		http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
      
          <!-- 1、指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务同名) -->
          <dubbo:application name="user-service-provider"/>
      
          <!-- 2、指定注册中心的位置 -->
          <!-- <dubbo:registry address="zookeeper://127.0.0.1:2181"/> -->
          <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/>
      
          <!--3、指定通信规则(通信协议? 服务端口)-->
          <dubbo:protocol name="dubbo" port="20881"/>
      
          <!-- 4、暴露服务 让别人调用 ref指向服务的真正实现对象 -->
          <dubbo:service interface="com.tianxia.dubbo.api.UserService" ref="userServiceImpl" version="1.0.0">
              <!-- 指定接口以及特定方法超时配置 -->
              <dubbo:method name="getUserAddressList" timeout="3000" retries="3"></dubbo:method>
          </dubbo:service>
      
          <!--dubbo-monitor-simple监控中心发现的配置-->
          <dubbo:monitor protocol="registry"/>
          <!--<dubbo:monitor address="127.0.0.1:7070"></dubbo:monitor>-->
      
          <!-- 全局超时配置-->
          <dubbo:provider timeout="5000"/>
      </beans>
      
    2. 启动类
      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;
      import org.springframework.context.annotation.ImportResource;
      
      /**
       * 启动类
       * @author liqb
       * @date 2023-05-28 21:36
       */
      // @EnableDubbo // 开启基于注解的dubbo功能
      // @EnableDubbo(scanBasePackages = "com.tianxia.dubbo")
      @ImportResource(locations = "classpath:provider.xml")
      @SpringBootApplication
      public class UserServiceApplication {
          public static void main(String[] args) {
              SpringApplication.run(UserServiceApplication.class, args);
          }
      }
      
    3. UserServiceImpl
      import com.tianxia.dubbo.api.UserService;
      import com.tianxia.dubbo.entity.UserAddress;
      import org.springframework.stereotype.Service;
      
      import java.util.Arrays;
      import java.util.List;
      
      /**
       * 用户服务实现类
       * @author liqb
       * @date 2023-05-28 16:48
       */
      @Service
      @com.alibaba.dubbo.config.annotation.Service
      public class UserServiceImpl implements UserService {
      
          /**
           * 按照用户id返回所有的收货地址
           * @author liqb
           * @date 2023-05-28 16:48
           * @param userId 用户id
           * @return
           */
          @Override
          public List<UserAddress> getUserAddressList(String userId) {
              UserAddress address1 = new UserAddress(1, "河南省郑州巩义市宋陵大厦2F", "1", "安然", "150360313x", "Y");
              UserAddress address2 = new UserAddress(2, "北京市昌平区沙河镇沙阳路", "1", "情话", "1766666395x", "N");
      
              return Arrays.asList(address1,address2);
          }
      }
      
      
  3. 使用 注解API的方式(将每一个组件手动配置到容器中,让dubbo来扫描其他的组件)
    1. 配置类
      import com.alibaba.dubbo.config.ApplicationConfig;
      import com.alibaba.dubbo.config.MethodConfig;
      import com.alibaba.dubbo.config.MonitorConfig;
      import com.alibaba.dubbo.config.ProtocolConfig;
      import com.alibaba.dubbo.config.RegistryConfig;
      import com.alibaba.dubbo.config.ServiceConfig;
      import com.tianxia.dubbo.api.UserService;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      
      import java.util.Collections;
      
      /**
       * Dubbo配置类
       * @author liqb
       * @date 2023-05-29 22:28
       */
      @Configuration
      public class MyDubboConfig {
      
          /**
           * <dubbo:application name="user-service-provider"/>
           * @author liqb
           * @date 2023-05-29 22:41
           * @return
           */
          @Bean
          public ApplicationConfig applicationConfig() {
              ApplicationConfig applicationConfig = new ApplicationConfig();
              applicationConfig.setName("user-service-provider");
              return applicationConfig;
          }
      
          /**
           * <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/>
           * @author liqb
           * @date 2023-05-29 22:37
           * @return
           */
          @Bean
          public RegistryConfig registryConfig() {
              RegistryConfig registryConfig = new RegistryConfig();
              registryConfig.setProtocol("zookeeper");
              registryConfig.setAddress("127.0.0.1:2181");
              return registryConfig;
          }
      
          /**
           * <dubbo:protocol name="dubbo" port="20881"/>
           * @author liqb
           * @date 2023-05-29 22:41
           * @return
           */
          @Bean
          public ProtocolConfig protocolConfig() {
              ProtocolConfig protocolConfig = new ProtocolConfig();
              protocolConfig.setName("dubbo");
              protocolConfig.setPort(20881);
              return protocolConfig;
          }
      
      
          /**
           * <dubbo:service interface="com.tianxia.dubbo.api.UserService" ref="userServiceImpl02" version="2.0.0">
           *  <dubbo:method name="getUserAddressList" timeout="3000" retries="3"></dubbo:method>
           * </dubbo:service>
           * @author liqb
           * @date 2023-05-29 22:40
           * @return
           */
          @Bean
          public ServiceConfig<UserService> userServiceServiceConfig(UserService userService) {
              ServiceConfig<UserService> serviceServiceConfig = new ServiceConfig<>();
              serviceServiceConfig.setInterface(UserService.class);
              serviceServiceConfig.setRef(userService);
              serviceServiceConfig.setVersion("1.0.0");
              
              // 配置每一个method信息
              MethodConfig methodConfig = new MethodConfig();
              methodConfig.setName("getUserAddressList");
              methodConfig.setTimeout(3000);
              methodConfig.setRetries(3);
              
              // 将method的设置关联到service中
              serviceServiceConfig.setMethods(Collections.singletonList(methodConfig));
              return serviceServiceConfig;
          }
      
          /**
           * <dubbo:monitor protocol="registry"/>
           * @author liqb
           * @date 2023-05-29 22:42
           * @return
           */
          @Bean
          public MonitorConfig monitorConfig() {
              MonitorConfig monitorConfig = new MonitorConfig();
              monitorConfig.setProtocol("registry");
              return monitorConfig;
          }
      }
      
      
    2. 启动类
      import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;
      
      /**
       * 启动类
       * @author liqb
       * @date 2023-05-28 21:36
       */
      @EnableDubbo(scanBasePackages = "com.tianxia.dubbo")
      @SpringBootApplication
      public class UserServiceApplication {
          public static void main(String[] args) {
              SpringApplication.run(UserServiceApplication.class, args);
          }
      }
      
    3. UserServiceImpl
      import com.tianxia.dubbo.api.UserService;
      import com.tianxia.dubbo.entity.UserAddress;
      import org.springframework.stereotype.Service;
      
      import java.util.Arrays;
      import java.util.List;
      
      /**
       * 用户服务实现类
       * @author liqb
       * @date 2023-05-28 16:48
       */
      @Service
      @com.alibaba.dubbo.config.annotation.Service
      public class UserServiceImpl implements UserService {
      
          /**
           * 按照用户id返回所有的收货地址
           * @author liqb
           * @date 2023-05-28 16:48
           * @param userId 用户id
           * @return
           */
          @Override
          public List<UserAddress> getUserAddressList(String userId) {
              UserAddress address1 = new UserAddress(1, "河南省郑州巩义市宋陵大厦2F", "1", "安然", "150360313x", "Y");
              UserAddress address2 = new UserAddress(2, "北京市昌平区沙河镇沙阳路", "1", "情话", "1766666395x", "N");
      
              return Arrays.asList(address1,address2);
          }
      }
      

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

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

相关文章

【群智能算法改进】一种改进的蝴蝶优化算法 改进蝴蝶优化算法 改进BOA[1]【Matlab代码#35】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 原始蝴蝶优化算法2. 改进蝴蝶优化算法2.1 动态转换概率策略2.2 最优邻域扰动策略2.3 随机惯性权重策略 3. 部分代码展示4. 仿真结果展示5. 资源获取6. 参考文献 【获取资源请见文章第5节&#xff1a;资源获取】 1. 原…

React面试题和基础

React的特点&#xff1a; JSX它使用虚拟DOM &#xff0c;减少 DOM 操作&#xff0c;提升性能。便于和其他平台集成。它可以进行服务器端渲染。单向数据流。组件化 双向数据绑定和单向数据流区别&#xff1f; 单向绑定的优点在于清晰可控&#xff0c;缺点则在于模板代码过多。…

第一部分-基础篇-第二章:PSTN、PBX及呼叫中心业务

文章目录 序言上一篇文章&#xff1a;2.1 PSTN业务2.1.1 POTS2.1.2 商务业务2.1.3 其他增值业务 2.2 PBX业务2.2.1 呼叫转移2.2.2 同组代答 2.3 PBX与中继线2.4 IP-PBX业务2.5 呼叫中心2.5.1 什么是呼叫中心2.5.2 呼叫中心的历史2.5.3 呼叫中心的分类1.交换机类型的呼叫中心2.板…

C++——string

作者&#xff1a;几冬雪来 时间&#xff1a;2023年5月29日 内容&#xff1a;C——string内容讲解 目录 前言&#xff1a; 1.string&#xff08;续&#xff09;&#xff1a; 1.string::operator[]: 2.string:: length()&#xff1a; 3.string:: max_size(): 4.strin…

华南农业大学|图像处理与分析技术综合测试|题目解答:识别时钟上时间

设计任务 这是一幅表盘图像&#xff0c;试采用图像处理和分析技术&#xff0c;设计适当的算法和程序&#xff0c;计算出表盘上的指示时间&#xff08;要求精确到秒&#xff09;。请按统一要求写出算法原理、设计流程&#xff0c;并完成测试分析等报告内容。 算法设计 解题思路…

张小飞的Java之路——第四十二章——字节流

写在前面&#xff1a; 视频是什么东西&#xff0c;有看文档精彩吗&#xff1f; 视频是什么东西&#xff0c;有看文档速度快吗&#xff1f; 视频是什么东西&#xff0c;有看文档效率高吗&#xff1f; 诸小亮&#xff1a;下面我们学习——字节流 张小飞&#xff1a;什么是字…

article-并联机械手爪运动学分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3aNKIR4E-1685371700448)(data:image/svgxml;utf8, )] 2.4.3 基于Robotics Toolbox的工具箱的模型检测 上文中&#xff0c;我们已经对采摘机器手爪运动学理论模型进行了创建&#xff0c;接下来要用MA…

V3.0_用exec族函数替代system()

注意点&#xff1a;exec族函数的使用 以execl为例&#xff1a; &#xff08;1&#xff09; &#xff08;2&#xff09;exec族函数中的函数调用失败时会设置error并返回-1&#xff0c;然后从源程序调用点接着往下执行。 执行成功后不会返回&#xff0c;也不会从源程序调用点接…

Redis缓存一致性问题及解决方案

对于没有并发的用户请求 先更新缓存&#xff0c;后更新数据库先更新数据库&#xff0c;后更新缓存 两者第二步没成功&#xff0c;都有问题 如果更新缓存成功&#xff0c;更新数据库没成功&#xff0c;一旦缓存失效&#xff0c;读取的仍是旧值如果更新数据库成功&#xff0c;…

MySQL官网下载Linux版本安装包

步骤一&#xff1a;https://www.mysql.com/ 步骤二&#xff1a;https://www.mysql.com/downloads/ 步骤三&#xff1a;https://dev.mysql.com/downloads/ 步骤四&#xff1a;https://dev.mysql.com/downloads/mysql/

二十分钟秒懂:实现前后端分离开发(vue+element+spring boot+mybatis+MySQL)

目录 开发者介绍 什么是前后端分离开发 vue与springboot开发的优势 Vue.js 的优势&#xff1a; Spring Boot 的优势&#xff1a; vue与springboot如何实现前后端连接 demo简介 重要部分前端部分代码 重要部分后端代码 后端解决跨域问题 Controller部分 xml部分 se…

商城APP开发需要哪些功能,如何选择开发公司

商城APP开发的功能有很多&#xff0c;从功能上看主要分为以下几个大类&#xff1a; 一、商品展示类&#xff1a;商家可以在这里展示自己产品的种类、数量、价格等信息&#xff0c;消费者在浏览和选择的时候&#xff0c;能直观的看到商家介绍。 二、优惠促销类&#xff1a;商家…

JDBC与DBCP整合

DBCP:DataBase Connection Pool,数据库连接池负责分配、管理和释放数据库连接&#xff0c;它允许应用程序重复使用一个现有的数据库连接&#xff0c;而不是再重新建立一个&#xff1b;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接…

第四章 相似矩阵与矩阵对角化

引言 题型总结中推荐例题有蓝皮书的题型较为重要&#xff0c;只有吉米多维奇的题型次之。码字不易&#xff0c;如果这篇文章对您有帮助的话&#xff0c;希望您能点赞、评论、收藏&#xff0c;投币、转发、关注。您的鼓励就是我前进的动力&#xff01; 知识点思维导图 补充&…

【Web服务器集群】Apache配置与应用

文章目录 一、构建虚拟web主机1.概述2.httpd服务支持的虚拟主机类型3.构建虚拟Web主机3.1基于域名的虚拟主机3.2基于IP地址的虚拟主机3.3基于端口的虚拟主机 4.Apache连接保持5.Apache访问控制 二、Apache日志管理rotatelogs分隔工具 三、总结1.Web虚拟主机部署步骤2.网页根目录…

DN-DETR代码学习笔记

代码地址&#xff1a;GitHub - IDEA-Research/DN-DETR: [CVPR 2022 Oral]Official implementation of DN-DETR 论文地址&#xff1a; https://arxiv.org/pdf/2203.01305.pdf DN-DETR是在DAB-DETR的基础上完成的&#xff0c;DN-DETR的作者认为导致DETR类模型收敛慢的原因在于匈牙…

【Linux升级之路】4_进程控制

文章目录 前言一、【Linux初阶】fork进程创建 & 进程终止 & 进程等待二、【Linux初阶】进程程序替换 | 初识、原理、函数、应用 & makefile工具的多文件编译三、【Linux初阶】进程替换的应用 - 简易命令行解释器的实现结语 前言 本片博客是 Linux操作系统 进程控制…

【周末闲谈】谈谈数学转码这一年来的体会与反思

——我们走了太远&#xff0c;以至于忘了为何出发 前言 笔者本科读的是数学专业&#xff0c;就是每天和数学分析、高等代数、概率论、随机过程等等这些理论打交道的专业&#xff0c;这个专业出来工作好像一般有两个方向就是金融和计算机&#xff0c;我选择了计算机方向。主要…

【自然语言处理】【大模型】ChatGLM-6B模型结构代码解析(单机版)

ChatGLM-6B模型结构代码解析(单机版) ​ 本文介绍ChatGLM-6B的模型结构&#xff0c;代码来自https://huggingface.co/THUDM/chatglm-6b/blob/main/modeling_chatglm.py。 相关博客 【自然语言处理】【大模型】ChatGLM-6B模型结构代码解析(单机版) 【自然语言处理】【大模型】BL…

日撸 Java 三百行day56-57

文章目录 day56-57 kMeans 聚类1.kMeans聚类理解2.代码理解2.1代码中变量的理解2.2代码理解 day56-57 kMeans 聚类 1.kMeans聚类理解 无监督的机器学习算法&#xff0c;其中k是划分为几个簇&#xff0c;并且选择k个数据作为不同簇的聚类中心&#xff0c;计算每个数据样本和聚…