frp内网穿透工具
场景需求: xxl-job-admin在阿里云服务器 xxl-job-core执行器在本地运行的 本地又没有公网ip
frp下载地址
linux
- 下载frp 从官网下载解压一样
# 根据系统架构选择版本(x86_64选amd64,ARM选arm64)
wget https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_amd64.tar.gz
tar -zxvf frp_0.52.3_linux_amd64.tar.gz
cd frp_0.52.3_linux_amd64
- 编辑配置文件 frps.toml
[common]
bind_port = 7000 # 客户端与服务端通信的端口
# 下面的不配置也行
token = your_secure_token # 认证令牌(需与客户端一致)
dashboard_port = 7500 # 监控面板端口
dashboard_user = admin
dashboard_pwd = 123456
- 启动服务端
./frps -c frps.toml
- 开放阿里云安全组端口 7000(frp通信端口)和 7500(监控面板端口)
- 结束任务
命令行 ctrl + c
windows
- 从官网下载解压 frp_0.52.3_windows_amd64.zip
注意和服务器端版本一致0.52.3
- 编辑配置文件 frpc.toml
[common]
server_addr = 阿里云公网IP
server_port = 7000
# 服务端没配置则不用配置
token = your_secure_token # 与服务端一致
[[proxies]]
name = "xxl-job" # 自定义名称
type = "tcp" # 映射TCP协议
localIP = "127.0.0.1"
localPort = 6666 # 本地执行器端口
remotePort = 6666 # 公网映射端口
注意公网映射端口需要 开放阿里云安全组端口
- 启动客户端
frpc.exe -c frpc.toml
- 验证穿透
访问 http://阿里云公网IP:7500,输入账号密码(admin/123456),查看客户端和端口状态。
- 结束任务
命令行 ctrl + c
XXL-JOB(Docker实现)
XXL-JOB 官方地址:http://www.xuxueli.com/xxl-job
1. 启动mysql服务 创建数据库
如果表xxl_job_registry导入过程报Specified key was too long; max key length is 767 bytes错误,则将i_g_k_v联合索引相关字段的varchar改小一些即可;
2. 服务器拉取并运行xxl-job-admin镜像
docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://阿里云公网ip:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=UTC --spring.datasource.username=root --spring.datasource.password=123456" -p 8093:8080 -v $PWD/xxldata:/data/applogs --name=xxl-job-admin -d xuxueli/xxl-job-admin:2.3.0
访问容器服务 http://阿里云公网ip:8093/xxl-job-admin
3. 本地项目引入xxl-job核心依赖
<!-- xxl-job-core -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>${project.parent.version}</version>
</dependency>
4. 配置xxl-job信息
# XXJOB参数配置
xxl:
job:
accessToken:
admin:
addresses: http://阿里云公网ip:8093/xxl-job-admin
executor:
app-name: hebut-stock-job-executor
address:
ip:
# 心跳端口
port: 6666
log-path: .\logs
log-retentiondays: 30
logging:
config: classpath:logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="1 seconds">
<contextName>logback</contextName>
<property name="log.path" value="/data/applogs/xxl-job/xxl-job-executor-sample-springboot.log"/>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="console"/>
<appender-ref ref="file"/>
</root>
</configuration>
package com.hebut.config;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* xxl-job config
*/
@Configuration
public class XxlJobConfig {
private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${xxl.job.executor.appname}")
private String appname;
@Value("${xxl.job.executor.address}")
private String address;
@Value("${xxl.job.executor.ip}")
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
@Value("${xxl.job.executor.logpath}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
logger.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setAddress(address);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
/**
* 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;
*
* 1、引入依赖:
* <dependency>
* <groupId>org.springframework.cloud</groupId>
* <artifactId>spring-cloud-commons</artifactId>
* <version>${version}</version>
* </dependency>
*
* 2、配置文件,或者容器启动变量
* spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
*
* 3、获取IP
* String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
*/
}
5. 在任务调度中心添加执行器管理
6. 编写和测试内网穿透是否成功(定时任务)
@Component
public class StockJob {
@XxlJob("hebut_job_test")
public void jobTest(){
System.out.println("jobTest run.....");
}
}