Nacos使用JavaSDK,Nacos 动态监听配置,Nacos动态发布配置,Nacos动态获取实例

文章目录

  • 一、概述
    • 1、内置SDK
    • 2、服务配置管理工具:ConfigService
    • 3、服务注册与发现管理工具:NamingService
  • 二、服务配置管理
    • 1、获取配置
      • (1)描述
      • (2)参数
      • (3)请求示例
    • 2、监听配置
      • (1)描述
      • (2)参数
      • (3)请求示例
    • 3、删除监听
      • (1)描述
      • (2)参数
      • (3)使用示例
    • 4、发布配置
      • (1)描述
      • (2)参数
      • (3)请求示例
    • 5、删除配置
      • (1)描述
      • (2)参数
      • (3)请求示例
  • 三、服务发现SDK
    • 1、注册实例
      • (1)描述
      • (2)参数
      • (3)请求示例
    • 2、注销实例
      • (1)描述
      • (2)参数
      • (3)请求示例
    • 3、获取全部实例
      • (1)描述
      • (2)参数
      • (3)请求示例
    • 4、获取健康或不健康实例列表
      • (1)描述
      • (2)参数
      • (3)请求示例
    • 5、获取一个健康实例
      • (1)描述
      • (2)参数
      • (3)请求示例
    • 6、监听服务
      • (1)描述
      • (2)参数
      • (3)请求示例
    • 7、取消监听服务
      • (1)描述
      • (2)参数
      • (3)请求示例

一、概述

1、内置SDK

Nacos提供了一些客户端内置的SDK,以供我们直接对nacos中部分数据的操作。

服务配置管理包括:

  • 获取配置;
  • 监听配置动态变化;
  • 删除监听;
  • 发布配置;
  • 删除配置;

服务注册与发现管理包括:

  • 注册实例;
  • 注销实例;
  • 获取全部实例;
  • 获取健康或不健康实例列表;
  • 获取一个健康实例;
  • 监听服务。

要想使用这些内置SDK,需要引入nacos-client包:

<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>${version}</version>
</dependency>

1.X 版本最新java SDK为 1.4.4版本

2、服务配置管理工具:ConfigService

Springboot中,如果使用了nacos,会进行自动配置,并在Spring容器中注入一个NacosConfigManager(通过自动注入的方式可以注入NacosConfigManager),这个就是nacos服务配置的管理器。其中的getConfigService方法,可以获取到ConfigService,该接口就是处理服务配置的SDK。

private NacosConfigManager nacosConfigManager;
// Springboot中获取到ConfigService 
ConfigService configService = nacosConfigManager.getConfigService();

而如果单纯使用JavaSDK的话,获取ConfigService 实例需要手动处理nacos的地址等信息(NacosConfigManager中也是这么做的):

// 手动获取ConfigService
String serverAddr = "{serverAddr}";
Properties properties = new Properties();
properties.put("serverAddr", serverAddr);
ConfigService configService = NacosFactory.createConfigService(properties);

ConfigService接口包含了大量的,用于处理服务配置的方法,其实现类就是NacosConfigService:

public interface ConfigService {// 获取配置String getConfig(String dataId, String group, long timeoutMs) throws NacosException;// 获取配置并注册侦听器// 如果想在程序第一次开始获取配置时自己拉取,并且注册的 Listener 用于以后的配置更新,可以保持原始代码不变,只需添加系统参数:enableRemoteSyncConfig = “true” (但有网络开销);因此,我们建议您直接使用此接口String getConfigAndSignListener(String dataId, String group, long timeoutMs, Listener listener)throws NacosException;// 在配置中添加监听器,服务器修改配置后,客户端将使用传入监听器回调。推荐异步处理,应用程序可以在 ManagerListener 中实现 getExecutor 方法,提供线程池的执行。如果提供,请使用主线程回调,可能会阻止其他配置或被其他配置阻止。void addListener(String dataId, String group, Listener listener) throws NacosException;// 发布配置boolean publishConfig(String dataId, String group, String content) throws NacosException;// 发布配置,可以选择发布的格式(properties、xml、json、text、html、yaml、unset)boolean publishConfig(String dataId, String group, String content, String type) throws NacosException;// 删除配置boolean removeConfig(String dataId, String group) throws NacosException;// 删除监听void removeListener(String dataId, String group, Listener listener);// 获取服务状态String getServerStatus();// 关闭资源服务void shutDown() throws NacosException;
}

3、服务注册与发现管理工具:NamingService

同配置管理一样,服务注册与发现也提供了一个工具接口NamingService,在Springboot中,会自动配置一个NacosServiceManager(可以通过自动注入获取)。

NacosServiceManager中有几个用于处理服务注册与发现的方法:
getNamingService、getNamingMaintainService、isNacosDiscoveryInfoChanged、buildNamingMaintainService、buildNamingService、createNewNamingService、createNamingMaintainService、nacosServiceShutDown。

NamingService中包含了大量的方法,用于处理服务注册与发现:

public interface NamingService {// 将实例注册到服务。void registerInstance(String serviceName, String ip, int port) throws NacosException;// 将实例注册到服务void registerInstance(String serviceName, String groupName, String ip, int port) throws NacosException;// 使用指定的集群名称将实例注册到服务void registerInstance(String serviceName, String ip, int port, String clusterName) throws NacosException;// 使用指定的集群名称将实例注册到服务void registerInstance(String serviceName, String groupName, String ip, int port, String clusterName)throws NacosException;// 使用指定的实例属性将实例注册到服务void registerInstance(String serviceName, Instance instance) throws NacosException;// 使用指定的实例属性将实例注册到服务。void registerInstance(String serviceName, String groupName, Instance instance) throws NacosException;// 从服务中取消注册实例void deregisterInstance(String serviceName, String ip, int port) throws NacosException;// 从服务中取消注册实例void deregisterInstance(String serviceName, String groupName, String ip, int port) throws NacosException;// 从服务中取消注册具有指定集群名称的实例。void deregisterInstance(String serviceName, String ip, int port, String clusterName) throws NacosException;// 从服务中取消注册具有指定集群名称的实例void deregisterInstance(String serviceName, String groupName, String ip, int port, String clusterName)throws NacosException;// 使用完整的实例信息和默认组名取消注册实例。void deregisterInstance(String serviceName, Instance instance) throws NacosException;// 使用完整的实例信息取消注册实例。void deregisterInstance(String serviceName, String groupName, Instance instance) throws NacosException;// 获取服务的所有实例。List<Instance> getAllInstances(String serviceName) throws NacosException;// 获取服务的所有实例。List<Instance> getAllInstances(String serviceName, String groupName) throws NacosException;// 获取服务的所有实例。List<Instance> getAllInstances(String serviceName, boolean subscribe) throws NacosException;// 获取服务的所有实例List<Instance> getAllInstances(String serviceName, String groupName, boolean subscribe) throws NacosException;// 获取服务的指定集群内的所有实例。List<Instance> getAllInstances(String serviceName, List<String> clusters) throws NacosException;// 获取服务的指定集群内的所有实例。List<Instance> getAllInstances(String serviceName, String groupName, List<String> clusters) throws NacosException;// 获取服务的指定集群内的所有实例。List<Instance> getAllInstances(String serviceName, List<String> clusters, boolean subscribe) throws NacosException;// 获取服务的指定集群内的所有实例List<Instance> getAllInstances(String serviceName, String groupName, List<String> clusters, boolean subscribe)throws NacosException;// 获取合格的服务实例。List<Instance> selectInstances(String serviceName, boolean healthy) throws NacosException;// 获取合格的服务实例。List<Instance> selectInstances(String serviceName, String groupName, boolean healthy) throws NacosException;// 获取合格的服务实例。List<Instance> selectInstances(String serviceName, boolean healthy, boolean subscribe) throws NacosException;// 获取合格的服务实例。List<Instance> selectInstances(String serviceName, String groupName, boolean healthy, boolean subscribe)throws NacosException;// 获取指定服务集群中的合格实例。List<Instance> selectInstances(String serviceName, List<String> clusters, boolean healthy) throws NacosException;// 获取指定服务集群中的合格实例。List<Instance> selectInstances(String serviceName, String groupName, List<String> clusters, boolean healthy)throws NacosException;// 获取指定服务集群中的合格实例。List<Instance> selectInstances(String serviceName, List<String> clusters, boolean healthy, boolean subscribe)throws NacosException;// 获取指定服务集群中的合格实例。List<Instance> selectInstances(String serviceName, String groupName, List<String> clusters, boolean healthy,boolean subscribe) throws NacosException;// 使用预定义的负载平衡策略选择一个正常运行的服务实例。Instance selectOneHealthyInstance(String serviceName) throws NacosException;// 使用预定义的负载平衡策略选择一个正常运行的服务实例。Instance selectOneHealthyInstance(String serviceName, String groupName) throws NacosException;// 使用预定义的负载平衡策略选择一个正常运行的服务实例。Instance selectOneHealthyInstance(String serviceName, boolean subscribe) throws NacosException;// 使用预定义的负载平衡策略选择一个正常运行的服务实例。Instance selectOneHealthyInstance(String serviceName, String groupName, boolean subscribe) throws NacosException;// 使用预定义的负载平衡策略选择一个正常运行的服务实例。Instance selectOneHealthyInstance(String serviceName, List<String> clusters) throws NacosException;// 使用预定义的负载平衡策略选择一个正常运行的服务实例。Instance selectOneHealthyInstance(String serviceName, String groupName, List<String> clusters)throws NacosException;// 使用预定义的负载平衡策略选择一个正常运行的服务实例。Instance selectOneHealthyInstance(String serviceName, List<String> clusters, boolean subscribe)throws NacosException;// 使用预定义的负载平衡策略选择一个正常运行的服务实例。Instance selectOneHealthyInstance(String serviceName, String groupName, List<String> clusters, boolean subscribe)throws NacosException;// 订阅服务以接收实例变更事件void subscribe(String serviceName, EventListener listener) throws NacosException;// 订阅服务以接收实例变更事件void subscribe(String serviceName, String groupName, EventListener listener) throws NacosException;// 订阅服务以接收实例变更事件void subscribe(String serviceName, List<String> clusters, EventListener listener) throws NacosException;// 订阅服务以接收实例变更事件void subscribe(String serviceName, String groupName, List<String> clusters, EventListener listener)throws NacosException;// 取消订阅服务的事件侦听器。void unsubscribe(String serviceName, EventListener listener) throws NacosException;// 取消订阅服务的事件侦听器。void unsubscribe(String serviceName, String groupName, EventListener listener) throws NacosException;// 取消订阅服务的事件侦听器。void unsubscribe(String serviceName, List<String> clusters, EventListener listener) throws NacosException;// 取消订阅服务的事件侦听器。void unsubscribe(String serviceName, String groupName, List<String> clusters, EventListener listener)throws NacosException;// 从服务器获取所有服务名称ListView<String> getServicesOfServer(int pageNo, int pageSize) throws NacosException;// 从服务器获取所有服务名称ListView<String> getServicesOfServer(int pageNo, int pageSize, String groupName) throws NacosException;// 使用选择器从服务器获取所有服务名称ListView<String> getServicesOfServer(int pageNo, int pageSize, AbstractSelector selector) throws NacosException;// 使用选择器从服务器获取所有服务名称ListView<String> getServicesOfServer(int pageNo, int pageSize, String groupName, AbstractSelector selector)throws NacosException;// 获取当前客户端的所有订阅服务。List<ServiceInfo> getSubscribeServices() throws NacosException;// 获取服务器运行状况String getServerStatus();// 关闭资源服务void shutDown() throws NacosException;
}

二、服务配置管理

1、获取配置

(1)描述

用于服务启动的时候从 Nacos 获取配置。

public String getConfig(String dataId, String group, long timeoutMs) throws NacosException

(2)参数

请求:

参数名参数类型描述
dataIdstring配置 ID,采用类似 package.class(如com.taobao.tc.refund.log.level)的命名规则保证全局唯一性,class 部分建议是配置的业务含义。全部字符小写。只允许英文字符和 4 种特殊字符(“.”、“:”、“-”、“_”),不超过 256 字节。
groupstring配置分组,建议填写产品名:模块名(Nacos:Test)保证唯一性,只允许英文字符和4种特殊字符(“.”、“:”、“-”、“_”),不超过128字节。
timeoutlong读取配置超时时间,单位 ms,推荐值 3000。

返回值:

参数类型描述
string配置值

(3)请求示例

try {String serverAddr = "{serverAddr}";String dataId = "{dataId}";String group = "{group}";Properties properties = new Properties();properties.put("serverAddr", serverAddr);ConfigService configService = NacosFactory.createConfigService(properties);String content = configService.getConfig(dataId, group, 5000);System.out.println(content);
} catch (NacosException e) {// 读取配置超时或网络异常,抛出 NacosException 异常。e.printStackTrace();
}

2、监听配置

(1)描述

如果希望 Nacos 推送配置变更,可以使用 Nacos 动态监听配置接口来实现。

public void addListener(String dataId, String group, Listener listener) 

(2)参数

请求参数:

参数名参数类型描述
dataIdstring配置 ID,采用类似 package.class(如com.taobao.tc.refund.log.level)的命名规则保证全局唯一性,class 部分建议是配置的业务含义。 全部字符小写。只允许英文字符和 4 种特殊字符(“.”、“:”、“-”、“_”)。不超过 256 字节。
groupstring配置分组,建议填写产品名:模块名(如 Nacos:Test)保证唯一性。 只允许英文字符和4种特殊字符(“.”、“:”、“-”、“_”),不超过128字节。
listenerListener监听器,配置变更进入监听器的回调函数。

返回值:

参数类型描述
string配置值,初始化或者配置变更的时候通过回调函数返回该值。

(3)请求示例

String serverAddr = "{serverAddr}";
String dataId = "{dataId}";
String group = "{group}";
Properties properties = new Properties();
properties.put("serverAddr", serverAddr);
ConfigService configService = NacosFactory.createConfigService(properties);
String content = configService.getConfig(dataId, group, 5000);
System.out.println(content);
configService.addListener(dataId, group, new Listener() { // 添加监听@Overridepublic void receiveConfigInfo(String configInfo) {System.out.println("recieve1:" + configInfo);}@Overridepublic Executor getExecutor() {return null;}
});// 测试让主线程不退出,因为订阅配置是守护线程,主线程退出守护线程就会退出。 正式代码中无需下面代码
while (true) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
}

3、删除监听

(1)描述

取消监听配置,取消监听后配置不会再推送。

public void removeListener(String dataId, String group, Listener listener)

(2)参数

请求参数:

参数名参数类型描述
dataIdstring配置 ID,采用类似 package.class(如com.taobao.tc.refund.log.level)的命名规则保证全局唯一性,class 部分建议是配置的业务含义。全部字符小写。只允许英文字符和 4 种特殊字符(“.”、“:”、“-”、“_”),不超过 256 字节。
groupstring配置分组
listenerConfigChangeListenerAdapter监听器,配置变更进入监听器的回调函数。

(3)使用示例

String serverAddr = "{serverAddr}";
String dataId = "{dataId}";
String group = "{group}";
Properties properties = new Properties();
properties.put("serverAddr", serverAddr);
ConfigService configService = NacosFactory.createConfigService(properties);
configService.removeListener(dataId, group, yourListener);

4、发布配置

(1)描述

用于通过程序自动发布 Nacos 配置,以便通过自动化手段降低运维成本。

注意:创建和修改配置时使用的同一个发布接口,当配置不存在时会创建配置,当配置已存在时会更新配置。

public boolean publishConfig(String dataId, String group, String content) throws NacosException;@Since 1.4.1
public boolean publishConfig(String dataId, String group, String content, String type) throws NacosException;

(2)参数

请求参数:

参数名参数类型描述
dataIdstring配置 ID,采用类似 package.class(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。建议根据配置的业务含义来定义 class 部分。全部字符均为小写。只允许英文字符和 4 种特殊字符(“.”、“:”、“-”、“_”),不超过 256 字节。
groupstring配置分组,建议填写产品名:模块名(如 Nacos:Test)来保证唯一性。只允许英文字符和 4 种特殊字符(“.”、“:”、“-”、“_”),不超过 128 字节。
contentstring配置内容,不超过 100K 字节。
typestring@Since 1.4.1. 配置类型,见 com.alibaba.nacos.api.config.ConfigType,默认为TEXT(properties、xml、json、text、html、yaml、unset)

返回参数:

参数类型描述
boolean是否发布成功

(3)请求示例

try {// 初始化配置服务,控制台通过示例代码自动获取下面参数String serverAddr = "{serverAddr}";String dataId = "{dataId}";String group = "{group}";Properties properties = new Properties();properties.put("serverAddr", serverAddr);ConfigService configService = NacosFactory.createConfigService(properties);boolean isPublishOk = configService.publishConfig(dataId, group, "content");System.out.println(isPublishOk);
} catch (NacosException e) {// 读取配置超时或网络异常,抛出 NacosException 异常。e.printStackTrace();
}

5、删除配置

(1)描述

用于通过程序自动删除 Nacos 配置,以便通过自动化手段降低运维成本。

注意: 当配置已存在时会删除该配置,当配置不存在时会直接返回成功消息。

public boolean removeConfig(String dataId, String group) throws NacosException

(2)参数

请求参数:

参数名参数类型描述
dataIdstring配置 ID
groupstring配置分组

返回参数:

参数类型描述
boolean是否删除成功

(3)请求示例

try {// 初始化配置服务,控制台通过示例代码自动获取下面参数String serverAddr = "{serverAddr}";String dataId = "{dataId}";String group = "{group}";Properties properties = new Properties();properties.put("serverAddr", serverAddr);ConfigService configService = NacosFactory.createConfigService(properties);boolean isRemoveOk = configService.removeConfig(dataId, group);System.out.println(isRemoveOk);
} catch (NacosException e) {// 读取配置超时或网络异常,抛出 NacosException 异常。e.printStackTrace();
}

三、服务发现SDK

1、注册实例

(1)描述

注册一个实例到服务。

void registerInstance(String serviceName, String ip, int port) throws NacosException;void registerInstance(String serviceName, String ip, int port, String clusterName) throws NacosException;void registerInstance(String serviceName, Instance instance) throws NacosException;

一般情况下,服务注册通常自动注册,很少有需要我们手动去触发注册的。

(2)参数

请求参数:

名称类型描述
serviceName字符串服务名
ip字符串服务实例IP
portint服务实例port
clusterName字符串集群名
instance参见代码注释实例属性

(3)请求示例

NamingService naming = NamingFactory.createNamingService(System.getProperty("serveAddr"));
naming.registerInstance("nacos.test.3", "11.11.11.11", 8888, "TEST1");Instance instance = new Instance();
instance.setIp("55.55.55.55");
instance.setPort(9999);
instance.setHealthy(false);
instance.setWeight(2.0);
Map<String, String> instanceMeta = new HashMap<>();
instanceMeta.put("site", "et2");
instance.setMetadata(instanceMeta);Service service = new Service("nacos.test.4");
service.setApp("nacos-naming");
service.sethealthCheckMode("server");
service.setEnableHealthCheck(true);
service.setProtectThreshold(0.8F);
service.setGroup("CNCF");
Map<String, String> serviceMeta = new HashMap<>();
serviceMeta.put("symmetricCall", "true");
service.setMetadata(serviceMeta);
instance.setService(service);Cluster cluster = new Cluster();
cluster.setName("TEST5");
AbstractHealthChecker.Http healthChecker = new AbstractHealthChecker.Http();
healthChecker.setExpectedResponseCode(400);
healthChecker.setCurlHost("USer-Agent|Nacos");
healthChecker.setCurlPath("/xxx.html");
cluster.setHealthChecker(healthChecker);
Map<String, String> clusterMeta = new HashMap<>();
clusterMeta.put("xxx", "yyyy");
cluster.setMetadata(clusterMeta);instance.setCluster(cluster);naming.registerInstance("nacos.test.4", instance);

2、注销实例

(1)描述

删除服务下的一个实例。

void deregisterInstance(String serviceName, String ip, int port) throws NacosException;void deregisterInstance(String serviceName, String ip, int port, String clusterName) throws NacosException;

(2)参数

请求参数:

名称类型描述
serviceName字符串服务名
ip字符串服务实例IP
portint服务实例port
clusterName字符串集群名

(3)请求示例

NamingService naming = NamingFactory.createNamingService(System.getProperty("serveAddr"));
naming.deregisterInstance("nacos.test.3", "11.11.11.11", 8888, "DEFAULT");

3、获取全部实例

(1)描述

获取服务下的所有实例。

List<Instance> getAllInstances(String serviceName) throws NacosException;List<Instance> getAllInstances(String serviceName, List<String> clusters) throws NacosException;

(2)参数

请求参数:

名称类型描述
serviceName字符串服务名
clustersList集群列表

返回参数:
List 实例列表。

(3)请求示例

NamingService naming = NamingFactory.createNamingService(System.getProperty("serveAddr"));
System.out.println(naming.getAllInstances("nacos.test.3"));

4、获取健康或不健康实例列表

(1)描述

根据条件获取过滤后的实例列表。

List<Instance> selectInstances(String serviceName, boolean healthy) throws NacosException;List<Instance> selectInstances(String serviceName, List<String> clusters, boolean healthy) throws NacosException;

(2)参数

请求参数:

名称类型描述
serviceName字符串服务名
clustersList集群列表
healthyboolean是否健康

返回参数:
List 实例列表。

(3)请求示例

NamingService naming = NamingFactory.createNamingService(System.getProperty("serveAddr"));
System.out.println(naming.selectInstances("nacos.test.3", true));

5、获取一个健康实例

(1)描述

根据负载均衡算法随机获取一个健康实例。

Instance selectOneHealthyInstance(String serviceName) throws NacosException;Instance selectOneHealthyInstance(String serviceName, List<String> clusters) throws NacosException;

(2)参数

请求参数:

名称类型描述
serviceName字符串服务名
clustersList集群列表

返回参数:
Instance 实例。

(3)请求示例

NamingService naming = NamingFactory.createNamingService(System.getProperty("serveAddr"));
System.out.println(naming.selectOneHealthyInstance("nacos.test.3"));

6、监听服务

(1)描述

监听服务下的实例列表变化。

void subscribe(String serviceName, EventListener listener) throws NacosException;void subscribe(String serviceName, List<String> clusters, EventListener listener) throws NacosException;

(2)参数

请求参数:

名称类型描述
serviceName字符串服务名
clustersList集群列表
listenerEventListener回调listener

返回参数:

(3)请求示例

NamingService naming = NamingFactory.createNamingService(System.getProperty("serveAddr"));
naming.subscribe("nacos.test.3", event -> {if (event instanceof NamingEvent) {System.out.println(((NamingEvent) event).getServceName());System.out.println(((NamingEvent) event).getInstances());}
});

7、取消监听服务

(1)描述

取消监听服务下的实例列表变化。

void unsubscribe(String serviceName, EventListener listener) throws NacosException;void unsubscribe(String serviceName, List<String> clusters, EventListener listener) throws NacosException;

(2)参数

请求参数:

名称类型描述
serviceName字符串服务名
clustersList集群列表
listenerEventListener回调listener

返回参数:

(3)请求示例

NamingService naming = NamingFactory.createNamingService(System.getProperty("serveAddr"));
naming.unsubscribe("nacos.test.3", event -> {});

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

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

相关文章

Android | ADB 命令

Android Debug Bridge Android 调试桥&#xff0c;通过 C/S 的形式利用 PC 来操作 Android 设备&#xff0c;通过 ADB 可以利用 shell 直接操作真机或模拟器&#xff0c;比如传输文件、管理应用、拉取日志等。 常用的 ADB 指令 # 开启 ADB 服务 adb start-server# 停止 ADB …

可视化大屏设计模板 | 主题皮肤(报表UI设计)

下载使用可视化大屏设计模板&#xff0c;减少重复性操作&#xff0c;提高报表制作效率的同时也确保了报表风格一致&#xff0c;凸显关键数据信息。 软件&#xff1a;奥威BI系统&#xff0c;又称奥威BI数据可视化工具 所属功能板块&#xff1a;主题皮肤上传下载&#xff08;数…

阿里云k8s服务之间偶尔获取不到dns解析安装ACK NodeLocal DNSCache

1.背景 feign.RetryableException: No route to host (Host unreachable) executing POST http://osale-thirdparty/empty/detect 服务突然会中断&#xff0c;开发在看日志的时候会出现host找不到的情况&#xff0c;阿里云技术推荐安装dns缓存组件&#xff0c;加上这个组件会解…

Python实现机器学习(下)— 数据预处理、模型训练和模型评估

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。本门课程将介绍人工智能相关概念&#xff0c;重点讲解机器学习原理机器基本算法&#xff08;监督学习及非监督学习&#xff09;。使用python&#xff0c;结合sklearn、Pycharm进行编程&#xff0c;介绍iris&#xff08;鸢尾…

Excel学习 WPS版

Excel学习 1.界面基础1.1 方格移动快捷键1.2 自动适配文字长度1.3 跨栏置中1.4 多个单元格同宽度&#xff1a;1.5 下拉框选择1.6 打印预览1.7 绘制边框1.8 冻结一行多行表头1.9 分割视图 2.日期相关2.1 今日日期快捷键2.2 月份提取 3.数学公式3.1 自动增长3.2 排序3.3 筛选3.4 …

ISCSI:后端卷以LVM 的方式配置 ISCSI 目标启动器

写在前面 准备考试整理相关笔记博文内容涉及使用 LVM 做ISCSI 目标后端块存储 Demo理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都是不完整的&#…

数据结构——排序算法——冒泡排序

冒泡排序1 void swap(vector<int> arr, int i, int j) {int temp arr[i];arr[i] arr[j];arr[j] temp;}void bubbleSort1(vector<int> arr) {for (int i 0; i < arr.size() - 1; i){for (int j 0; j < arr.size() - 1 - i; j){if (arr[j] > arr[j 1…

【Unity编辑器扩展】| 顶部菜单栏扩展 MenuItem

前言【Unity编辑器扩展】 | 顶部菜单栏扩展 MenuItem一、创建多级菜单二、创建可使用快捷键的菜单项三、调节菜单显示顺序和可选择性四、创建可被勾选的菜单项五、右键菜单扩展5.1 Hierarchy 右键菜单5.2 Project 右键菜单5.3 Inspector 组件右键菜单六、AddComponentMenu 特性…

java web中部署log4j.xml

标题&#xff1a;Java Web中部署log4j.xml 目录&#xff1a; 1. 介绍 2. 配置log4j.xml文件 3. 配置web.xml文件 4. 配置Spring框架 5. 配置Spring Bean 6. 总结 ## 1. 介绍 在Java Web开发中&#xff0c;日志记录是非常重要的一部分。log4j是一个常用的Java日志记录框架&am…

springboot整合redis-sentinel哨兵模式集群(二)

定义Redis操作工具类 package com.luxifa.util; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component…

人工智能:神经细胞模型到神经网络模型

人工智能领域中的重要流派之一是&#xff1a;从神经细胞模型&#xff08;Neural Cell Model&#xff09;到神经网络模型&#xff08;Neural Network Model&#xff09;。 一、神经细胞模型 第一个人工神经细胞模型是“MP”模型&#xff0c;它是由麦卡洛克、匹茨合作&#xff0…

Java-华为真题-预定酒店

需求&#xff1a; 放暑假了&#xff0c;小王决定到某旅游景点游玩&#xff0c;他在网上搜索到了各种价位的酒店&#xff08;长度为n的数组A&#xff09;&#xff0c;他的心理价位是x元&#xff0c;请帮他筛选出k个最接近x元的酒店&#xff08;n>k>0&#xff09;&#xff…

通常用哪些软件做数据可视化大屏?

一般就两种&#xff0c;一种是可视化大屏编辑软件&#xff0c;另一种则是BI系统&#xff08;BI数据可视化工具&#xff09;。考虑到数据来源多、数据量大以及数据分析效率、直观易懂性等实实在在的客观问题&#xff0c;建议采用BI系统来制作数据可视化大屏。 BI系统做可视化大…

关于2023年下半年计算机技术与软件专业技术资格(水平)考试报名工作有关事项的通知

各市(区)人力资源和社会保障局&#xff0c;省级各有关部门人事处&#xff0c;中央驻陕有关单位人事处&#xff0c;各位考生&#xff1a; 根据人力资源社会保障部办公厅《关于2023年度专业技术人员职业资格考试计划及有关事项的通知》&#xff08;人社厅发〔2023〕3号&#xff…

【SpringMVC】JSR 303与interceptor拦截器快速入门

目录 一、JSR303 1、什么是JSR 303&#xff1f; 2、为什么要使用JSR 303&#xff1f; 3、JSR 303常用注解 3.1、常用的JSR 303注解 3.2、Validated与Valid区别 3.2.1、Validated 3.2.2、Valid 3.2.3、区别 4、使用案例 4.1、导入依赖 4.2、配置校验规则 4.3、编写…

Matlab图像处理-彩色图像基础

光谱 在17世纪60年代&#xff0c;人们普遍认为白光是一种没有其他颜色的纯色光&#xff0c;而彩色光是有某种缘故发生变化的光。为了验证这个假设&#xff0c;牛顿让一束阳光通过一面三棱镜&#xff0c;光线在墙上被分解成了八种不同的颜色&#xff0c;即&#xff1a;红、橙、…

vue基础知识九:动态给vue的data添加一个新的属性时会发生什么?怎样解决?

一、直接添加属性的问题 我们从一个例子开始 定义一个p标签&#xff0c;通过v-for指令进行遍历 然后给botton标签绑定点击事件&#xff0c;我们预期点击按钮时&#xff0c;数据新增一个属性&#xff0c;界面也 新增一行 <p v-for"(value,key) in item" :key&q…

python基于GDAL的多线程高速批量重采样、对齐栅格、对齐行列数,并无损压缩

在自己写代码处理遥感数据进行波段计算&#xff0c;或者基于遥感等空间数据进行机器学习、深度学习时&#xff0c;一般都需要各图层行列数一致。在QGIS中有“对齐栅格”工具可以完成该任务&#xff0c;但是QGIS中没有提供批量操作的接口&#xff0c;在数据比较多时&#xff0c;…

useTransition 和 useDeferredValue 初体验

useTransition 是一个帮助你在不阻塞 UI 的情况下更新状态的 React Hook。 通过 transition&#xff0c;UI 仍将在重新渲染过程中保持响应性。例如用户点击一个选项卡&#xff0c;但改变了主意并点击另一个选项卡&#xff0c;他们可以在不等待第一个重新渲染完成的情况下完成操…

eslint写jsx报错

eslint写jsx报错 ChatGPT提示 在写JSX时&#xff0c;ESLint可能会报出一些语法错误&#xff0c;这些错误通常是由于ESLint默认配置中不支持JSX语法导致的。为了解决这些错误&#xff0c;我们需要在ESLint配置文件中启用对JSX语法的支持。 首先&#xff0c;需要安装eslint-pl…