SpringBoot应用开发指南(01)

目录

  • 引言
  • 1. SpringBoot简介
    • 1.1 什么是SpringBoot
      • 1.1.1 背景
      • 1.1.2 优势
      • 1.1.3 核心概念
    • 1.1.3 特点
  • 2. SpringBoot入门
  • 2. SpringBoot集成MyBatis
  • 3. SpringBoot集成PageHelper
    • 3.1 什么是PageHelper
  • 通过切面实现分页
  • 4. SpringBoot集成Druid
  • 总结

在这里插入图片描述

引言

在当今软件开发领域,SpringBoot作为一个高效的Java开发框架,以其简洁、快速的特性受到了广泛关注。本文将深入探讨SpringBoot的一些高级特性,包括与持久层框架MyBatis、分页工具PageHelper以及数据库连接池Druid的集成。通过深入的学习和实践,你将更好地理解如何在实际项目中应用这些技术,提高开发效率和代码质量。

1. SpringBoot简介

众所周知 Spring 应用需要进行大量的配置,各种 XML 配置和注解配置让人眼花缭乱,且极容易出错,因此 Spring 一度被称为“配置地狱”。为了简化 Spring 应用的搭建和开发过程,Pivotal 团队在 Spring 基础上提供了一套全新的开源的框架,它就是Spring Boot。

只是为了提升Spring开发者的工具,特点:敏捷式、快速开发。

1.1 什么是SpringBoot

Spring Boot 是由 Pivotal 团队提供的全新框架,2014 年 4 月发布 Spring Boot 1.0 2018 年 3 月 Spring Boot 2.0发布。它是对spring的进一步封装,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程。怎么简化的呢?就是通过封装、抽象、提供默认配置等方式让我们更容易使用。

SpringBoot 基于 Spring 开发。SpringBoot 本身并不提供 Spring 框架的核心特性以及扩展功能,也就是说,它并不是用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具

关于 SpringBoot 有一句很出名的话就是约定大于配置。采用 Spring Boot 可以大大的简化开发模式,它集成了大量常用的第三方库配置,所有你想集成的常用框架,它都有对应的组件支持,例如 Redis、MongoDB、Jpa、kafka,Hakira 等等。SpringBoot 应用中这些第三方库几乎可以零配置开箱即用,大部分的 SpringBoot 应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑。

1.1.1 背景

SpringBoot的出现是为了简化Spring应用的搭建过程,通过默认配置和约定俗成的方式,减少开发人员在配置文件上的投入,从而提高开发效率。

1.1.2 优势

简化配置:通过约定大于配置的原则,SpringBoot极大地简化了应用的配置过程。
内嵌服务器:SpringBoot支持多种内嵌服务器,如Tomcat、Jetty等,使得应用可以独立运行,无需外部Web服务器。
自动化:通过自动配置和自动装配,SpringBoot可以根据项目的依赖自动配置很多功能。

1.1.3 核心概念

起步依赖:通过Maven或Gradle引入特定功能的依赖,简化了项目的依赖管理。
自动配置:SpringBoot根据项目的依赖自动配置应用上下文,简化了配置文件。
注解驱动:采用注解驱动的方式进行开发,减少了样板代码的编写。

1.1.3 特点

  • 独立运行的 Spring 项目

Spring Boot 可以以 jar 包的形式独立运行,Spring Boot 项目只需通过命令“ java–jar xx.jar” 即可运行。

  • 内嵌 Servlet 容器

Spring Boot 使用嵌入式的 Servlet 容器(例如 Tomcat、Jetty 或者 Undertow 等),应用无需打成 WAR 包 。

  • 提供 starter 简化 Maven 配置

Spring Boot 提供了一系列的“starter”项目对象模型(POMS)来简化 Maven 配置。

  • 提供了大量的自动配置

Spring Boot 提供了大量的默认自动配置,来简化项目的开发,开发人员也通过配置文件修改默认配置。

  • 自带应用监控

Spring Boot 可以对正在运行的项目提供监控。

  • 无代码生成和 xml 配置

Spring Boot 不需要任何 xml 配置即可实现 Spring 的所有配置。

2. SpringBoot入门

点击创建文件

在这里插入图片描述

在这里插入图片描述

版本2.7.6,jdk1.8,图片选不到我的解决方法是在生成好之后更改pom文件
在这里插入图片描述

然后把application.properties改为application.yml,先下载插件
在这里插入图片描述
右击绿色的,然后左击第二个箭头,就会更改为yml
在这里插入图片描述
pom.xml
暂时先把MyBatis和MySQL注释掉,因为yml还没配置

<?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.zking</groupId>
    <artifactId>boot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>boot</name>
    <description>boot</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.7.6</spring-boot.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-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>mysql</groupId>-->
<!--            <artifactId>mysql-connector-java</artifactId>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>org.mybatis.spring.boot</groupId>-->
<!--            <artifactId>mybatis-spring-boot-starter</artifactId>-->
<!--            <version>2.3.0</version>-->
<!--        </dependency>-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.4.6</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.6</version>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.zking.core.BootApplication</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

然后运行启动项目就好了

2. SpringBoot集成MyBatis

配置映射


 #  服务运行的端口
 server:
     port: 8080
spring:
  #数据源配置
    datasource:
        url: jdbc:mysql://localhost:3306/bookshop
        username: root
        password: 123456
        driver-class-name: com.mysql.cj.jdbc.Driver
 #mybatis配置

mybatis:
    #mapper.xml所在的位置
    mapper-locations: classpath*:mapper/*xml

然后添加数据库
在这里插入图片描述

  • 输入完成,进行测试的时候出现时差问题,下面的网址可以解决
    在这里插入图片描述

  • 解决方法网址:
    https://blog.csdn.net/liuqiker/article/details/102455077?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-5-102455077-blog-106429131.235%5Ev39%5Epc_relevant_anti_t3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-5-102455077-blog-106429131.235%5Ev39%5Epc_relevant_anti_t3&utm_relevant_index=6

  • 然后对表进行代码生成
    在这里插入图片描述

在这里插入图片描述
然后Finish完成
此时代码就生成完成了

mapper所在的包必须在启动类中开启扫描
在这里插入图片描述
这时候运行项目就可以运行成功了
在这里插入图片描述

3. SpringBoot集成PageHelper

3.1 什么是PageHelper

PageHelper是一个用于MyBatis的分页插件,可以帮助我们方便地进行分页查询。在这一小节中,我们将深入了解PageHelper的基本用法和高级特性。

集成:
pom文件配置

<dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.4.6</version>
        </dependency>

配置yml

pagehelper:
    #使用的方言
    helperDialect: mysql
    #开启分页合理化
    reasonable: true
    #mapper方法上的分页参数
    supportMethodsArguments: true
    #查询数量
    params: count=countSql

再创建好pageben

package page;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class PageBean {

    private Integer page = 1;
    private Integer rows = 5;
    private Long total = 0L;
    private boolean open = true;

    public int start() {
        return (page - 1) * rows;
    }

    public int previous() {
        return Math.max(this.page - 1, 1);
    }

    public int next() {
        return Math.min(this.page + 1, maxPage());
    }

    public int maxPage() {
        return (int) Math.ceil(this.total.intValue() / (this.rows * 1.0));
    }

}

BootController

package com.yuan.springbook20231212.controller;

import com.github.pagehelper.PageHelper;
import com.yuan.springbook20231212.mapper.TBookMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import page.PageBean;

/**
 * @author 叶秋
 * @site
 * @company 卓京公司
 * @create 2023-12-12 17:09
 */
@RestController
@RequestMapping("/book")
public class BookController {
    @Autowired
    private TBookMapper tBookMapper;

    @RequestMapping("/list")
    public Object list(PageBean pageBean){
        PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
        return tBookMapper.selectlist();
    }

}

分页成功
在这里插入图片描述

通过切面实现分页

需要用到两个类PageAspect,PageAnnotation

package page;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PageAnnotation {
}

package page;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class PageAspect {

    @Pointcut("@annotation(PageAnnotation)")
    public void cut() {
    }

    @Around("cut()")
    public Object aroundHandler(ProceedingJoinPoint point) throws Throwable {
        Object[] args = point.getArgs();
        PageBean pageBean = new PageBean().setOpen(false);
        for (Object arg : args) {
            if (arg instanceof PageBean) pageBean = (PageBean) arg;
        }
        PageHelper.startPage(pageBean.getPage(), pageBean.getRows(), pageBean.isOpen());
        Object val = point.proceed();
        if (pageBean.isOpen()) {
            Page<?> page = (Page<?>) val;
            pageBean.setTotal(page.getTotal());
        }
        return val;
    }

}

Service层通过@PageAnnotation切入方法

package com.yuan.springbook20231212.Service.impl;

import com.yuan.springbook20231212.Service.BookService;
import com.yuan.springbook20231212.mapper.TBookMapper;
import com.yuan.springbook20231212.pojo.TBook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import page.PageAnnotation;
import page.PageBean;

import java.util.List;

/**
 * @author 叶秋
 * @site
 * @company 卓京公司
 * @create 2023-12-12 20:51
 */
@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private TBookMapper tBookMapper;
    @Override
    @PageAnnotation
    public List<TBook> selectlist(PageBean pageBean) {
        return tBookMapper.selectlist();
    }
}

Controller层

@RequestMapping("/list")
    public Object list(PageBean pageBean){
        PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
        return bookService.selectlist(pageBean);
    }

这样就可以进行一个切面分页了

4. SpringBoot集成Druid

4.1 什么是Druid
Druid是一个高性能的数据库连接池,支持监控和扩展
pom配置

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.16</version>
        </dependency>

yml配置

druid:
      # 初始化时建立物理连接的个数
      initial-size: 5
      # 最小连接池数量
      min-idle: 5
      # 最大连接池数量
      max-active: 20
      #配置获取连接等待超时的时间
      max-wait: 60000
      #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      time-between-eviction-runs-millis: 60000
      # 一个连接在池中最小生存的时间,单位是毫秒
      min-evictable-idle-time-millis: 30000
      # 用来检测连接是否有效的 sql,要求是一个查询语句
      validation-query: SELECT 1 FROM DUAL
      # 建议配置为 true,不影响性能,并且保证安全性
      test-while-idle: true
      # 申请连接时执行 validationQuery 检测连接是否有效
      test-on-borrow: true
      # 归还连接时执行 validationQuery 检测连接是否有效
      test-on-return: false
      # 是否缓存 preparedStatement,PsCache
      # PSCache 对支持游标的数据库性能提升巨大,比如说 oracle,而 mysql 则建议关闭
      pool-prepared-statements: true
      # 要启用 PSCache,必须配置大于0
      max-pool-prepared-statement-per-connection-size: 20
      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计
      filter:
        stat:
          merge-sql: true
          slow-sql-millis: 5000
      # 基础监控配置
      web-stat-filter:
        enabled: true
        url-pattern: /*
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
        session-stat-enable: true
        session-stat-max-count: 100
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
        reset-enable: true
        login-username: admin #设置监控页面的登录名和密码
        login-password: admin
        allow: 127.0.0.1 #deny: 192.168.1.100

数据库配置那里再加一个
type: com.alibaba.druid.pool.DruidDataSource
在这里插入图片描述
然后启动项目,输入下面网址
http://127.0.0.1:8080/druid/login.html,admin-admin
在这里插入图片描述

集成日志
yml

logging:
    level:
      com.yuan.springbook20231212.mapper: dubug

总结

通过本文的深入学习,无论是简化配置的SpringBoot,还是强大的MyBatis、PageHelper和Druid,它们的集成和使用都是提高开发效率、优化数据库操作和保障系统稳定性的关键。

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

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

相关文章

外汇天眼:心理素质决定交易成败!

在交易市场中&#xff0c;参与者非常多&#xff0c;成功的却极少。 成功的交易者几乎完全凭借个人的聪明才智&#xff0c;迎难而上&#xff0c;依靠顽强的毅力、坚韧不拔的性格以及冒险精神&#xff0c;战胜自己交易路上的一切挫折。 而这其中交易者的心理素质与其盈亏紧密相关…

el-tree-select 如何使用不规则的数据作为数据来源

el-tree-select 如何使用不规则的数据作为数据来源 在项目中可能使用的 tree 数据并不是那么标准&#xff0c;这样不要紧&#xff0c;只要我们通过 props 指定一下数据结构即可。 比如&#xff0c;项目中的数据结构是这样的&#xff1a; 我们只需要使用 pros 字段指定 tree …

python利用requests库进行接口测试的方法详解

前言 之前介绍了接口测试中需要关注得测试点&#xff0c;现在我们来看看如何进行接口测试&#xff0c;现在接口测试工具有很多种&#xff0c;例如&#xff1a;postman,soapui,jemter等等&#xff0c;对于简单接口而言&#xff0c;或者我们只想调试一下&#xff0c;使用工具是非…

做数据分析为何要学统计学(7)——什么问题适合使用方差分析?

方差分析&#xff08;ANOVA&#xff0c;也称变异数分析&#xff09;是英国统计学家Fisher&#xff08;1890.2.17&#xff0d;1962.7.29&#xff09;提出的对两个或以上样本总体均值进行差异显著性检验的方法。 它的基本思想是将测量数据的总变异&#xff08;即总方差&#xff…

鱼fish数据集VOC+yolo-1400张(labelImg标注)

鱼类&#xff0c;是最古老的脊椎动物。易蓄积重金属。 部分不同染色体数目的杂交的后代依然有生育能力。它们几乎栖居于地球上所有的水生环境&#xff0c;从淡水的湖泊、河流到咸水的大海和大洋。 今天要介绍鱼的数据集。 数据集名称&#xff1a;鱼 fish 数据集格式&#xf…

Python 自动化之修理PDF文件(二)

PDF文件_合并与拆分PDF文档Pro版本 文章目录 PDF文件_合并与拆分PDF文档Pro版本前言一、要做成什么样子二、主要用到的函数三、基本思路1.引入库2.创建用户输入模块3.确定主框架 四、文档合并代码模块1.用户输入和函数调用2.引导用户输入文档信息3.合并文档内容4.命名新文档生成…

python+requests+unittest API接口测试实例(详解)

我在网上查找了下接口测试相关的资料&#xff0c;大都重点是以数据驱动的形式&#xff0c;将用例维护在文本或表格中&#xff0c;而没有说明怎么样去生成想要的用例&#xff0c; 问题&#xff1a; 测试接口时&#xff0c;比如参数a&#xff0c;b&#xff0c;c&#xff0c;我要…

rk3568 RGMII KSZ8795 MAC TO MAC

RK3568与KSZ8795交换机芯片连接&#xff0c;直接MAC TO MAC方式&#xff0c;这样一下就扩展会4路网口&#xff0c;应该场合比较多&#xff0c;移植过程如下&#xff1a; 参考《Rockchip_Developer_Guide_Linux_MAC_TO_MAC_CN.pdf》 《rockchip RGMIImv88e6390 管理型交换机功…

【设计模式--行为型--命令模式】

设计模式--行为型--命令模式 命令模式定义结构案例优缺点使用场景 命令模式 定义 将一个请求封装为一个对象&#xff0c;使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通&#xff0c;这样方便将命令对象进行存储&#xff0c;传递&#xff0c;调用…

基于ssm的前后端分离鲜花销售系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本鲜花销售系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…

几本学习中整理和面试的PDF,以及精选面试资料

今天和大家分享我在学习过程中整理的笔记&#xff0c;以及我在准备面试中&#xff0c;阅读的PDF&#xff0c;包括Spring Cloud学习手册、Docker学习手册、RabbitMQ学习手册、Spring 6手册、Maven手册、22w字面试手册等等&#xff0c;包括了大部分后端技术以及大部分高频面试题&…

大数据湖体系规划与建设方案:PPT全文51页,附下载

关键词&#xff1a;大数据解决方案&#xff0c;数据湖解决方案&#xff0c;数据数仓建设方案&#xff0c;大数据湖建设规划&#xff0c;大数据湖发展趋势 一、大数据湖体系规划与建设背景 在传统的企业信息化建设中&#xff0c;各个业务系统通常是独立建设的&#xff0c;导致…

【数据结构—栈的实现(数组栈)】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、栈 1.1栈的概念及结构 二、栈的实现 2.1头文件的实现—Stack.h 2.2源文件的实现—Stack.c 2.3源文件的测试—test.c 三、栈的实际测试数据展示 3.1正常的出…

麦克风相关知识——图后续处理

这篇文章重点介绍几种实用的波束形成算法&#xff08;delaysum&#xff0c;delaysub&#xff0c;一阶差分自适应BF&#xff09;原理及实现效果&#xff0c;再简单介绍一些知名品牌助听器中的BF方案&#xff1b; 1.易实现的BF算法介绍 1.1 delaysum 延时相加和延时相减是最基…

边缘计算系统设计与实践:引领科技创新的新浪潮

文章目录 一、边缘计算的概念二、边缘计算的设计原则三、边缘计算的关键技术四、边缘计算的实践应用《边缘计算系统设计与实践》特色内容简介作者简介目录前言/序言本书读者对象获取方式 随着物联网、大数据和人工智能等技术的快速发展&#xff0c;传统的中心化计算模式已经无法…

MySQL命令行备份数据库的关键步骤

MySQL是一个广泛使用的开源关系数据库管理系统&#xff0c;它常用于各种规模的应用&#xff0c;从个人博客到大型企业级系统。在使用MySQL的过程中&#xff0c;数据备份是一项至关重要的任务&#xff0c;它能够确保在发生数据丢失或系统故障时&#xff0c;我们可以恢复和重新部…

JavaScript实现飘窗功能

实现飘窗功能很简单 html代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title…

基于yolov2深度学习网络的人员跌倒检测识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 YOLOv2深度学习网络 4.2 人员跌倒检测识别原理 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 clc; clear; close all; warning off; a…

2023最新软件测试面试题(带答案)

1. 请自我介绍一下(需简单清楚的表述自已的基本情况&#xff0c;在这过程中要展现出自信&#xff0c;对工作有激情&#xff0c;上进&#xff0c;好学) 面试官您好&#xff0c;我叫###&#xff0c;今年26岁&#xff0c;来自江西九江&#xff0c;就读专业是电子商务&#xff0c;毕…

【Zerotier】自建PLANET服务器内网地址连接

之前已经完成了【Zerotier】通过docker自建PLANET服务器&#xff0c;但是遇到一个问题&#xff0c;因为各种原因&#xff0c;内网里面的ZeroTier Client无法通过PLANET服务器的公网地址连接&#xff0c;愁怀了这下。在经过多方测试验证后&#xff0c;可以采取重新生成一个PLANE…