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();
    //获取group
    String 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:8848
    namespace: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    username: xxx
    password: xxx
    context-path: /xxx
    auto-register: true

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

服务消费者

使用 @NacosInjected 注入 Nacos 的 NamingService 实例

@Controller
@RequestMapping("/discovery")
public class DiscoveryController {

    @NacosInjected
    private NamingService namingService;

    @GetMapping(value = "/get")
    @ResponseBody
    public 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 {
    @Autowired
    private 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

进销存管理完整方案:那些让人头疼的进销存难题及解决方法!

什么是进销存管理&#xff1f;为何进销存管理在企业管理中如此重要&#xff1f;进销存管理的核心模块包括哪些&#xff1f;为何企业在进销存管理中常常遭遇前后方协作不畅、数据不同步等痛点&#xff1f;又该如何针对进销存管理痛点进行优化&#xff1f;本文将从进销存管理的基…

python线性插值

假设有一个一维数组&#xff0c;但是此数组中只有部分位置上有值&#xff0c;其它位置数据缺失&#xff0c;现在想用线性插值的方法将其填充。 示例代码&#xff1a; import numpy as np# 假设你有一个长度为171的数组&#xff0c;名为full_data&#xff0c;其中有13个数据点…

matlab软件基础

第1讲 MATLAB初步 MATLAB是矩阵实验室&#xff08;Matrix Laboratory&#xff09;的简称&#xff0c;是美国MathWorks公司出品的商业数学软件&#xff0c;用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。MATLAB和Mathematica、Maple并称为三…

面试算法-51-翻转二叉树

题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 解 class Solution {public TreeNode invertTree(TreeNode root) {dfs(root);re…

电子科技大学链时代工作室招新题C语言部分---题号G

1. 题目 问题的第一段也是非常逆天&#xff0c;说实话&#xff0c;你编不出问题背景可以不编。 这道题的大概意思就是&#xff0c; Pia要去坐飞机&#xff0c;那么行李就有限重。这时Pia想到自己带了个硬盘&#xff0c;众所周知&#xff0c;硬盘上存储的数据就是0和1的二进制序…

elasticsearch安装部署

elasticsearch部署 安装elasticsearch1.部署单点es1.1.创建网络1.2.加载镜像1.3.运行 2.部署kibana2.1.部署2.2.DevTools 3.安装IK分词器3.1.在线安装ik插件&#xff08;较慢&#xff09;3.2.离线安装ik插件&#xff08;推荐&#xff09;3.3 扩展词词典3.4 停用词词典 4.部署es…

列表的常用操作

列表的常用操作&#xff08;方法&#xff09; 列表除了可以&#xff1a; 定义使用下标索引获取值 此外列表也提供一些列功能&#xff1a;插入元素删除元素清空元素修改元素统计元素个数 等等功能&#xff0c;这些功能我们都称之为&#xff1a;列表的方法 列表的查询功能&…

七:分布式

一、Nginx nginx安装 【1】安装pcre依赖 1.下载压缩包&#xff1a;wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz 2.解压压缩包&#xff1a;tar -xvf pcre-8.37.tar.gz 3.安装gcc&#xff1a;yum install gcc 4.安装gcc&#xff1a;yum ins…

Java的图书管理系统,确实有两把斧子 ! ! !

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

HCIE考证心得 | 在云校的学习收获颇多

我是来自深圳信息职业技术学院22级现代移动通信3-3班的冯同学&#xff0c;我在2023年12月12日通过了华为认证Cloud Service HCIE。在此&#xff0c;我将分享考证中的心得体会给大家。 备考的六点建议 一是要细心严谨&#xff0c;做实验时要全神贯注&#xff0c;明确实验要求…

基于python考试分析系统的设计和实现-flask-django-nodejs-php

随着电子技术的普及和快速发展&#xff0c;线上管理系统被广泛的使用&#xff0c;有很多商业机构都在实现电子信息化管理&#xff0c;图书推荐也不例外&#xff0c;由比较传统的人工管理转向了电子化、信息化、系统化的管理。   本文的重点是对考试分析系统展开了详细的描述&a…

填坑记5:安装imdb库失败 ERROR: No matching distribution found for imdb

收录于《填坑记》 一、问题 pip install imdb在网上查找原因&#xff0c;有以下几种可能&#xff1a; 库名拼写错误&#xff1a;首先确认你要安装的库名是否正确拼写。如果是想使用IMDb的数据&#xff0c;你可能在寻找的是 IMDbPY 这个库&#xff0c;而不是 imdb。库不存在&a…

软件开发项目管理/研发项目管理软件:国产EDA工具厂商行芯科技上线奥博思PowerProject项目管理软件平台

国内领先的EDA工具链提供商杭州行芯科技有限公司&#xff08;以下简称&#xff1a;行芯科技&#xff09;与北京奥博思软件技术有限公司达成战略合作&#xff0c;奥博思软件将基于PowerProject项目管理系统助力行芯科技实现研发项目的全生命周期管理&#xff0c;提升管理效能&am…

B010-springcloud alibaba 分布式事务 Seata

目录 分布式事务基础事务本地事务分布式事务分布式事务的场景 分布式事务解决方案全局事务/两阶段提交可靠消息服务最大努力通知TCC事务 Seata介绍Seata实现分布式事务控制案例基本代码修改order微服务OrderSeataControllerOrderServiceImpl5注释容错相关代码ProductClient 修改…

Avalon总线学习

Avalon总线学习 avalon总线可以分为&#xff1a; Avalon clock interface Avalon reset interface Avalon Memory mapped interface Avalon iterrupt interface Avalon streaming interface Avalon tri-state conduit interface Avalon conduit interface 1、Avalon c…

管道(acwing,蓝桥杯,二分)

题目描述&#xff1a; 有一根长度为 len 的横向的管道&#xff0c;该管道按照单位长度分为 len 段&#xff0c;每一段的中央有一个可开关的阀门和一个检测水流的传感器。 一开始管道是空的&#xff0c;位于 Li的阀门会在 Si 时刻打开&#xff0c;并不断让水流入管道。 对于位…

openEuler 22.03(华为欧拉)一键安装 Oracle 11G(231017)单机版

Oracle 一键安装脚本&#xff0c;演示 openEuler 22.03 一键安装 Oracle 11GR2 单机版过程&#xff08;全程无需人工干预&#xff09;&#xff1a;&#xff08;脚本包括 ORALCE PSU/OJVM 等补丁自动安装&#xff09; ⭐️ 脚本下载地址&#xff1a;Shell脚本安装Oracle数据库 …

高端嵌入式底层技术揭秘:《ARM汇编与逆向工程》

ARM架构简介 与传统的CISC&#xff08;Complex Instruction Set Computer&#xff0c;复杂指令集计算机&#xff09;架构相比&#xff0c;Arm架构的指令集更加简洁明了&#xff0c;指令执行效率更高&#xff0c;能够在更低的功耗下完成同样的计算任务&#xff0c;因此在低功耗…

2024流星全自动网页生成系统重构版源码

2024流星全自动网页生成系统重构版源码 源码介绍 流星全自动网页生成系统重构版源码分享&#xff0c;所有模板经过精心审核与修改&#xff0c;完美兼容小屏手机大屏手机&#xff0c;以及各种平板端、电脑端和360浏览器、谷歌浏览器、火狐浏览器等等各大浏览器显示。 为用户使…