基于grpc从零开始搭建一个准生产分布式应用(2) - 工程构建

开始本章之前默认读者已经配置好了以下环境:Intellij IDEA 2022.1.2、JDK 1.8.0_144、Maven 3,另外也建议大家在一些免费代码托管平台开个帐号,这样就可以免费使用git做版本处理了,笔者自己私人使用的是阿里云的云效平台。因为此专题涉及到代码,所以笔者暂时把工程名称定为【base-grpc-framework】。

本章代码任务:1、构建工程目录;2、完成springboot集成模块;

一、为什么工程结构需要设计?

工程的构建工作一般很容易被忽略,通常认为只是创建几个目录存储代码用而已。其实不然,工程目录结构合理与否除了直接会影响工程打包和上线流程,还会影响开发效率以及重构。

工程目录设计除了符合系统架构外,还要符合小组成员的开发习惯。所以在开发新项目或是优化祖传代码时一定要把这件事做为一件非常重要的事来对待,否则过程中重构工程结构的代价会非常大,想想N多代码需要迁移、多个分支在开发、还要大量的回归测试等等。

二、两种典型的工程目录结构

2.1、普通的分布式工程结构

大多数项目组都会采用这种格式(在这个系列专题中笔者用到的是这种结构),这种结构一般比较适用单体应用或是不太复杂的分布式应用,其特点是把API定义和API实现隔离开。其它模块都可看成是辅助模块被包装或是被引用,其结构如下:

其调用关系大致如下,比较简单不再详细描述了,同学们理解下就可以:

2.2、组件化的分布式工程结构

这种应用比较复杂,一般是为了满足一套代码多地部署而设计的。其特点是多地部署时其核心代码在逻辑上存在差别。比如电商中的结算流程,在不同国家都有法律上的明确要求。

结算流程在中国需要遵守二分帐期的法规要求,但这个法规只局限于中国,比如在泰国就没有。在用同一套代码实现时就需要在部署泰国时把二分这个逻辑拿掉,一般有两种方案:1、维护两套源码;2、把差异点隔离出来,按需打包;在综合考虑成本时一般在维护大型系统时一般都会采用第2套方案。下同给出两个例子,这两个例子可以组合使用以适应更多场景。

 这种方式不在本专题内容范畴内,所以只简单介绍下,感觉举的读者可在笔者写的《DDD领域驱动设计》专题中了解。

上图红框内的模块区分了国别,承载了不同国家的定制化业务代码,cn-中国,id-印尼,th-泰国。

上图红框内的模块区分了业务,承载了不同业务方的定制化代码,比如虚拟商品区别于实物商品的物流和仓储流程。

综上:如果在建设中台系统或是跨国系统时可以采用2.2节中的工程设计,建设普通的业务类系统或单体应用时可采用2.1节中的工程设计。

三、工程详细

3.1、总体结构

为了有个全局视角,笔者把后续需要用到的模块一次性全创建了,如下图所示,这里只需了解下全貌即可,后续章节笔者会带着大家一点点填内容:

  • pom.xml:项目主maven文件,主要定义公共的配置以及版本控制;
  • .gitignore:用git时忽略的提供文件配置;
  • base-grpc-framework-common:项目工具包;
  • base-grpc-framework-api:项目接口定义;
  • base-grpc-framework-core:接口业务实现;
  • base-grpc-framework-dao:数据库存储实现;
  • base-grpc-framework-application:项目启动包装应用;
  • base-grpc-framework-client:web客户端;

四、创建过程

本节中我们要实现上一节中提到的工程结构,在特殊的地方笔者会详细说明,通用的地方大家按图示自行创建即可在后续实现代码时再完善其内容。因此专题的代码笔者一直在写,部分源码已早于文档内容并可能存在错误,所以暂时先不共享了,在此专题结束时会统一放出来。实在有需要的同学可以私信笔者,不过笔者强烈建议大家随着笔者一起来动手。

笔者用的是IDE是idea,建议大家使用2022的版本,优化了很多便捷的操作。必要的插件可参考笔者的 ​​https://blog.51cto.com/arch/5277533​​ 一文,先安装即可后续应该全会用到了。完整的工程目录下如:

4.1、创建root工程

root工程,只有一个pom.xml文件,主要为了控制版本和一些公共的配置(可查看下面的源码注释),打包为pom类型。文档中所有的代码都是经过笔者测试过的,可复制后直接使用,完整代码如下:

<?xml versinotallow="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>

    <!--工程定义-->
    <groupId>com.zd</groupId>
    <artifactId>base-grpc-framework-parent</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <!--引入springboot框架-->
    <parent>
        <artifactId>spring-boot-starter-parent</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>2.2.2.RELEASE</version>
    </parent>

    <!--版本定义:插件相关、配置相关、工具框架、grpc、数据库、其它杂项-->
    <properties>
        <java.version>1.8</java.version>
        <maven.compile.source>1.8</maven.compile.source>
        <maven.compile.target>1.8</maven.compile.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <maven.kr.motd>1.6.2</maven.kr.motd>
        <maven.org.xolstice>0.6.1</maven.org.xolstice>

        <nacos.version>0.2.8</nacos.version>
        <junit.test.version>4.12</junit.test.version>

        <hutool.version>5.7.21</hutool.version>
        <lombok.version>1.18.20</lombok.version>
        <guava.version>30.1-jre</guava.version>
        <mapstruct.version>1.4.2.Final</mapstruct.version>

        <grpc.version>2.13.0.RELEASE</grpc.version>
        <io.grpc.version>1.42.1</io.grpc.version>
        <protobuf.java.version>3.19.1</protobuf.java.version>

        <mybatisplus.version>3.4.1</mybatisplus.version>
        <mysql.version>8.0.23</mysql.version>
        <druid.version>1.1.22</druid.version>

        <commons-lang3.version>3.9</commons-lang3.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!--nacos应用配置-->
            <dependency>
                <groupId>com.alibaba.boot</groupId>
                <artifactId>nacos-config-spring-boot-starter</artifactId>
                <version>${nacos.version}</version>
            </dependency>

            <!--公共的工具类-->
            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-all</artifactId>
                <version>${hutool.version}</version>
            </dependency>

            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>${guava.version}</version>
            </dependency>

            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
                <scope>compile</scope>
            </dependency>

            <dependency>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct</artifactId>
                <version>${mapstruct.version}</version>
            </dependency>
            <dependency>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct-processor</artifactId>
                <version>${mapstruct.version}</version>
            </dependency>

            <!--grpc相关-->
            <!--用于生成源代码的辅助类,供API模块使用-->
            <dependency>
                <groupId>io.grpc</groupId>
                <artifactId>grpc-stub</artifactId>
                <version>${io.grpc.version}</version>
            </dependency>
            <dependency>
                <groupId>io.grpc</groupId>
                <artifactId>grpc-protobuf</artifactId>
                <version>${io.grpc.version}</version>
            </dependency>

            <!--用于服务端和客户端引用-->
            <dependency>
                <groupId>net.devh</groupId>
                <artifactId>grpc-server-spring-boot-starter</artifactId>
                <version>${grpc.version}</version>
            </dependency>
            <dependency>
                <groupId>net.devh</groupId>
                <artifactId>grpc-client-spring-boot-starter</artifactId>
                <version>${grpc.version}</version>
            </dependency>

            <!--proto生成java代码的工具库,建议三端都引用-->
            <dependency>
                <groupId>com.google.protobuf</groupId>
                <artifactId>protobuf-java</artifactId>
                <version>${protobuf.java.version}</version>
            </dependency>
            <dependency>
                <groupId>com.google.protobuf</groupId>
                <artifactId>protobuf-java-util</artifactId>
                <version>${protobuf.java.version}</version>
            </dependency>

            <!--数据库相关-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>

            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>${druid.version}</version>
            </dependency>

            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus</artifactId>
                <version>${mybatisplus.version}</version>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatisplus.version}</version>
            </dependency>

            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>${commons-lang3.version}</version>
            </dependency>

        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.test.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!--三方仓库-->
    <repositories>
        <repository>
            <id>central</id>
            <name>aliyun nexus</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>

    <modules>
        <module>base-grpc-framework-common</module>
        <module>base-grpc-framework-api</module>
        <module>base-grpc-framework-core</module>
        <module>base-grpc-framework-dao</module>
        <module>base-grpc-framework-application</module>

        <module>base-grpc-framework-client</module>
    </modules>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${maven.compile.source}</source>
                    <target>${maven.compile.target}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

4.2、创建.gitignore免提交git控制文件

建议用git做为版本控制工具,文件内容如下:

# Folder
/target/
*/target/*
*.jar
/logs
/out/
*.log
!.mvn/wrapper/maven-wrapper.jar

# Ide and OS
.idea
*.iws
*.iml
*.ipr
*.DS_Store

# Compiled class file
*.class

# Log file
*.log

# BlueJ files
*.ctxt

# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*


# sts
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

4.3、创建base-grpc-framework-application服务启动模块

这个模块主要集成了springboot用于启动应用,没有任何业务逻辑,依赖core模块。隔离出来的原因是为了在更改部署和启动方式时不需要更改业务代码,比如可以再创建一个tomcat模块,用于在tomcat环境下部署。工程结构如下:

4.3.1、pom.xml配置

springboot的版本有时很容易出现jar包冲突和不兼容的问题,尤其和其它框架集成时。在官网上给了一些基线配置,读者可自行查阅,笔者用的是2.2.2.RELEASE版本(在本专题中不建议读者升级,因为后续集成其它框架时可能会带来冲突)。

在引入spring-boot-starter包时,如果后续要使用更高版本的log4j做为日志框架时,需排队logging模块,否则会有包冲突问题,如下所示:

<?xml versinotallow="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">
    <parent>
        <artifactId>base-grpc-framework-parent</artifactId>
        <groupId>com.zd</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>base-grpc-framework-application</artifactId>
    <packaging>jar</packaging>

    <properties>
        <swagger.version>1.9.0.RELEASE</swagger.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

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

        <dependency>
            <groupId>com.zd</groupId>
            <artifactId>base-grpc-framework-core</artifactId>
            <version>${project.parent.version}</version>
        </dependency>

        <!--生产环境建议去掉或封掉swagger功能-->
        <dependency>
            <groupId>com.spring4all</groupId>
            <artifactId>swagger-spring-boot-starter</artifactId>
            <version>${swagger.version}</version>
        </dependency>

    </dependencies>
</project>

4.3.2、BaseFrameworkApplication启动类

注意@SpringBootApplication注解中的属性,笔者的类路径是是com.zd开头的。类路径:

/**
 * @Title: com.zd.baseframework.BaseFrameworkApplication
 * @Description 启动类,此类注解的值内容可以从外部的配置系统中配置
 * @author liudong
 * @date 2022/6/13 10:41 PM
 */
@SpringBootApplication(scanBasePackages = {"com.zd.baseframework", "cn.hutool.extra.spring"})
@MapperScan({"com.zd.baseframework"})
@EnableSwagger2
@EnableConfigurationProperties
public class BaseFrameworkApplication {
    public static void main(String []args){
        SpringApplication.run(BaseFrameworkApplication.class, args);
    }
}

4.3.3、SwawggerConfig框架

笔者为了偷懒一下,集成swawagger了框架只是为了测试Restful接口用,建议在线上环境中不要集成这个框架。开发测试时可以使用postman软件或是idea插件,源码如下,注意下.apis(basePackage("com.zd"))中的配置,笔者的类路径是是com.zd开头的:

/**
 * @Title: com.zd.baseframework.config.SwaggerConfig
 * @Description 用于swagger测试:访问地址:http://localhost:8080/swagger-ui.html
 * @author liudong
 * @date 2022/6/15 6:07 PM
 */
@Configuration
public class SwaggerConfig {
    @Bean
    public Docket createRestApi() {
        // 添加head参数start
        ParameterBuilder tokenPar = new ParameterBuilder();
        List<Parameter> pars = new ArrayList<>();
        tokenPar.name("Authorization").description("令牌").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
        pars.add(tokenPar.build());

        // 配置swagger
        Docket result = new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(basePackage("com.zd.baseframework.core.controller.core"))
                .paths(PathSelectors.any())
                .build()
                .globalOperationParameters(pars);
        result.enable(true);

        return result;
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Swagger-api文档")
                .description("用于开发测试,线上环境需要删除掉")
                .termsOfServiceUrl("http://localhost:15103")
                .version("1.0")
                .build();
    }

    public static Predicate<RequestHandler> basePackage(final String basePackage) {
        return input -> declaringClass(input).transform(handlerPackage(basePackage)).or(true);
    }

    private static Function<Class<?>, Boolean> handlerPackage(final String basePackage) {
        return input -> {
            // 循环判断匹配
            for (String strPackage : basePackage.split(";")) {
                boolean isMatch = input.getPackage().getName().startsWith(strPackage);
                if (isMatch) {
                    return true;
                }
            }
            return false;
        };
    }

    private static Optional<? extends Class<?>> declaringClass(RequestHandler input) {
        return Optional.fromNullable(input.declaringClass());
    }
}

4.3.4、application.yml应用配置文件

springboot启动时默认读取名为application.yml文件。一般开发时都会有多个环境,自然也就存在了多个配置文件,笔者在这里只配置了开发和发布两个配置文件,内容暂时保持一致。

文件目录:src/main/resources/application-dep.yml和application-dev.yml

# http配置
server:
  compression:
    enabled: true
    mime-types: application/json,application/octet-stream

# spring配置
spring:
  application:
    name: GrpcFramework-Server-APP

4.3.5、启动测试

配置启动类为dev,如下图所示:如果没有环境变量(E)街面,可先点选【修改选项】勾上环境变量一项:

运行BaseFrameworkApplication.java类,不出意外的话可以在控制台看到如下输出。

打开浏览器,测试swawgger是否可正常访问,如下图所示:


此至本章主要内容就完成了,后面几个小节是为了后面内容做准备,建议大家先把工程创建了。

4.4、创建base-grpc-framework-api接口定义模块

在本专题中用proto来进行接口定义,优点是可以跨语言。其原理也比较简单,就是在编码期间通过插件编译成所需要的语言,proto是本系列一个非常重要的知识点后面会详细说明,本章只创建一个模块目录即可:

pom.xml配置如下:

<?xml versinotallow="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">
    <parent>
        <artifactId>base-grpc-framework-parent</artifactId>
        <groupId>com.zd</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>base-grpc-framework-api</artifactId>
    <packaging>jar</packaging>
 <project>

4.5、创建base-grpc-framework-core模块

本章只创建一个模块目录即可,如下图所示:

pom.xml配置如下:

<?xml versinotallow="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">
    <parent>
        <artifactId>base-grpc-framework-parent</artifactId>
        <groupId>com.zd</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>base-grpc-framework-core</artifactId>
    <packaging>jar</packaging>
 <project>

4.6、创建base-grpc-framework-dao模块

数据库实现,暂时只按如下方式创建即可。

pom.xml配置如下:

<?xml versinotallow="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">
    <parent>
        <artifactId>base-grpc-framework-parent</artifactId>
        <groupId>com.zd</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>base-grpc-framework-dao</artifactId>
    <packaging>jar</packaging>
 <project>

4.7、创建base-grpc-framework-common模块

只按如下方式创建即可。后面再填加内容:

pom.xml配置如下:

<?xml versinotallow="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">
    <parent>
        <artifactId>base-grpc-framework-parent</artifactId>
        <groupId>com.zd</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>base-grpc-framework-common</artifactId>
    <packaging>jar</packaging>
 <project>

五、GPRC的测试方法

5.1、grpcurl命令行测试

brew install grpcurl
//查看GRPC服务所有的服务列表
grpcurl --plaintext 127.0.0.1:9898 list
输出如下:
/*grpc.health.v1.Health
grpc.reflection.v1alpha.ServerReflection
net.devh.boot.grpc.example.MyService
*/
  
//查看某一个接口提供的服务接口
grpcurl --plaintext 127.0.0.1:9898 list net.devh.boot.grpc.example.MyService
输出如下:
/*net.devh.boot.grpc.example.MyService.SayHello*/
 
//模拟访问
grpcurl --plaintext -d '{"name": "test"}' 127.0.0.1:9898 net.devh.boot.grpc.example.MyService/sayHello

5.2、grpcui图形化测试(推荐)

brew install grpcui  #安装
grpcui -plaintext 127.0.0.1:9898  #运行

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

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

相关文章

Docker安装ElasticSearch/ES 7.4.0

目录 前言安装ElasticSearch/ES安装步骤1&#xff1a;准备1. 安装docker2. 搜索可以使用的镜像。3. 也可从docker hub上搜索镜像。4. 选择合适的redis镜像。 安装步骤2&#xff1a;拉取ElasticSearch镜像1 拉取镜像2 查看已拉取的镜像 安装步骤3&#xff1a;创建容器创建容器方…

ESP8266(RTOS SDK)内嵌网页以实现WEB配网以及数据交互

【本文发布于https://blog.csdn.net/Stack_/article/details/131997098&#xff0c;未经允许不得转载&#xff0c;转载须注明出处】 1、执行make menuconfig&#xff0c;将http头由512改为更大的值&#xff0c;否则用电脑浏览器访问正常&#xff0c;但用手机浏览器访问会因为ht…

idea双击启动无效,idea卡顿问题

idea双击启动无效&#xff1a;大概率是关机时没有正确关闭idea&#xff0c;再次开机导致无法正常启动idea 1.通过任务管理器杀死idea进程后重启idea 2.需要修改配置 打开 &#xff08;以各自电脑实际为准&#xff09;C:\Program Files\JetBrains\IntelliJ IDEA 2020.3.1\bin&am…

ECS服务器安装docker

​ 为了安装并配置 Docker &#xff0c;你的系统必须满足下列最低要求&#xff1a; 64 位 Linux 或 Windows 系统 如果使用 Linux &#xff0c;内核版本必须不低于 3.10 能够使用 sudo 权限的用户 在你系统 BIOS 上启用了 VT&#xff08;虚拟化技术&#xff09;支持 on your s…

StarRocks企业级数据库

第1章 StarRocks简介 1.1 StarRocks介绍 StarRocks是新一代极速全场景MPP数据库 StraRocks充分吸收关系型OLAP数据库和分布式存储系统在大数据时代的优秀研究成果&#xff0c;在业界实践的基础上&#xff0c;进一步改进优化、升级架构&#xff0c;并增添了众多全新功能&…

进程间通信(IPC)的几种方式

进程间通信&#xff08;IPC&#xff09; 1.常见的通信方式2.低级IPC方法文件 3.常用于本机的IPC机制3.1无名管道pipe3.2命名管道FIFO3.3消息队列MessageQueue3.4共享内存SharedMemory3.5信号量Semaphore3.6信号Signal3.7unix域套接字 4.不同计算机上的IPC机制5.IPC机制的数据拷…

用友-NC-Cloud远程代码执行漏洞[2023-HW]

用友-NC-Cloud远程代码执行漏洞[2023-HW] 一、漏洞介绍二、资产搜索三、漏洞复现PoC小龙POC检测脚本: 四、修复建议 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#…

网络防御之SSL VPN

1. SSL工作过程是什么&#xff1f; 第一阶段&#xff1a; 客户端发送client hello消息到服务端&#xff0c;服务端收到client hello消息后&#xff0c;再发送server hello消息到客户端。 第二阶段&#xff1a; 服务器的证书&#xff0c;用于客户端给客户端发送信息时加密 serv…

最新智能AI系统+ChatGPT源码搭建部署详细教程+知识库+附程序源码

近期有网友问宝塔如何搭建部署AI创作ChatGPT&#xff0c;小编这里写一个详细图文教程吧。 使用Nestjs和Vue3框架技术&#xff0c;持续集成AI能力到AIGC系统&#xff01; 增加手机端签到功能、优化后台总计绘画数量逻辑&#xff01;新增 MJ 官方图片重新生成指令功能同步官方 …

Apollo让自动驾驶如此简单

前言&#xff1a; 最近被新能源的电价闹的不行&#xff0c;买了电车的直呼上当了、不香了。但电车吸引人不只是公里油耗低&#xff0c;还有良好的驾车使用感。比如辅助驾驶、甚至是自动驾驶。今天来介绍一个头部自动驾驶平台Apollo&#xff0c;Apollo是一个开源的、自动驾驶的软…

mac安装vscode 配置git

1、安装vscode 官网地址 下载mac稳定版安装很慢的解决办法 (转自) mac电脑如何解决下载vscode慢的问题 选择谷歌浏览器右上角的3个点&#xff0c;选择下载内容&#xff0c;右键选择复制链接地址&#xff0c;在新窗口粘贴地址&#xff0c; 把地址中的一段替换成下面的vscode.cd…

06_Hudi案例实战

本文来自"黑马程序员"hudi课程 6.第六章 Hudi案例实战 6.1 案例架构 6.2 业务数据 6.2.1 消息数据格式 6.2.2 数据生成 6.3 七陌数据采集 6.3.1 Apache Flume 是什么 6.3.2 Apache Flume 运行机制 6.3.3 Apache Flume 安装部署 6.3.4 Apache Flume 入门程序 6.3.5 七…

Linux 终端命令之文件浏览(3) less

Linux 文件浏览命令 cat, more, less, head, tail&#xff0c;此五个文件浏览类的命令皆为外部命令。 hannHannYang:~$ which cat /usr/bin/cat hannHannYang:~$ which more /usr/bin/more hannHannYang:~$ which less /usr/bin/less hannHannYang:~$ which head /usr/bin/he…

linux I/O性能优化

Linux 文件系统 磁盘和文件系统的关系&#xff1a; 磁盘为系统提供了最基本的持久化存储。 文件系统则在磁盘的基础上&#xff0c;提供了一个用来管理文件的树状结构。 文件系统工作原理 索引节点和目录项 文件系统&#xff0c;本身是对存储设备上的文件&#xff0c;进行组织…

cesium学习记录07-实体(Entity)

在学习记录05中&#xff0c;我们将了如何在 Cesium 中加载各种数据&#xff0c;包括矢量数据、影像图层、地形和 3D 模型。这些数据为我们构建了一个基础的场景和背景。特别是在加载 3D 模型时&#xff0c;我们采用了 viewer.scene.primitives.add 方法将模型作为一个原始对象添…

chatGPT小白快速入门-002:一文看懂什么是chatGPT

一、前言 本文是《chatGPT小白快速入门培训课程》的第002篇文章&#xff1a;一文看懂什么是chatGPT&#xff0c;全部内容采用chatGPT和chatGPT开源平替软件生成。完整内容大纲详见&#xff1a;《chatGPT小白快速入门课程大纲》。 本系列文章&#xff0c;参与&#xff1a; AIGC…

【STM32】FreeRTOS消息队列和信号量学习

一、消息队列&#xff08;queue&#xff09; 队列是一种用于实现任务与任务之间&#xff0c;任务与中断之间消息交流的机制。 注意&#xff1a;1.数据的操作是FIFO模式。 2.队列需要明确数据的大小和队列的长度。 3.写和读都会出现堵塞。 实验&#xff1a;创建一个消息队列…

阿里云弹性裸金属服务器详细介绍(原神龙)

阿里云弹性裸金属服务器&#xff08;ECS Bare Metal Server&#xff09;是一种可弹性伸缩的高性能计算服务&#xff0c;原神龙服务器&#xff0c;计算性能与传统物理机无差别&#xff0c;具有安全物理隔离的特点&#xff0c;裸金属服务器分钟级的交付周期。阿里云服务器网分享阿…

python——案例18:判断该元素是否在列表中

案例18&#xff1a;判断该元素是否在列表中test_list[10,-8,25.6,88,0,4]print("查看88是否在列表里面&#xff1a;")for i in test_list:if(i88):print("存在") print("查看88是否在列表中&#xff1a;") if(88 in test_list):print("存在…

微服务服务拆分和远程调用

一、服务架构比较 单体架构&#xff1a;简单方便&#xff0c;高度耦合&#xff0c;扩展性差&#xff0c;适合小型项目。例如&#xff1a;学生管理系统 分布式架构&#xff1a;松耦合&#xff0c;扩展性好&#xff0c;但架构复杂&#xff0c;难度大。适合大型互联网项目&#x…