分布式与微服务系列 - SpringBoot + Zookeeper集群 + Dubbo分布式托管(提供者、消费者)+ Nginx反向代理

news2024/11/22 19:26:08

一、前言

本内容仅用于个人学习笔记,如有侵扰,联系删除

再搭建集群项目前,请先学习相关技术的知识:

  • 分布式与微服务系列 - Dubbo
  • 分布式与微服务系列 - Zookeeper上篇:入门到精通
  • 参考文档:分布式与微服务系列(三)、SpringBoot+Zookeeper集群+Nginx反向代理+Dubbo分布式托管(提供者、消费者)

二、软件架构和微服务需求

1、微服务需求

我们知道软件架构的演化过程,从单体架构,到垂直架构,再到SOA架构,最后到现在较流行的微服务架构。每个架构都有各自的优缺点,随着架构体系的演化和现如今软件整体架构的需求在不断的提高,微服务之所以比较流行就是因为它将系统服务层完全独立出来,抽取为一个一个的服务;微服务架构采用去中心化思想,服务之间采用restful等轻量协议通信,相比ESB更轻量。因为创建一个系统要考虑到全面服务,总体来说要能做到软件架构的三要素:高可用、高性能、高并发。如果一个系统做不到这三个要素,那就不能称为一个好的软件系。

本文我们着重讲解,使用SpringBoot项目整合Zookeeper注册中心,Nginx反向代理和Dubbo远程代理分布式托管,最后实现系统的高可用、高并发和高性能,其核心就是使所有服务器面对海量访问能够实现负载均衡。

2、框架选择

  • SpringBoot是当前比较流行的框架,其底层集成了Spring、mybatis、hibernate等多种优秀框架,这个框架的好用程度就不多说了,用起来可以说是朗朗上手,带劲。
  • Nginx是一 个轻量级/高性能的反向代理Web服务器,而且Nginx支持跨平台、配置简单、高并发连接:处理2-3万并发连接数,官方监测能支持5万并发,内存消耗小:开启10个nginx才占150M内存 ,nginx处理静态文件好,耗费内存少,它能够实现非常高效的反向代理和负载平衡。
  • Dubbo是一款微服务开发框架,它提供了RPC通信与微服务治理两大关键能力。这意味着,使用Dubbo开发的微服务,将具备相互之间的远程发现与通信能力,同时利用Dubbo提供的丰富服务治理能力,可以实现诸如服务实现、负载均衡、流量调度等服务治理诉求。同时Dubbo是高度可扩展的,用户几乎可以在任意功能点去定制自己的实现,以改变框架的默认行为来满足自己的业务需求。
  • Zookeeper是Apache Hadoop的子项目,是一个树型的目录服务,支持变更推送,适合作为Dubbo服务的注册中心,工业强度较高,可用于生产环境,并推荐使用。
    我们最终要实现的效果如下图(让其Dubbo分布式中的服务器全部使用集群,实现负载均衡):
    在这里插入图片描述

3、集群分布(下面为此图实战演示)

在这里插入图片描述

三、搭建Zookeeper注册中心集群服务

因为本次测试是在一台电脑上做测试,所以暂不使用Linux虚拟机启动Zookeeper集群服务了,怕到时候电脑啊承受不住,挂掉。我们就先在Windows下使用Zookeeper测试即可。

1、配置三台zookeeper注册中心服务器(数量可选)

在这里插入图片描述

2、修改三台zookeeper配置信息

在这里插入图片描述
修改zoo.cfg配置文件信息:
在这里插入图片描述
修改里面的配置
在这里插入图片描述
这三行代码(不要修改)依次粘到后两台zookeeper配置文件中,别忘了更改端口号依次为2182、2183:

server.1=127.0.0.1:2801:3801
server.2=127.0.0.1:2802:3802
server.3=127.0.0.1:2803:3803

3、配置zookeeper集群区分id

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

4、启动zookeeper集群服务

在这里插入图片描述
在启动过程中,发现第一台有报错,莫要慌,不要紧,因为在第一台启动的时候会自动寻找灵台两台zokkeeper,找不到你说急不急,所以就报错了,等三台zookeeper都启动成功了,就不会报错了!
在这里插入图片描述
如果实在不放心,可以连接zookeeper自带的客户端,查看下当前节点是否已创建!
在这里插入图片描述
在这里插入图片描述
出现上述节点就说明zookeeper集群此时已经启动成功了,最后一个客户端窗口可以关闭,但是上述仨窗口放着,可千万别关哈!!!

四、启动Dubbo管理控制台可视化界面

我们人如果想要知道服务提供者和消费者是是否成功注册和订阅到zookeeper注册中心,Dubbo官方为我们提供了一个Dubbo管理控制台可视化界面。

启动Dubbo控制台界面有两种方式,详情可以查看分布式微服务系列 - Dubbo

1、修改dubbo-admin的配置文件

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

2、打包dubbo-admin项目

在这里插入图片描述
在打开的DOS命令窗口中执行命令mvn clean package,先清除一下,然后打包项目,第一次执行可能会有点慢,大概一分钟左右,稍安勿躁:
在这里插入图片描述
打包完成出现target目录:
在这里插入图片描述
在这里插入图片描述

3、运行dubbo-admin-0.0.1-SNAPSHOT.jar包

首先你要确保你的此jar包所在的路径没有中文,你就可以直接在打开DOS命令窗口,切换到此路径下,执行命令java -jar dubbo-admin-0.0.1-SNAPSHOT.jar即可运行;如果有中文,将此jar包直接拷贝到另外一个没有中文的目录下,再执行命令:
在这里插入图片描述
如果觉得每次启动打开DOS窗口比较麻烦,那就jar包所在目录下创建一个批处理:
在这里插入图片描述
在这里插入图片描述
如果你得jar包运行出现错误,那就是你上述的配置或路径写错了,仔细检查一遍按照我上述的步骤重新打包很快的。

启动成功,然后我们就可以在浏览器地址栏输入localhost:7001直接访问了
在这里插入图片描述

五、创建服务提供者集群服务(三个)

1、新建springboot_dubbo_provider聚合项目

在这里插入图片描述

2、引入pom.xml坐标依赖文件

  1. dubbo服务提供者聚合服务的pom.xml
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.wts</groupId>
    <artifactId>springboot_dubbo_provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot_dubbo_provider</name>
    <description>dubbo服务提供者聚合服务</description>
    <packaging>pom</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <modules>
        <module>dubbo_provider_api</module>
        <module>dubbo_provider_service</module>
    </modules>

</project>
  1. dubbo_provider_api的pom.xml配置
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.wts</groupId>
    <artifactId>dubbo_provider_api</artifactId>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

    </dependencies>

</project>
  1. dubbo_provider_provider的pom.xml配置
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.wts</groupId>
    <artifactId>dubbo_provider_service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>dubbo_provider_service</name>
    <description>dubbo_provider_service</description>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--dubbo与springboot集成启动器-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.6</version>
        </dependency>

        <!--dubbo与注册中心zookeeper整合包-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-registry-zookeeper</artifactId>
            <version>2.7.6</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.curator</groupId>
                    <artifactId>curator-recipes</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--实现自动化创建节点路径的父节点-->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.2.0</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3、在dubbo_provider_api模块新建包com.wts.service在这里插入代码片,在此包下新建HelloService接口

在这里插入图片描述
com.wts.service.HelloService

package com.wts.service;

/**
 * @Description: HelloService
 * @Author: wts
 * @Date: 2022/12/23 10:37
 * @Version 1.0
 */
public interface HelloService {

    public String sayHello(String name);
}

在这里插入图片描述

4、在dubbo_provider_service模块新建包com.wts.service.impl,在此包下新建接口HelloServiceImpl实现类

在这里插入图片描述

com.wts.impl.HelloServiceImpl

package com.wts.impl;

import com.wts.service.HelloService;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Value;

/**
 * @Description: HelloServiceImpl
 * @Author: wts
 * @Date: 2022/12/23 10:38
 * @Version 1.0
 */
@Service
public class HelloServiceImpl implements HelloService {

    @Value("${server.port}")
    private String port;

    @Override
    public String sayHello(String name) {
        return "hello--" + port + "--" + name;
    }
}

注意:@Service注解是org.apache.dubbo.config.annotation.Service包下的,不是spring包下的。

5、核心配置文件(使用application.yml树状结构)

server:
  port: 8081  #服务器端口号
dubbo:
  application:
    name: springboot_dubbo_provider   #提供者应用名
  registry:
    address: 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183  #连接注册中心集群
    protocol: zookeeper  #dubbo采用的注册中心协议
  protocol:   #连接注册中心协议
    port: 20881   #dubbo端口号为20880,此处我们一会为了做集群区分,先改成20881
    name: dubbo   #dubbo协议名
  monitor:
    address: 127.0.0.1:7070   #dubbo监控中心地址
  config-center:  #配置中心
    timeout: 25000  #最大超时时间
  scan:
    base-packages: com.wts.impl   #扫描哪个包下提供的服务


6、启动第一台provider-8081提供者服务

maven webapps项目下,可以直接使用tomcat7插件,只需修改端口号,就可以启动多台服务,在SpringBoot项目下,当然也可以启动多台服务,如下所示:
在这里插入图片描述
进入配置中心:
在这里插入图片描述
启动之前,确认服务器端口号和dubbo端口号,以及提供服务方法的返回值:
在这里插入图片描述

7、启动第二台provider-8082提供者服务

在这里插入图片描述
修改application.yml配置文件中的端口号,两处port:
在这里插入图片描述

8、启动第三台provider-8083提供者服务

在这里插入图片描述
修改application.yml配置文件中的端口号,两处port:
在这里插入图片描述
此时三台服务提供者已经全部启动,但是是否成功注册到zookeeper中心了,我们可以通过上述dubbo-admin管理控制台,查看:
在这里插入图片描述
在这里插入图片描述
到这,我们就可以很安心的往下接着走下去了,三个服务者已经注册到registory服务中心了。

六、创建服务消费者集群服务(四个)

1、新建springboot_dubbo_consumer项目

在这里插入图片描述

2、引入pom.xml坐标依赖文件

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.wts</groupId>
    <artifactId>springboot_dubbo_consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot_dubbo_consumer</name>
    <description>dubbo服务消费者</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>

        <dependency>
            <groupId>com.wts</groupId>
            <artifactId>dubbo_provider_api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <!--springboot启动器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--springboot测试启动器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--dubbo与springboot集成启动器-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.6</version>
        </dependency>
        
        <!--dubbo与注册中心zookeeper整合包-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-registry-zookeeper</artifactId>
            <version>2.7.6</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.curator</groupId>
                    <artifactId>curator-recipes</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        
        <!--实现自动化创建节点路径的父节点-->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.2.0</version>
        </dependency>

        <!-- 实现对 Spring Session 使用Redis作为数据源的自动化配置 -->
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>

        <!-- 实现对 Spring Data Redis 的自动化配置 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <exclusions>
                <!-- 去掉对 Lettuce 的依赖,因为 Spring Boot 优先使用 Lettuce 作为 Redis 客户端 -->
                <exclusion>
                    <groupId>io.lettuce</groupId>
                    <artifactId>lettuce-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        
        <!-- 引入 Jedis 的依赖,这样 Spring Boot 实现对 Jedis 的自动化配置 -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

注意这里需要引入提供方接口
在这里插入图片描述

3、新建包com.wts.controller,在此包下新建HelloController

package com.wts.controller;

import com.wts.service.HelloService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


/**
 * @Description: HelloController
 * @Author: wts
 * @Date: 2022/12/23 11:15
 * @Version 1.0
 */


@RestController
@RequestMapping("/demo")
public class HelloController {

    @Reference
    private HelloService helloService;

    @Value("${server.port}")
    private int port;

    @RequestMapping("/hello")
    public String getName(String name){
        //远程调用,获取响应结果
        String result = helloService.sayHello(name);
        System.out.println("consumer-" + port + "\t" + result);
        return result;
    }

}

注意:

@Reference
HelloService helloService;

此处的HelloService访问的是远程的Provider所提供的服务,所有使用@Autowire注解是加载不到的,要使用@Reference注解调用远程提供者发布的@Service注解标注的服务注册接口。

4、核心配置文件(使用application.yml树状结构)

server:
  port: 2011  #服务器端口号
dubbo:
  application:
    name: springboot_dubbo_consumer   #消费者服务名称
  registry:   #注册中心
    address: 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183  #连接注册中心集群
    protocol: zookeeper #dubbo采用zookeeper注册中心协议
  consumer:    #消费者节点(配置当前消费者的统一规则,每个@Reference不需要每个都配置)
    check: false   #启动时不用检测提供者是否已经注册
  config-center:
    timeout: 25000   #超时时间  单位秒
  monitor:
    protocol: registry   #dubbo监控中心协议,自己去监控中心找

在启动消费者前,要注意一点,因为SpringBoot内部机制会自动加载DataSource数据源和Redis相关配置,即使你没有配任何置数据库相关配置信息,它内部也会默认加载,这个时候我们启动消费者服务就会出现如下错误:

Error creating bean with name ‘enableRedisKeyspaceNotificationsInitializer‘

这个时候如果你配置了数据库和redis相关配置,暂时先全部注释掉,然后在消费者主入口类的@SpringBootApplication排除运行期间不包括的服务,如下:

package com.wts;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, RedisAutoConfiguration.class})
public class SpringbootDubboConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootDubboConsumerApplication.class, args);
    }

}

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, RedisAutoConfiguration.class}),exclude就代表不包括,排除的意思,这个时候再去逐个启动消费者服务就可以了。

5、启动第一台consumer-2011服务消费者

在这里插入图片描述

6、启动第二台consumer-2012服务消费者

在这里插入图片描述

7、启动第三台consumer-2013服务消费者

在这里插入图片描述

8、启动第三台consumer-2014服务消费者

在这里插入图片描述
此时再去Dubbo-admin管理控制台可视化界面查看:
在这里插入图片描述

七、使用Nginx反向代理(消费者)

1、nginx反向代理作用

上述我们开启了四台消费者服务,那么我们怎么知道每次访问的是哪一台服务消费者,既然我们配置了四台就要实现集群的机制,那么怎么实现?

这个时候Nginx作用就来了,Nginx反向代理可以实现负载均衡,也即是我们只需在Nginx的配置文件中配置需要通过的消费者服务,nginx内部机制算法会自动帮我们实现负载均衡,配置如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、启动nginx

在这里插入图片描述

在这里插入图片描述
nginx启动之后,此时我们就可以通过www.ebuy.com域名进行测试访问了!直接访问应该会进入nginx的内置默认页面。

八、通过nginx反向代理,请求消费者,通过消费者访问提供者

在地址栏输入http://www.ebuy.com/demo/hello?name=jason

1、第一次请求

在这里插入图片描述
查看控制台,请求到的是哪一台消费者:
在这里插入图片描述

2、第二次请求

在这里插入图片描述

查看控制台,请求到的是哪一台消费者:
在这里插入图片描述

3、第三次请求

在这里插入图片描述
查看控制台,请求到的是哪一台消费者:
在这里插入图片描述

4、第四次请求

在这里插入图片描述
查看控制台,请求到的是哪一台消费者:
在这里插入图片描述
由上述测试可以看出,nginx反向代理在我们第一次请求会随机帮我们选一台消费者,然后后续请求就会轮询访问消费者,这样我们就实现了服务器的负载均衡,避免了当访问量巨大时导致某一台服务器超负载的情况。

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

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

相关文章

状态机——奇葩的状态表示

状态机——奇葩的状态表示 简述 在动态规划中&#xff0c;遇到有一个点有多个状态&#xff0c;混在一起无法表示&#xff0c;那么就可以把状态分开&#xff0c;并且构造出不同状态之间的转移关系&#xff0c;然后再求出状态转移方程&#xff0c;之后就OK了。 题目 1049. 大…

GNN algorithms(3): Tri-party Deep Network Representation

目录 Tri-party Deep Network Representation Essence Thinking Abstract Introduction Problem Definition Tri-DNR pipelines Model Architecture Tri-party Deep Network Representation Essence 1) Deepwalk提取graph structure信息&#xff0c;即structural nod…

MyBatis 一文基础总结

MyBatis 一文基础总结老师的随堂上课笔记&#xff0c; 供参考~1.框架概述1.1 软件开发常用结构1.1.1三层架构三层的处理请求的交互&#xff1a;用户---> 界面层--->业务逻辑层--->数据访问层--->DB 数据库1.1.2 常用框架常见的 J2EE 中开发框架&#xff1a;MyBatis…

adworld-web-inget-20221226

inget 题目来源: 宜兴网信办 题目描述: 无 题目场景: http://61.147.171.105:51222 http://61.147.171.105:51222/?id1%27%20%20or%2011%20– Please enter ID,and Try to bypass nice : congratulations Flag Is : cyberpeace{3df1eecfb5f794d6a94eba429f7e2846} ┌…

【NI Multisim 14.0编辑环境——菜单栏】

目录 序言 一、菜单栏 &#x1f349;1.文件 &#x1f349;2.编辑 &#x1f349;3.视图 &#x1f349; 4.绘制 &#x1f349;5.MCU&#xff08;微控制器&#xff09;菜单 &#x1f349; 6.仿真 &#x1f349; 7.转移 &#x1f349; 8.工具 &#x1f349; 9.报告 &…

录屏有声音吗?电脑如何录屏有声音?图文教程来了!

无论是学习、办公还是娱乐&#xff0c;都需要屏幕录制。许多人在录制视频后发现视频没有发出声音。录屏有声音吗&#xff1f;电脑如何录屏有声音&#xff1f;一个相对简单的方法是在使用电脑的屏幕录制功能时检查是否打开录制屏幕的声音。此外&#xff0c;如果您担心每次都需要…

这应该是全网最全的MySQL数据库的常用命令了吧

目录 前言 数据库的创建 数据表的操作 表数据的增删查改 分组与函数查询 分组与函数查询 运算符&#xff1a;数学运算符 连接查询 前言 今天给大家点来MySQL数据库的常用命令总结&#xff0c;这应该是全网最详细&#xff0c;最实用的数据库命令总结了&#xff0c;因为命…

addr2line

1、符号表 1.1什么是符号表 符号表是内存地址与函数名、文件名、行号的映射表。符号表元素如下所示&#xff1a; <起始地址> <结束地址> <函数> [<文件名:行号>] 1.2为什么要配置符号表 为了能快速并准确地定位引擎发生Crash的代码位置 举个例子…

【UE4 第一人称射击游戏】16-重新装弹

上一篇&#xff1a; 【UE4 第一人称射击游戏】15-修复蹲伏和冲刺同时执行的bug 本章效果&#xff1a; 步骤&#xff1a; 1.打开“Weapon_Base”&#xff0c;添加两个整数类型变量&#xff0c;分别命名为“MaxAmmo”和“ClipSize”&#xff0c;表示最大载弹量和每次重新装弹的…

MATLAB多项式符号运算

符号计算是指在运算时&#xff0c;无须事先对变量进行赋值&#xff0c;而是将所有得到的结果以标准的符 号形式表示出来。符号计算是以符号对象和符号表达式作为运算对象的表达形式&#xff0c;最终给出 的是解析解;在运算过程中不会受到计算误差累积问题的影响&#xff0c;其计…

信息安全编码标准:使用SAST实施安全编码实践

信息安全编码标准:使用SAST实施安全编码实践 当开发团队使用信息安全编码标准来开发软件时&#xff0c;通常希望更少的安全Bug和更好的代码质量&#xff0c;从而给用户带来健壮性更好的产品。在本篇文章中&#xff0c;我们将介绍信息安全编码标准的基础知识、最佳实践、如何以…

【swaggo】swaggo使用详解

一、swagger简介 swagger是一套基于OpenAPI规范构建的开源工具&#xff0c;使用RestApi。swagger-ui 呈现出来的是一份可交互式的API文档&#xff0c;可以直接在文档页面尝试API的调用。     gin-swagger 是基于注释生成 API 文档&#xff0c;项目地址:https://github.com/…

vulfocus复现:log4j2-rce-2021-12-09

文章目录一、漏洞影响二、复现过程一、漏洞影响 Apache Log4j 是一个基于Java的日志记录工具。经过多年的开发迭代&#xff0c;Log4j 1.x的维护已经变得非常困难&#xff0c;因为它需要与非常旧的 Java 版本兼容&#xff0c;所以于 2015 年 8 月正式升级为Log4j2。黑客可以恶意…

【C++】堆与二叉树(非常详细,附带堆排哦)

之前学习了很多的数据结构 有顺序表&#xff0c;堆&#xff0c;栈... 今天学习一种新的逻辑结构二叉树&#xff0c;他的物理结构是堆 让我们先简单回顾一下堆吧堆的简单介绍和一些简单功能的实现 1. 二叉树 其实堆就是一种特殊的数组&#xff0c;他的逻辑结构是二叉树 &#…

汽车OTA概述

文章目录 前言一、软件更新二、ECU刷写包复用 1.引入库2.读入数据总结前言 掌握OTA&#xff08;Over-The-Air&#xff0c;无线技术&#xff09;&#xff0c;汽车领域与IT领域正在技术融合&#xff01; 技术更新&#xff0c;也增加了车载应用场景&#xff0c;软件更新、实时诊…

内存管理的关键技术——反向映射机制

Cheetah&#xff0c;曾为U-boot社区和Linux内核社区提交过若干补丁&#xff0c;主要从事Linux相关系统软件开发工作&#xff0c;负责Soc芯片BringUp及系统软件开发&#xff0c;喜欢阅读内核源代码&#xff0c;在不断的学习和工作中深入理解内存管理&#xff0c;进程调度&#x…

大数据技术——Flume实战案例

实战案例目录1. 复制和多路复用1.1 案例需求1.2 需求分析1.3 实现操作2. 负载均衡和故障转移2.1 案例需求2.2 需求分析2.3 实现操作3. 聚合操作3.1 案例需求3.2 需求分析3.3 实现操作1. 复制和多路复用 1.1 案例需求 使用 Flume-1 监控文件变动&#xff0c;Flume-1 将变动内容…

图文详解二维差分

目录 前言 一、 二维差分的定义 二、二维差分的使用 三、计算二维差分 四、ACWing 798. 差分矩阵 前言 一维二维前缀和详解 图文详解一维差分 一、 二维差分的定义 对于一个给定的二维数组 arr&#xff0c;它的二维差分数组 d 中 d[i][j] 可以用如下公式计算&#xff1a;…

命令执行-无字母数字webshell

命令执行-无字母数字webshell 我们看如下代码&#xff1a; <?php if(!preg_match(/[a-z0-9]/is,$_GET[shell])) {eval($_GET[shell]); }在命令执行中&#xff0c;我们经常会碰到过滤了字母和数字的情况&#xff0c;那如何才能绕过呢&#xff1f; 我的想法&#xff1a;通…

【数据结构】ArrayList的简单使用

文章目录ArrayList一些ArrayList常用的方法杨辉三角打扑克时的洗牌与摸牌ArrayList 上一次我们自己模拟实现了一下数据结构中的顺序表&#xff0c;当然在我们日常使用时不需要每次使用都自己模拟实现一遍&#xff0c;Java中提供了ArrayList类&#xff0c;我们直接导包就可以使…