当前位置: 首页 > news >正文

Nacos学习笔记

Nacos官网

https://github.com/alibaba/nacos/releases

https://www.bilibili.com/video/BV1q3411Z79z

1. Nacos介绍

Nacos是Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

在这个介绍中,可以看出Nacos至少有三个核心功能:

1.动态服务发现
2.配置管理
3.服务管理

2. 下载并启动

从github下载压缩包并解压

cmd进入到bin路径下

# 默认会以集群模式启动,现在先指定以单机模式运行而非集群模式(-m standalone)
# 弹幕:2.2.0.1后版本启动失败的在配置文件中设置一下默认token# linux/unix/mac
sh startup.sh -m standalone
# 若使用ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:
bash startup.sh -m standalone
# windows
startup.cmd -m standalone

启动日志

在这里插入图片描述

日志信息可以看到默认情况下占用了8848端口,

配置文件nacos-server-2.1.1\nacos\conf\application.properties中也可以看到

server.servlet.contextPath=/nacos
server.port=8848

访问localhost:8848/nacos,默认用户名密码nacos/nacos

3. 配置管理

3.1 新建配置

新建配置时可以指定:

Data ID:相当于一个配置文件,比如相当于application.properties,或者application-
dev.properties。注意:在某个项目中使用application.properties文件中,那个application表示的就是当前应用,那我们在nacos进行配置时,就要尽可能的取一些有含义的DataID,比如user.properties(表示用户应用的配置),order.properties(表示订单应用的配置),common.properties(表示多个应用共享的配置)

Group:在nacos中,一个Data ID,即一个或多个配置文件可以归类到同一个Group中,Group的作用就是用来区分Data ID相同的情况,不同的应用或中间件使用了相同的Data ID时就可以通过Group来进行区分,默认为DEFAULT_GROUP

配置内容:写具体的配置项,可以用properties的格式,也可以用yaml的格式

3.2 拉取配置

Java SDK(仅作了解)

参考官网 Java SDK v1
参考官网 Java SDK v2

添加依赖

<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>2.1.1</version>
</dependency>

获取配置

try {// nacos的地址String serverAddr = "localhost:8848";// 想要获取的配置文件的名字String dataId = "user.properties";// 分组String group = "DEFAULT_GROUP";Properties properties = new Properties();properties.put("serverAddr", serverAddr);ConfigService configService = NacosFactory.createConfigService(properties);String content = configService.getConfig(dataIld, group, 5000);System.out.println(content);
} catch (NacosException e) {e.printStackTrace();
}

在Java SDK中,除开有获取配置的API,同时也提供了新增、删除、监听配置的API。

我们可以通过如下代码来监听配置的变化

try {String serverAddr = "localhost:8848";String dataId = "user.properties";String group = "DEFAULT_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() {public void receiveConfigInfo(String configInfo) {System.out.println("recieve1:" + configInfo);}public Executor getExecutor() {return null;}});// 测试让主线程不退出,因为订阅配置是守护线程,主线程退出守护线程就会退出。正式代码中无需下面代码while (true) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printstackTrace();}}
} catch (NacosException e) {e.printStackTrace();
}

Spring

参考官网 Nacos Spring

添加依赖。最新版本可以在 maven 仓库,如mvnrepository.com中获取。

<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-spring-context</artifactId><version>1.1.1</version>
</dependency>

配置类

@Configuration
@EnableNacosConfig(globalProperties = @NacosProperties(serverAddr = "127.0.0.1:8848"))
@NacosPropertySource(dataId = "test", autoRefreshed = true)
public class NacosConfig {}

service类中设置属性值

// 用@Value也能取到值,
// 是因为@NacosPropertySource注解会负责把指定的datald的配置项拉取到应用,
// 并封装为PropertySource对象添加到Environment对象中,所以@Value也能读取到相应的配置项。
@NacosValue(value = "${useLocalCache:false}", autoRefreshed = true)
private boolean useLocalCache;

SpringBoot

参考官网 Nacos Spring Boot

添加依赖

<dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-config-spring-boot-starter</artifactId><version>0.2.12</version>
</dependency>

application.properties 中配置 Nacos server 的地址

nacos.config.server-addr=127.0.0.1:8848

加载配置源,并开启自动更新

// 方式一:在配置类上添加,使用@NacosPropertySource加载dataId为example的配置源,并开启自动更新
@NacosPropertySource(dataId = "example", autoRefreshed = true)// 方式二:在application.properties配置文件中添加
nacos.config.data-id=test
nacos.config.auto-refresh=true
nacos.config.bootstrap.enable=true // 此项必须添加,否则启动报错

service类中设置属性值

@NacosValue(value = "${useLocalCache:false}", autoRefreshed = true)
private boolean useLocalCache;

SpringCloud

官网 Nacos Spring Cloud
版本说明 · alibaba/spring-cloud-alibaba Wiki · GitHub

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>2.2.8.RELEASE</version>
</dependency>

bootstrap.properties 中配置 Nacos server 的地址和应用名

spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name=example

通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新

@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {@Value("${useLocalCache:false}")private boolean useLocalCache;@RequestMapping("/get")public boolean get() {return useLocalCache;}
}

3.3 按profile拉取配置

在使用spring-cloud-starter-alibaba-nacos-config时,我们除开可以配置spring.cloud.nacos.config.server-addr外,还可以配置:

  1. spring.cloud.nacos.config.group:默认为"DEFAULT_GROUP"
  2. spring.cloud.nacos.config.file-extension:默认为"properties"
  3. spring.cloud.nacos.config.prefix:默认为${spring.application.name}

所以,默认情况下,会拉取"DEFAULT_GROUP"组下dataid为user.properties的配置,不过通过看源码:

private void loadApplicationConfiguration(CompositePropertySource compositePropertySource, String dataIdPrefix,NacosConfigProperties properties, Environment environment) {//获取文件扩展名String fileExtension = properties.getFileExtension();//获取groupString nacosGroup = properties.getGroup();// load directly once by default// 加载nacos的配置loadNacosDataIfPresent(compositePropertySource, dataIdPrefix, nacosGroup,fileExtension, true);// load with suffix, which have a higher priority than the default// 加载带后缀的配置,优先级高于上一个loadNacosDataIfPresent(compositePropertySource,dataIdPrefix + DOT + fileExtension, nacosGroup, fileExtension, true);// Loaded with profile, which have a higher priority than the suffix// 加载带profile,文件格式后缀的配置,优先级高于上一个for (String profile : environment.getActiveProfiles()) {String dataId = dataIdPrefix + SEP1 + profile + DOT + fileExtension;loadNacosDataIfPresent(compositePropertySource, dataId, nacosGroup,fileExtension, true);}
}

可以发现,在拉取配置时会分为三步,且优先级由低到高

1.拉取dataid为user的配置

2.拉取dataid为user.properties的配置

3.拉取dataid为user-${spring.profiles.active}.properties的配置

还值得注意的是,在拉取配置时,还会加上namespace这个维度取获取配置,可以通过spring.cloud.nacos.config.namespace进行配置。

我们可以在Nacos管理台:

1.新建不同的namespace

2.在每个namespace下可以进行dataid名称相同的配置

3.每个dataid又可以分配到不同的group下

相当于一个三层结构

在这里插入图片描述

3.4 拉取多个配置

一个应用可能不止需要一个配置,有时可能需要拉取多个配置,此时可以利用

# 第一种配置 extension-configs 表示拉取额外的配置文件
spring.cloud.nacos.config.extension-configs[0].data-id=datasource.properties
# 或者使用第二种配置 shared-configs 也表示拉取额外的配置文件
spring.cloud.nacos.config.shared-configs[0].data-id=common.properties

extension-configs和shared-configs区别

  1. extension-configs表示本应用特有的
  2. shared-configs表示多个应用共享的

注意优先级(由高到低):
extension-configs[2] > extension-configs[1]> extension-configs[0]
shared-configs[2] > shared-configs[1] > shared-configs[0]
主配置 > extension-configs > shared-configs

配置项除了data-id之外还可以指定refresh、file-extension、group

spring.cloud.nacos.config.shared-configs[0].data-id=common.properties
spring.cloud.nacos.config.shared-configs[0].refresh=true
spring.cloud.nacos.config.shared-configs[0].file-extension=properties
spring.cloud.nacos.config.shared-configs[0].group=DEFAULT_GROUP

3.5 配置的自动刷新

自动刷新配置的意思是,一旦应用中引入的配置发生了变化,应用端也能及时获取到最新值。

默认情况下,

extension-configsshared-configs不会自动刷新

主配置会自动刷新,可以通过spring.cloud.nacos.config.refresh-enabled=false来关闭主配置的自动刷新。

尽管默认情况下会自动刷新,但是对于通过@Value的使用方式,还需要在该Bean上加上@RefreshScope注解,这样才能动态地修改@Value属性,达到动态更新的最终效果。

4. 服务管理

服务管理的核心就是:服务注册、服务发现。

4.1 Java SDK(仅作了解)

参考官网 Java SDK v1
参考官网 Java SDK v2

服务注册

可以直接使用Nacos提供的Java SDK进行服务注册

添加依赖

<dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-client</artifactId><version>2.1.1</version>
</dependency>
简单服务注册
// 注册一个服务
NamingService naming = NamingFactory.createNamingService("localhost:8848");
// 服务的名字为app1,访问该服务的地址是11.11.11.11:8888
naming.registerInstance("app1", "11.11.11.11", 8888);// 执行完上述代码后,不要让停掉,可以加上
System.in.read();

页面展示

运行代码后,可在Nacos管理台看到
在这里插入图片描述

注意

1.一个服务可以属于某一个组,可以在注册时指定group

2.一个服务下可以有多个实例

3.一个服务下多个实例可以分为多个虚拟集群

比如以下代码就注册了一个服务有三个实例,分别属于两个虚拟集群

NamingService naming = NamingFactory.createNamingService("localhost:8848");
naming.registerInstance("app1", "11.11.11.10", 8888, "cluster0");NamingService naming1 = NamingFactory.createNamingService("localhost:8848");
naming1.registerInstance("app1", "11.11.11.11", 8888, "cluster1");NamingService naming2 = NamingFactory.createNamingService("localhost:8848");
naming2.registerInstance("app1", "11.11.11.12", 8888, "cluster2");System.in.read();

对应的管理台展示

在这里插入图片描述
在这里插入图片描述

定制化注册服务
NamingService naming = NamingFactory.createNamingService("localhost:8848");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<String, String>();
instanceMeta.put("site", "et2");
instance.setMetadata(instanceMeta);naming.registerInstance("app1", instance);System.in.read();

页面展示

在这里插入图片描述

服务发现

服务注册之后,服务消费者就可以来使用了

// 获取某个服务的所有实例信息
NamingService naming = NamingFactory.createNamingService("localhost:8848");
System.out.println(naming.getAllInstances("app1"));// 获取所有健康的实例
naming.selectInstances("app1", true)// 直接获取某一个健康的实例(权重随机算法)
naming.selectOneHealthyInstance("app1")// 监听服务实例的变化
NamingService naming = NamingFactory.createNamingService("localhost:8848");
naming.subscribe("app1", event -> {if (event instanceof NamingEvent) {System.out.println(((NamingEvent) event).getServiceName());System.out.println(((NamingEvent) event).getInstances());}
});

4.2 Spring/SpringBoot

Nacos Spring Boot 快速开始

引入依赖

<dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-discovery-spring-boot-starter</artifactId><version>0.2.12</version>
</dependency>

服务提供者

application.yml

nacos:discovery:server-addr: 127.0.0.1:8848namespace: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxusername: xxxpassword: xxxcontext-path: /xxxauto-register: true

启动应用,就能完成服务注册(nacos管理页面【服务列表】能看到)。

服务消费者

使用 @NacosInjected 注入 Nacos 的 NamingService 实例

@Controller
@RequestMapping("/discovery")
public class DiscoveryController {@NacosInjectedprivate NamingService namingService;@GetMapping(value = "/get")@ResponseBodypublic List<Instance> get(@RequestParam String serviceName) throws NacosException {return namingService.getAllInstances(serviceName);}
}

调用上述接口http://localhost:8080/discovery/get?serviceName=example,得到返回结果如下

{"ip": "xx.xx.xx.xx","port": 8099,"weight": 1,"healthy": true,"enabled": true,"ephemeral": true,"clusterName": "DEFAULT","serviceName": "DEFAULT_GROUP@@xxxx","metadata": {"preserved.register.source": "SPRING_BOOT"},"ipDeleteTimeout": 30000,"instanceHeartBeatTimeOut": 15000,"instanceHeartBeatInterval": 5000
}

4.3 SpringCloud

添加依赖

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2.2.8.RELEASE</version>
</dependency>

服务提供者

application.properties

server.port=8070
spring.application.name=service-provider
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

启动类上添加@EnableDiscoveryClient开启服务注册

启动应用,就能完成服务注册(nacos管理页面【服务列表】能看到)

服务消费者

application.properties

server.port=8080
spring.application.name=service-consumer
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

启动类上添加@EnableDiscoveryClient开启服务发现

定义RestTemplate,使用@LoadBalanced

@LoadBalanced
@Bean
public RestTemplate restTemplate() {return new RestTemplate();
}

使用RestTemplate调用服务

@RestController
public class ConsumerController {@Autowiredprivate RestTemplate restTemplate;@GetMapping(value = "/test")public String echo() {return restTemplate.getForObject("http://service-provider/test", String.class);}
}

4.4 高级功能

4.4.1 临时实例与持久实例

持久实例:就算服务实例下线了,也不会被删除,永远在线。

临时实例:不会永远在线,健康检测不通过会被删除(详见下方【健康检查】),默认情况下,注册给nacos的实例都是临时实例。

# 配置为持久实例,表示实例信息会持久化到磁盘中去
spring.cloud.nacos.discovery.ephemeral=false

持久实例使用场景:若消费端在某种情况下想拿到已经下线的实例的实例信息,则可以把实例注册为持久实例。

4.4.2 健康检查

参考博客:六、Nacos源码系列:Nacos健康检查

Nacos作为注册中心不仅提供了服务注册和服务发现的功能,还提供了服务可用性检测的功能。

主要有两种检测机制

  • 客户端主动上报:主动向Nacos服务端发送心跳,告诉Nacos服务端自己是否还活着。

  • 服务端主动下探:Nacos服务端主动向每个Nacos客户端发起探活。若探活成功,说明客户端还活着,若探活失败,则服务端将会剔除客户端。

Nacos 1.x

在Nacos 1.x的版本中

持久实例:则走的是Raft协议存储。健康检测是服务端主动下探机制

临时实例:走的是distro协议。健康检测是客户端主动上报机制。客户端每隔5秒主动上报自己的健康状态,即向注册中心发送心跳来维持自身的健康(healthy)状态。若发送心跳的间隔时间超过15秒,Nacos服务端会将该实例标记为亚健康状态,若超过30秒没有发送心跳,那么该服务实例会被从服务列表中剔除。

Nacos 2.x

在Nacos 2.x版本以后

持久实例:与以前一样,还是通过服务端主动下探机制

临时实例:变成通过长连接来判断实例是否健康。

长连接:一个连接上可以连续发送多数据包,在连接保持期间,若没有数据包发送,需要双方发链路检测包

在Nacos 2.x之后,使用Grpc协议代替了http协议,长连接会保持客户端和服务端发送的状态,在源码中ConnectionManager管理所有客户端的长连接。ConnectionManager每3秒检测所有超过20S内没有发生过通讯的客户端,向客户端发起ClientDetectionRequest探测请求,如果客户端在指定时间内成功响应,则检测通过,否则执行unregister方法移除Connection。

若客户端持续和服务端进行通讯,服务端是不需要主动下探的,只有当客户端没有一直和服务端通信的时候,服务端才会主动下探操作。

4.4.3 保护阈值

正常来说消费端只会拿到健康实例,在健康实例占总实例比例比较小的情况下,会导致所有流量都会压到健康实例上,此时仅剩的几个健康实例也会被压垮。

可以设置保护阈值(0-1的一个比例),若服务的所有实例中,健康实例的比例低于这个值就触发保护。

一旦触发保护,在服务消费端会拉取到所有实例,无论是否健康。虽然部分消费端会因为访问到不健康的实例而请求失败,但也有一部分请求能访问到健康实例。这样达到了保护仅剩的健康实例的作用。

在SpringCloud Tencent中,这个功能叫“全死全活”。

4.4.4 权重

一个服务的多个实例,可能对应的机器配置不同,所以可以给不同的实例设置不同的权重

在这里插入图片描述

给8070这个实例设置权重为2,它的权重就是8071的两倍,就应该要承受2倍的流量。

但消费一个服务时,通常是通过ribbon进行负载均衡的,使用的是ribbon自己的负载均衡策略,因此默认情况下nacos配置的权重是起不到作用的。若想用到nacos中所配置的权重,需编写:

@Bean
public IRule ribbonRule() {return new NacosRule();
}

4.4.5 Cluster(就近访问)

一个服务下会有多个实例,在nacos中,可以将这些实例指定到不同的集群中

# 指定当前实例属于哪个集群
spring.cloud.nacos.discovery.cluster-name=bj

页面

在这里插入图片描述

hz集群只有一个8070的实例,bj集群有8071、8072两个实例。

此时在服务消费端,也可以指定要使用的集群。

若消费端没有配置cluster-name,则会使用所有集群。

# 使得服务调用者也在bj集群,此时服务消费者就只会调用到bj集群中的两个实例
spring.cloud.nacos.discovery.cluster-name=bj

4.4.6 集群部署

在前面,我们都是使用的单机模式部署的nacos服务端的,为保证nacos的高可用,即保证配置中心和注册中心的高可用,通常需要以集群的方式来部署nacos server。

conf/cluster配置节点

首先,修改conf/cluster文件,把nacos集群中所有的节点的ip和port配置进去:

192.168.65.46:8848
192.168.65.46:8858
192.168.65.46:8868

此处是在同一个机器上搭建三个节点,所以ip相同。通常是多个机器上搭建,ip不同。

每个几点的cluster文件都要配置,表示每个nacos节点都得知道自己所在集群的节点情况。

如果不以默认的8848端口启动,需修改application.properties中的server.port

配置数据源并启动
使用内置数据源

启动

# 分别在三个节点的bin路径下运行,使用内置数据源
startup.cmd -p embedded

启动成功

在这里插入图片描述

通过以下三个路径访问nacos管理台,效果一样。

http://localhost:8848/nacos
http://localhost:8848/nacos
http://localhost:8848/nacos

在这里插入图片描述

使用mysql

mysql中新建数据库nacos_config

执行脚本文件naco\conf\nacos-mysql,自动创建相关的表。

只有配置中心的配置信息才会存到mysql中,不会存注册中心的服务信息。

修改application.properties中关于datasource的部分,三个节点都要改,且连的是同一个数据库。

### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos2?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=xxx
db.password.0=xxx

配置好后,可以直接使用startup.cmd启动。

客户端配置
spring.cloud.nacos.discovery.server-addr=192.168.65.46:8848, 192.168.65.46:8858, 192.168.65.46:8858

这样其中某个节点就算挂掉了,应用也能从其他节点获取信息。

但是,在应用上指定多个ip地址,若ip地址发生变化,就得修改,所以可以在nacos集群之上在搭一个nginx。

nginx

先下载一个nginx,然后按照如下步骤修改conf/nginx配置文件

添加upstream

upstream nacos-cluster {server 192.168.65.46:8848;server 192.168.65.46:8858;server 192.168.65.46:8868;
}

添加location

location /nacos {proxy_pass http://nacos-cluster;
}

启动nginx后,访问http://localhost/nacos就可以进去nacos管理台

客户端服务只需按如下配置即可进行服务注册与发现。

spring.cloud.nacos.discovery.server-addr=localhost:80/nacos

相关文章:

Nacos学习笔记

Nacos官网 https://github.com/alibaba/nacos/releases https://www.bilibili.com/video/BV1q3411Z79z 1. Nacos介绍 Nacos是Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 在这个…...

微信小程序 nodejs+vue+uninapp学生在线选课作业管理系统

基于微信小程序的班级作业管理助手使用的是MySQL数据库&#xff0c;nodejs语言和IDEA以及微信开发者工具作为开发工具&#xff0c;这些技术和工具我在日常的作业中都经常的使用&#xff0c;并且因为对编程感兴趣&#xff0c;在闲暇时间也进行的进行编程的提高&#xff0c;所以在…...

trpc-go 博客系统

trpc-go 博客系统 使用go语言构建的全栈项目&#xff0c;充分利用了go的简洁性、高性能和并发处理能力。 系统采用了trpc-go框架和北极星进行分布式开发&#xff0c;展示了如何基于腾讯开源技术栈构建微服务架构&#xff0c;实现高效的服务通信和管理。 https://github.com/…...

【JAVA】Servlet开发

目录 HttpServlet HttpServletRequest HttpServletResponse 错误页面 设置网页自动刷新时间 构造重定向相应 js发起http请求 服务器端对js发起的http请求进行处理 前端获取后端数据&#xff0c;添加到当前页面的末尾&#xff0c;代码示例&#xff1a; 前后端交互&…...

k8s helm 删除 tiller

kuberneter 上面装了 helm 想卸载还并不是那么简单, 参考 stackoverflow 回复 kubectl get -n kube-system secrets,sa,clusterrolebinding -o name|grep tiller|xargs kubectl -n kube-system delete kubectl get all -n kube-system -l apphelm -o name|xargs kubectl dele…...

Python入门(小白友好)

知识图谱 搭建环境 安装Python:Download Python | Python.org 安装PyCharm:Download PyCharm: The Python IDE for data science and web development by JetBrains 注意:专业版本是收费的,新手小白使用社区版(community)即可 创建第一个项目: 一些PyCharm的设置(也适用…...

【数据结构与算法】:非递归实现快速排序、归并排序

&#x1f525;个人主页&#xff1a; Quitecoder &#x1f525;专栏&#xff1a;数据结构与算法 上篇文章我们详细讲解了递归版本的快速排序&#xff0c;本篇我们来探究非递归实现快速排序和归并排序 目录 1.非递归实现快速排序1.1 提取单趟排序1.2 用栈实现的具体思路1.3 代码…...

2024-3-18-C++day6作业

1>思维导图 2>试编程 要求: 封装一个动物的基类&#xff0c;类中有私有成员&#xff1a;姓名&#xff0c;颜色&#xff0c;指针成员年纪 再封装一个狗这样类&#xff0c;共有继承于动物类&#xff0c;自己拓展的私有成员有&#xff1a;指针成员&#xff1a;腿的个数&a…...

【OceanBase诊断调优】—— 敏捷诊断工具obdiag一键分析OB集群日志设计与实践

最近总结一些诊断OCeanBase的一些经验&#xff0c;出一个【OceanBase诊断调优】专题&#xff0c;也欢迎大家贡献自己的诊断OceanBase的方法。 1. 前言 obdiag定位为OceanBase敏捷诊断工具。1.2版本的obdiag支持诊断信息的一键收集&#xff0c;光有收集信息的能力&#xff0c;…...

python 调用redis创建查询key

部署redis apiVersion: apps/v1 # 描述api版本&#xff0c;默认都用这个 kind: Deployment # 资源类型&#xff0c;可以配置为pod&#xff0c;deployment&#xff0c;service&#xff0c;statefulset等等 metadata: # deployment相关的元数据&#xff0c;用于描述deployment的…...

归并排序思路

归并排序是一种经典的分治算法&#xff0c;其基本思路可以简述为以下几步&#xff1a; 分解&#xff1a;将待排序的数组递归地分解成较小的子数组&#xff0c;直到每个子数组只包含一个元素为止。这里采用分治的思想&#xff0c;将问题不断地划分为规模更小的子问题。 合并&am…...

【蓝桥杯选拔赛真题65】python输出三个字符 第十五届青少年组蓝桥杯python选拔赛真题 算法思维真题解析

目录 python输出3个字符 一、题目要求 1、编程实现 2、输入输出...

K8S日志收集方案-EFK部署

EFK架构工作流程 部署说明 ECK (Elastic Cloud on Kubernetes)&#xff1a;2.7 Kubernetes&#xff1a;1.23.0 文件准备 crds.yaml 下载地址&#xff1a;https://download.elastic.co/downloads/eck/2.7.0/crds.yaml operator.yaml 下载地址&#xff1a;https://download.e…...

js基础语法大全(时间戳,uuid,字符串转json)

目录 一、获取时间戳二、获取uuid三、字符串转json格式 一、获取时间戳 var times Math.round(new Date().getTime()/1000).toString(); //获取 10位 时间戳 console.log(times);二、获取uuid function guid() {return xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx.replace(/[xy]…...

uView LoadingIcon 加载动画

此组件为一个小动画&#xff0c;目前用在uView的loadMore加载更多等组件的正在加载状态场景。 #平台差异说明 App&#xff08;vue&#xff09;App&#xff08;nvue&#xff09;H5小程序√√√√ #基本使用 通过mode设定动画的类型&#xff0c;circle为圆圈的形状&#xff0…...

Elasticsearch使用Kibana进行基础操作

一、Restful接口 Elasticsearch通过RESTful接口提供与其进行交互的方式。在ES中&#xff0c;提供了功能丰富的RESTful API的操作&#xff0c;包括CRUD、创建索引、删除索引等操作。你可以用你最喜爱的 web 客户端访问 Elasticsearch 。事实上&#xff0c;你甚至可以使用 curl …...

“SRP模型+”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价及拓展应用教程

原文链接&#xff1a;“SRP模型”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价及拓展应用教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247597452&idx5&snf723d9e5858a269d00e15dbe2c7d3dc0&chksmfa823c6…...

【Windows 常用工具系列 15 -- VMWARE ubuntu 安装教程】

文章目录 安装教程镜像下载 工具安装 安装教程 安装教程参考链接&#xff1a;https://blog.csdn.net/Python_0011/article/details/131619864 https://linux.cn/article-15472-1.html 激活码 VMware 激活码连接&#xff1a;https://www.haozhuangji.com/xtjc/180037874.html…...

SpringSecurity(SpringBoot2.X版本实现)

资料来源于 SpringSecurity框架教程-Spring SecurityJWT实现项目级前端分离认证授权 侵权删 目录 介绍 快速开始 认证 认证流程 登录校验流程 SpringSecurity完整流程 认证流程详解 代码实现 准备工作 mysql mybatis-plus redis 统一返回类 核心代码 密码加密存…...

仿牛客项目Day8:社区核心功能2

显示评论 数据库 entity_type代表评论的目标类型&#xff0c;评论帖子和评论评论 entity_id代表评论的目标id&#xff0c;具体是哪个帖子/评论 targer_id代表评论指向哪个人 entity public class Comment {private int id;private int userId;private int entityType;priv…...

Vmware虚拟机配置虚拟网卡

背景 今天同事咨询了我一个关于虚拟机的问题&#xff0c;关于内网用Vmware安装的虚拟机&#xff0c;无法通过本机访问虚拟上的Jenkins的服务。   验证多次后发现有如下几方面问题。 Jenkins程序包和JDK版本不兼容&#xff08;JDK1.8对应Jenkins不要超过2.3.57&#xff09;虚…...

双向链表代码(带哨兵位循环/不带哨兵位不循环

以下代码全为本人所写&#xff0c;如有错误&#xff0c;很正常&#xff0c;还请指出&#xff0c; 目录 带哨兵位循环 test.c DLList.c DLList.h 不带哨兵位不循环 test.c DLList.c DLList.h 带哨兵位循环 test.c #define _CRT_SECURE_NO_WARNINGS#include"DLlist.h&…...

C语言自学笔记13----C语言指针与函数

C 语言指针与函数 在C语言编程中&#xff0c;也可以将地址作为参数传递给函数。 要在函数定义中接受这些地址&#xff0c;我们可以使用指针。这是因为指针用于存储地址。让我们举个实例&#xff1a; 示例&#xff1a;通过引用致电 #include <stdio.h> void swap(int n1, …...

每日五道java面试题之mybatis篇(一)

目录&#xff1a; 第一题. MyBatis是什么&#xff1f;第二题. ORM是什么?第三题. 为什么说Mybatis是半自动ORM映射工具&#xff1f;它与全自动的区别在哪里&#xff1f;第四题. 传统JDBC开发存在的问题第五题. JDBC编程有哪些不足之处&#xff0c;MyBatis是如何解决这些问题的…...

一文解读ISO26262安全标准:概念阶段

一文解读ISO26262安全标准&#xff1a;概念阶段 1 相关项定义2 安全生命周期启动3 危害分析和风险评估 HaRa4 功能安全概念 由上一篇文章知道&#xff0c;安全生命周期包含概念阶段、产品开发阶段、生产发布后续阶段。本文详细解读概念阶段要进行的安全活动。 本部分规定了车辆…...

微信小程序调用百度智能云API(菜品识别)

一、注册后生成应用列表创建应用 二、找到当前所需使用的api菜品识别文档 三、点链接看实例代码 这里需要使用到如下几个参数&#xff08;如下&#xff09;&#xff0c;其他的参数可以不管 client_id &#xff1a; 就是创建应用后的API Keyclient_secret&#xff1a; 就是创建…...

idea项目mapper.xml中的SQL语句黄色下划线去除

问题描述 当我们使用idea开发java项目时&#xff0c;经常会与数据库打交道&#xff0c;一般在使用mybatis的时候需要写一大堆的mapper.xml以及SQL语句&#xff0c;每当写完SQL语句的时候总是有黄色下划线&#xff0c;看着很不舒服。 解决方案&#xff1a; 修改idea的配置 Edi…...

es 聚合操作(二)

书接上文&#xff0c;示例数据在上一篇&#xff0c;这里就不展示了 一、Pipeline Aggregation 支持对聚合分析的结果&#xff0c;再次进行聚合分析。 Pipeline 的分析结果会输出到原结果中&#xff0c;根据位置的不同&#xff0c;分为两类&#xff1a; Sibling - 结果和现有…...

【vue.js】文档解读【day 5】| ref模板引用

如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 本人会很热心的阐述自己的想法&#xff01;谢谢&#xff01;&#xff01;&#xff01; 文章目录 模板引用前言访问模板引用模板引用与v-if、v-show的结合v-for中的模板引用函数模板引用 模板引用 前言 …...

算法简单小技巧

主页&#xff1a;xiaocr_blog 1.最小公倍数和最大公约数 #include<iostream> using namespace std; int main(){int a,b;cin>>a>>b;int r a%b;while (r!0){a b;b r;r a%b;}cout<<b<<endl;return 0 ; } #include<iostream> using nam…...

一些设计网站/营销推广运营

在每次直播带货结束后&#xff0c;都应当对本次的直播数据和带货数据进行复盘&#xff0c;以此来优化直播带货方案。 数据包含总观看人数、每个时间段用户的在线人数、单次直播的涨粉人数、评论数、单款产品成交量、商品总成交额、评论热点等等&#xff0c;通过对这些数据的复…...

cname域名解析/济南seo优化

题目大意 给你一个n 让你用0~n^2-1的数填满一个n*n的正方形 满足每个数值出现一次且每行每列的异或值相等 输出任意一种方案 分析 我们发现对于4*4的正方形 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 是满足条件的 那么如果对正方形中的每一个数都加上一个相同的数 那么这…...

古腾堡 主题 wordpress/seo收费还是免费

选择排序概念 选择排序&#xff08;Selection sort&#xff09;是一种简单直观的排序算法。它的工作原理是&#xff1a;第一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;然后再从剩余的未排序元素中寻…...

wordpress站长工作/企业宣传软文

链接&#xff1a;https://ac.nowcoder.com/acm/contest/553/C来源&#xff1a;牛客网 题目描述 Chino的数学很差&#xff0c;因此Cocoa非常担心。今天&#xff0c;Cocoa准备教Chino和排队有关的问题。 我们总是会学各种排列组合的问题&#xff0c;那些题目大多数都是套路。而C…...

建设局权力大吗/百度seo排名优化

知识图谱 Knowledge Graph&#xff0c;知识域可视化或知识领域映射地图&#xff0c;是显示知识发展进程与结构关系的一系列各种不同的图形&#xff0c;用可视化技术描述知识资源及其载体&#xff0c;挖掘、分析、构建、绘制和显示知识及它们之间的相互联系。 知识图谱是通过将…...

哪个小说网站版权做的好/搜索引擎优化排名案例

为什么80%的码农都做不了架构师&#xff1f;>>> 在搭建centreon的过程中&#xff0c;需要pear模块支持。 什么是pear pear是PHP扩展与应用库&#xff08;the PHP Extension and Application Repository&#xff09;的缩写。它是一个PHP扩展及应用的一个代码仓库&am…...