简单的Dubbo实验环境搭建

news2024/9/26 3:22:28

在这里插入图片描述

Dubbo-api中定义的UserQueryFacade接口可以发布在私服上,这样子dubbo-consumer和dubbo-provider就可以以maven依赖的形式导入使用。dubbo-provider需要提供接口的实现类,dubbo-consumer需要订阅该实现类,他们的元数据都通过zk进行记录。

许多教程都通过Spring XML的形式进行dubbo服务注册的,其实还有很多种方式,参考配置加载流程 | Apache Dubbo:

  1. Spring XML

参见示例

  <!-- dubbo-provier.xml -->
  
  <dubbo:application name="demo-provider"/>
  <dubbo:config-center address="zookeeper://127.0.0.1:2181"/>
  
  <dubbo:registry address="zookeeper://127.0.0.1:2181" simplified="true"/>
  <dubbo:metadata-report address="redis://127.0.0.1:6379"/>
  <dubbo:protocol name="dubbo" port="20880"/>
  
  <bean id="demoService" class="org.apache.dubbo.samples.basic.impl.DemoServiceImpl"/>
  <dubbo:service interface="org.apache.dubbo.samples.basic.api.DemoService" ref="demoService"/>
  1. Spring Annotation

参见示例

  // AnnotationService服务实现
  
  @Service
  public class AnnotationServiceImpl implements AnnotationService {
      @Override
      public String sayHello(String name) {
          System.out.println("async provider received: " + name);
          return "annotation: hello, " + name;
      }
  }
## dubbo.properties

dubbo.application.name=annotation-provider
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
  1. Spring Boot

参见示例

  ## application.properties
  
  # Spring boot application
  spring.application.name=dubbo-externalized-configuration-provider-sample
  
  # Base packages to scan Dubbo Component: @com.alibaba.dubbo.config.annotation.Service
  dubbo.scan.base-packages=com.alibaba.boot.dubbo.demo.provider.service
  
  # Dubbo Application
  ## The default value of dubbo.application.name is ${spring.application.name}
  ## dubbo.application.name=${spring.application.name}
  
  # Dubbo Protocol
  dubbo.protocol.name=dubbo
  dubbo.protocol.port=12345
  
  ## Dubbo Registry
  dubbo.registry.address=N/A
  
  ## DemoService version
  demo.service.version=1.0.0
  1. Java API

参考示例

public static void main(String[] args) throws IOException {
    ServiceConfig<GreetingsService> service = new ServiceConfig<>();
    service.setApplication(new ApplicationConfig("first-dubbo-provider"));
    service.setRegistry(new RegistryConfig("multicast://224.5.6.7:1234"));
    service.setInterface(GreetingsService.class);
    service.setRef(new GreetingsServiceImpl());
    service.export();
    System.out.println("first-dubbo-provider is running.");
    System.in.read();
}

Spring XML配置发布与服务调用

创建了三个模块,整体结构如下:
在这里插入图片描述

  1. 在dubbo-api模块中定义接口,并生成别的模块可以依赖的maven jar包,那我这里其实是provider,consumer,api都在localhost上,因此直接本地install生成maven jar.

    package com.jxz.dubbo.api;
    
    /**
     * @Author jiangxuzhao
     * @Description
     * @Date 2023/6/4
     */
    public interface UserQueryFacade {
        String query(String name);
    }
    
  2. 在dubbo-provider模块中定义服务提供者,实现前面发布的接口

    2.1 先提供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.jxz.dubbo</groupId>
            <artifactId>DubboLearning</artifactId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
        <artifactId>dubbo-provider</artifactId>
    
        <properties>
            <maven.compiler.source>8</maven.compiler.source>
            <maven.compiler.target>8</maven.compiler.target>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    
        <dependencies>
    <!--        引用自定义接口maven jar依赖-->
            <dependency>
                <groupId>com.jxz.dubbo</groupId>
                <artifactId>dubbo-api</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
    <!--    引用dubbo依赖-->
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo</artifactId>
                <version>2.7.1</version>
            </dependency>
        </dependencies>
    </project>
    

    2.2 服务提供者提供实现接口的服务提供类

    package com.jxz.dubbo.provider.impl;
    
    import com.jxz.dubbo.api.UserQueryFacade;
    
    /**
     * @Author jiangxuzhao
     * @Description
     * @Date 2023/6/4
     */
    public class UserQueryFacadeImpl implements UserQueryFacade {
    
        @Override
        public String query(String name) {
            return "query name is "+name;
        }
    }
    

    2.3 dubbo provider配置文件放在resources/META-INF/spring

    参考快速开始 | Apache Dubbo,其中各个配置含义参考XML 配置 | Apache Dubbo

    <?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://dubbo.apache.org/schema/dubbo"
           xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    
        <!-- 提供方的应用服务名,最好是当前应用归属的系统名称,用于计算依赖关系 -->
        <dubbo:application name="dubbo-provider"  />
    
        <!-- 注册中心的地址名,这里可以先注册到本地,到时用url注册到ZK中 -->
        <dubbo:registry address="N/A" />
    
        <!-- 服务提供方需要暴露的服务接口,采用dubbo协议,端口号为20880 -->
        <dubbo:protocol name="dubbo" port="20880" />
    
        <!-- 服务提供方需要暴露的服务功能,也就是对应接口和实现类 -->
        <dubbo:service interface="com.jxz.dubbo.api.UserQueryFacade" ref="UserQueryFacadeImpl" />
        <!-- 和本地bean一样注册服务实现类,id对应上面ref -->
        <bean id="UserQueryFacadeImpl" class="com.jxz.dubbo.provider.impl.UserQueryFacadeImpl" />
    </beans>
    

    其中详细的含义可以看参考手册,比如各种XML配置的详细含义Schema 配置参考手册 | Apache Dubbo,以及<dubbo:protocol指定的服务提供协议,缺省为dubbo,这我理解起来每个协议就是对rpc传输中各种配置的规范,看协议参考手册 | Apache Dubbo,其中Dubbo协议为默认的单一长链接。
    在这里插入图片描述

    2.4 Dubbo-provider服务提供者启动类中,启动spring容器

    package com.jxz.dubbo.provider;
    
    import org.apache.dubbo.container.Main;
    
    /**
     * @Author jiangxuzhao
     * @Description 服务提供者启动类中,启动spring容器
     * @Date 2023/6/4
     */
    public class ProviderApplication {
        public static void main(String[] args) {
            Main.main(new String[]{"spring"});
        }
    }
    

    其中SpringContainer会去读取相关的配置文件,参考源码:默认读取DEFAULT_SPRING_CONFIG,即 “classpath*:META-INF/spring/*.xml”,因此我们的dubbo provider配置文件写在这个目录下

    public class SpringContainer implements Container {
    
        public static final String SPRING_CONFIG = "dubbo.spring.config";
        public static final String DEFAULT_SPRING_CONFIG = "classpath*:META-INF/spring/*.xml";
        private static final Logger logger = LoggerFactory.getLogger(SpringContainer.class);
        static ClassPathXmlApplicationContext context;
    
        public static ClassPathXmlApplicationContext getContext() {
            return context;
        }
    
        @Override
        public void start() {
          
            String configPath = ConfigUtils.getProperty(SPRING_CONFIG);
            if (StringUtils.isEmpty(configPath)) {
                configPath = DEFAULT_SPRING_CONFIG;
            }
          	// 内部也是通过ClassPathXmlApplicationContext
            context = new ClassPathXmlApplicationContext(configPath.split("[,\\s]+"), false);
            context.refresh();
            context.start();
        }
    

    2.5 provider服务提供者注册测试
    在这里插入图片描述

  3. 在dubbo-consumer模块中定义服务消费者

​ 3.1 先提供pom依赖:

<dependencies>
<!--        引用自定义接口maven jar依赖-->
    <dependency>
        <groupId>com.jxz.dubbo</groupId>
        <artifactId>dubbo-api</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
<!--    引用dubbo依赖-->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo</artifactId>
        <version>2.7.1</version>
    </dependency>
</dependencies>

​ 3.2 dubbo consumer配置文件放在resources/META-INF/spring

<?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://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
    <dubbo:application name="dubbo-consumer"  />

    <!-- 注册中心的地址名,这里可以先注册到本地,到时用url注册到ZK中 -->
    <dubbo:registry address="N/A" />

    <!-- 引用服务提供者的接口,生成远程服务代理,可以和本地bean一样使UserQueryFacade,其中url为服务提供者export的url -->
    <dubbo:reference id="UserQueryFacade" interface="com.jxz.dubbo.api.UserQueryFacade" url="dubbo://127.0.0.1:20880"/>
</beans>

其中指定了想调用的接口名以及对应的服务提供端口,id就是本地调用的对象

​ 3.3 dubbo-consumer服务消费者启动类

​ 加载Spring配置,并调用远程服务

package com.jxz.dubbo.consumer;

import com.jxz.dubbo.api.UserQueryFacade;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @Author jiangxuzhao
 * @Description
 * @Date 2023/6/5
 */
public class ConsumerApplication {
    public static void main(String[] args) {
        String configPath = "classpath*:META-INF/spring/*.xml";

        // 加载Spring配置
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(configPath);
        context.start();

        // 获取远程代理对象
        UserQueryFacade userQueryFacade = (UserQueryFacade)context.getBean(UserQueryFacade.class);
        String str = userQueryFacade.query("jiangxuzhao"); // 执行远程方法
        System.out.println( str ); // 显示调用结果
    }
}

​ 3.4 consumer服务消费者测试
在这里插入图片描述

碰到bug: No qualifying bean of type ‘com.jxz.dubbo.api.UserQueryFacade’ available

那是因为我在创建META-INF/spring目录的时候,直接META-INF.spring创建了一个层级目录,导致xml配置不上,因此没法找到相关服务。

  1. 集成ZK

    上面的服务调用都是在本地直接写死的,现在想从ZK中获取服务调用提供方的地址,首先去Index of /zookeeper (apache.org)下载zk安装包

​ 4.1 修改dubbo provider配置文件放在resources/META-INF/spring

<?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://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- 提供方的应用服务名,最好是当前应用归属的系统名称,用于计算依赖关系 -->
    <dubbo:application name="dubbo-provider"  />

    <!-- 注册中心的地址名,用url注册到ZK中 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />

    <!-- 服务提供方需要暴露的服务接口,采用dubbo协议,端口号为20880 -->
    <dubbo:protocol name="dubbo" port="20880" />

    <!-- 服务提供方需要暴露的服务功能,也就是对应接口和实现类 -->
    <dubbo:service interface="com.jxz.dubbo.api.UserQueryFacade" ref="UserQueryFacadeImpl" />
    <!-- 和本地bean一样注册服务实现类,id对应上面ref -->
    <bean id="UserQueryFacadeImpl" class="com.jxz.dubbo.provider.impl.UserQueryFacadeImpl" />
</beans>

​ 4.2 修改dubbo consumer配置文件放在resources/META-INF/spring

<?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://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
    <dubbo:application name="dubbo-consumer"  />

    <!-- 注册中心的地址名,用url注册到ZK中 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />

    <!-- 引用服务提供者的接口,生成远程服务代理,可以和本地bean一样使UserQueryFacade,其中不需要指定url了 -->
    <dubbo:reference id="UserQueryFacade666666" interface="com.jxz.dubbo.api.UserQueryFacade"/>
</beans>

服务方和消费方都修改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.jxz.dubbo</groupId>
        <artifactId>DubboLearning</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>dubbo-provider</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
<!--        引用自定义接口maven jar依赖-->
        <dependency>
            <groupId>com.jxz.dubbo</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
<!--    引用dubbo依赖-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.7.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.3.0</version>
        </dependency>
    </dependencies>
</project>

其中控制台一直报log4j和slf相关的错误,继续添加依赖:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-nop</artifactId>
    <version>1.7.2</version>
</dependency>
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

同时配置log4j.properties

log4j.rootLogger=debug, stdout, R

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log

log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=5

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

本来以为配置日志没什么用的,同时这时候provider我在idea控制台只是能运行,但是每次都是过一会就exit with code 1,却没有一点查错信息。配完日志以后,发现控制台打印的东西就多了,同时在provider端打印出了20880端口被占用,这不就是我为服务提供者的UserQueryFacadeImpl指定的端口嘛,之前并没有将其关闭,遂kill -9然后重新启动。Dubbo service server started!成功启动。

依次启动provider和consumer,发现consumer输出“query name is jiangxuzhao”,同时zk中注册上了两者的信息:
在这里插入图片描述

小小的修改了一下consumer,看它获取bean是根据class还是id获取

package com.jxz.dubbo.consumer;

import com.jxz.dubbo.api.UserQueryFacade;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.io.IOException;

/**
 * @Author jiangxuzhao
 * @Description
 * @Date 2023/6/5
 */
public class ConsumerApplication {
    public static void main(String[] args) throws IOException {
        String configPath = "classpath*:META-INF/spring/*.xml";

        // 加载Spring配置
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(configPath);
        context.start();

        // 获取远程代理对象,这是通过<dubbo:reference>中定义的class获取
        // UserQueryFacade userQueryFacade = (UserQueryFacade)context.getBean(UserQueryFacade.class);
        // 也支持通过bean id获取
        UserQueryFacade userQueryFacade = (UserQueryFacade)context.getBean("UserQueryFacade666666");
        String str = userQueryFacade.query("jiangxuzhao"); // 执行远程方法
        System.out.println( str ); // 显示调用结果

        System.in.read(); // 阻塞等待
    }
}

又尝试着加上个dubbo-provider2,直接就复制模块改下provider.xml中的port

<?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://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- 提供方的应用服务名,最好是当前应用归属的系统名称,用于计算依赖关系 -->
    <dubbo:application name="dubbo-provider"  />

    <!-- 注册中心的地址名,用url注册到ZK中 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />

    <!-- 服务提供方需要暴露的服务接口,采用dubbo协议,端口号为20880 -->
    <dubbo:protocol name="dubbo" port="20881" />

    <!-- 服务提供方需要暴露的服务功能,也就是对应接口和实现类 -->
    <dubbo:service interface="com.jxz.dubbo.api.UserQueryFacade" ref="UserQueryFacadeImpl" />
    <!-- 和本地bean一样注册服务实现类,id对应上面ref -->
    <bean id="UserQueryFacadeImpl" class="com.jxz.dubbo.provider.impl.UserQueryFacadeImpl" />
</beans>

Java API配置发布与服务调用

  1. Dubbo-api中定义新的接口
package com.jxz.dubbo.api;

/**
 * @Author jiangxuzhao
 * @Description
 * @Date 2023/6/17
 */
public interface UserUpdateFacade {
    String updateUser(String name);
}
  1. Dubbo-provider中实现接口并注册
package com.jxz.dubbo.provider.impl;

import com.jxz.dubbo.api.UserUpdateFacade;

/**
 * @Author jiangxuzhao
 * @Description
 * @Date 2023/6/17
 */
public class UserUpdateFacadeImpl implements UserUpdateFacade {
    @Override
    public String updateUser(String name) {
        return "Update your name is "+name;
    }
}

服务暴露

package com.jxz.dubbo.provider;

import com.jxz.dubbo.api.UserUpdateFacade;
import com.jxz.dubbo.provider.impl.UserUpdateFacadeImpl;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.ServiceConfig;

import java.io.IOException;

/**
 * @Author jiangxuzhao
 * @Description
 * @Date 2023/6/17
 */
public class JavaApiProviderApplication {
    public static void main(String[] args) throws IOException {
        // 创建暴露UserUpdateFacade接口的对象
        ServiceConfig<UserUpdateFacade> service = new ServiceConfig<>();
        service.setApplication(new ApplicationConfig("dubbo-provider-javaapi"));
        service.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
        service.setInterface(UserUpdateFacade.class);
        // 设置实现类并暴露服务
        service.setRef(new UserUpdateFacadeImpl());
        service.export();

        System.out.println("UserUpdateFacade-dubbo-provider is running...");
        // 阻塞等待
        System.in.read();
    }
}
  1. Dubbo-consumer中调用服务
package com.jxz.dubbo.consumer;

import com.jxz.dubbo.api.UserUpdateFacade;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.ReferenceConfig;
import org.apache.dubbo.config.RegistryConfig;

import java.io.IOException;

/**
 * @Author jiangxuzhao
 * @Description
 * @Date 2023/6/17
 */
public class JavaApiConsumerApplication {
    public static void main(String[] args) throws IOException {
        // 创建UserUpdateFacade接口的引用对象
        ReferenceConfig<UserUpdateFacade> reference = new ReferenceConfig<>();
        reference.setApplication(new ApplicationConfig("dubbo-consumer-javaapi"));
        reference.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
        reference.setInterface(UserUpdateFacade.class);
        // 直接拿到代理对象并进行远程调用
        UserUpdateFacade userUpdateFacade = reference.get();
        System.out.println(userUpdateFacade.updateUser("jiangxuzhao"));

        // 阻塞等待
        System.in.read();
    }
}

消费者输出:

Update your name is jiangxuzhao

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

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

相关文章

Three.js学习项目--3D抗美援朝数据可视化

文章目录 部分场景体验地址操作说明 视频我做了哪些&#xff08;功能&#xff09;局限源代码地址部分逻辑按需渲染模型加载动画控制器模型纹理条件切换模型加载同时请求部分纹理 生成进度条模型缩放小动画 部分场景 体验地址 https://kmyc.hongbin.xyz/ 操作说明 视频 操作说…

LeetCode——查询后矩阵的和

目录 1、题目 2、题目解读 3、代码 1、题目 2718. 查询后矩阵的和 - 力扣&#xff08;Leetcode&#xff09; 给你一个整数 n 和一个下标从 0 开始的 二维数组 queries &#xff0c;其中 queries[i] [typei, indexi, vali] 。 一开始&#xff0c;给你一个下标从 0 开始的…

数学建模常用模型(一):灰色预测法

数学建模常用模型&#xff08;一&#xff09;&#xff1a;灰色预测法 灰色预测法是一种用于处理少量数据、数据质量较差或者缺乏历史数据的预测方法。它适用于一些非线性、非平稳的系统&#xff0c;尤其在短期预测和趋势分析方面有着广泛的应用。灰色预测法作为一种强大的数学…

基于STM32+OneNet设计的物联网智慧路灯

一、前言 近年来,构筑智慧城市、推动城镇发展被国家列入重要工作范畴。发布的《超级智慧城市报告》显示,全球已启动或在建的智慧城市有1000多个,中国在建500个,远超排名第二的欧洲(90个)。从在建智慧城市的分布来看,我国已初步形成环渤海、长三角、珠三角、中西部四大智…

FreeRTOS 任务优先级 【杂记】

FreeRTOS任务优先级 FreeRTOS任务优先级&#xff1a;任务优先级数值越小&#xff0c;任务优先级越低。 1、 FreeRTOS 中任务的最高优先级是通过 FreeRTOSConfig.h 文件中的configMAX_PRIORITIES 进行配置的&#xff0c;用户实际可以使用的优先级范围是 0 到 configMAX_PRIORIT…

python 第七章 字典dict {}

系列文章目录 第一章 初识python 第二章 变量 第三章 基础语句 第四章 字符串str 第五章 列表list [] 第六章 元组tuple ( ) 文章目录 字典的应用场景创建字典的语法字典常见操作增改删查 字典的循环遍历遍历字典的key遍历字典的value遍历字典的元素遍历字典的键值对&#xff0…

【新款DVR、NVR、直播、录播机单芯片解决方案】

新款DVR、NVR、直播、录播机单芯片解决方案 一、 22AP80或SS522V100是入门级DVR解决方案&#xff0c;能做到4路1080p30fps编码 2路 1080p30fps解码 多路图像分析方法智能算法&#xff1b;可以平替Hi3520DV510 二、 22AP10或SS524V100&#xff0c;这是一款中端的DVR芯片&#…

java语言中方法的多态

文章目录 前言一、多态是什么&#xff1f;二、使用步骤 1.实操展示2.注意事项总结 前言 自然界中&#xff0c;生物是多种形态的&#xff0c;繁殖这一行为也是多样的&#xff0c;细菌是裂殖&#xff0c;禽类是卵生&#xff0c;哺乳动物是胎生......java语言中的一个创建的方法&a…

Nike登录的acw_sc__v2参数逆向详细思路分析(非常简单,建议入手)含AST解混淆代码

分析目录 前言一、分析三、总结四、番外1.AST解混淆 前言 最近周末闲着无事&#xff0c;看了一下Nike的登录&#xff0c;发现连环境都不用补acw_sc__v2这个参数&#xff0c;分享出来给大家趣味性娱乐一下 一、分析 打开F12抓包看看登录 老样子复制curl给抓到Postman里面去…

Qt多线程编程之线程池

QThreadPool与QRunnable 线程的创建及销毁需要与系统交互&#xff0c;会产生很大的开销。若需要频繁的创建线程建议使用线程池&#xff0c;有线程池维护一定数量的线程&#xff0c;当需要进行多线程运算时将运算函数传递给线程池即可。线程池会根据可用线程进行任务安排。 QT…

Android studio自动登录和记住密码的实现

Android studio自动登录和记住密码的实现 文章目录 Android studio自动登录和记住密码的实现前言一、效果二、设计思路三、知识点介绍1. SharedPreferenced2. checkButton就不介绍了 四、自动登录及记住密码实现总结与补充 前言 大家好&#xff0c;我是oy&#xff0c;今天介绍…

浅层神经网络

目录 1、神经网络表示 2、计算神经网络的输出 3、多个样本的向量化 4、激活函数 5、激活函数的导数 6、神经网络的梯度下降法 1、神经网络表示 输入层&#xff1a;有输入特征&#x1d465;1、&#x1d465;2、&#x1d465;3隐藏层&#xff1a;四个结点&#xff0c;表示你…

验证性实验 - 逻辑回归

练习2&#xff1a;逻辑回归 介绍 在本练习中&#xff0c;您将实现逻辑回归并将其应用于两个不同的数据集。还将通过将正则化加入训练算法&#xff0c;来提高算法的鲁棒性&#xff0c;并用更复杂的情形来测试模型算法。 在开始练习前&#xff0c;需要下载如下的文件进行数据上…

前端Vue非常简单实用商品分类展示组件 侧边商品分类组件

前端vue非常简单实用商品分类展示组件 侧边商品分类组件 &#xff0c; 下载完整代码请访问uni-app插件市场址:https://ext.dcloud.net.cn/plugin?id13084 效果图如下&#xff1a; #### 使用方法 使用方法 <!-- flist:第一级数组 slist&#xff1a;第二级数组 tlist&…

JS 介绍 Babel 的使用及 presets plugins 的概念

一、Babel 是什么 Bebal 可以帮助我们将新 JS 语法编译为可执行且兼容旧浏览器版本的一款编译工具。 举个例子&#xff0c;ES6&#xff08;编译前&#xff09;&#xff1a; const fn () > {};ES5&#xff08;编译后&#xff09;&#xff1a; var fn function() {}二、B…

NLP实战:使用Word2vec实现文本分类

目录 一、数据预处理 1、加载数据 2. 构建词典 3.生成数据批次和迭代器 二、模型构建 1.搭建模型 2.初始化模型 3.定义训练与评估函数 三、训练模型 1. 拆分数据集并运行模型 2. 测试指定数据 &#x1f368; 本文为[&#x1f517;365天深度学习训练营]内部限免文章&…

设计模式篇---单例模式

文章目录 概念结构与实现优缺点 概念 单例模式是结构最简单的设计模式&#xff0c;通过单例模式可以保证在整个系统中的一个类只有一个实例&#xff0c;从而节约系统资源。举个例子&#xff0c;比如windows电脑下的任务管理器只能打开一个&#xff0c;这个就是单例模式&#x…

【C语言进阶】程序员必备技能之文件操作

目录 &#x1f945;什么是文件&#xff1a; &#x1f3d1;程序文件&#xff1a;&#x1f3d1;数据文件&#xff1a; &#x1f3d1;文件名&#xff1a; &#x1f945;文件的打开和关闭&#xff1a;&#x1f3d1;文件指针&#xff1a; &#x1f3d1;fopen和fclose&#xff1a; &a…

genlogic GLG -CE 4.3 For Java/C#/C++ Crack

GLG CE工具包是一个极其灵活和强大的图形框架&#xff0c;用于构建显示实时数据的可视化界面&#xff0c;例如过程控制和监控的操作员显示、SCADA / HMI模拟和图表、 交通、遥测和网络监控显示&#xff0c;以及其他任务关键应用程序。 航电仪表板演示 该工具包包括 用于创建动…

面向对象三大特征

面向对象三大特征 众所周知&#xff0c;面向对象有三大特征 封装继承多态 封装继承多态&#xff0c;就好像武侠小说里的“金、木、水、火、土”一样&#xff0c;相生相克 封装 封装就像是武侠里的金钟罩铁布衫&#xff0c;把对象的数据和方法封装起来&#xff0c;对外只暴露…