通过内网穿透、域名解析实现本地服务部署到公网的架构设计方案
本文主要是总结这些年自己在家玩互联网服务的心得收获, 同时随着年龄增大, 发现脑子确实越来越不好用, 只有记录到笔记中才是真正有意义的。
学生时期做了一些实验, 比如给实验室做日报系统、管理10多台服务器,当时学习了很多架构设计的知识,比如集群化部署服务,如何增加存储速度,如何容灾部署,如何主备切换,后来也如愿以偿的进入到了云计算大厂,且有幸参与了云计算大厂的集群化基础设施服务,主要是对象存储方面的开发、运维设计等工作,成功将以前所学融汇贯通,如信息采集、告警监控Alarm(拨测、指标、日志)、变更审计、硬件维护、问题管理、知识库、安全登录;集群化部署自然有其好处,但是从运维、变更等角度讲复杂性显著提高。
作为工程师对于服务架构较为感兴趣, 同时也对实际应用感兴趣, 因此常常关注b站新服务, 而我本地在家也搭建了很多实用服务, 比如NAS影音系统jellyfin、喜欢玩智能家居的人不可能不知道mqtt服务和Homeassistant服务、喜欢炼丹的人不能不知道jupyter、做定时任务撸羊毛的青龙、系统监控的宝塔、docker后台portaine、博客halo;显然上面的所有服务都是通过docker一键完成安装,并且都是单体应用,不涉及容灾也不涉及备份,因为挂了就挂了反正数据在硬盘了,如果硬盘也坏了,数据也不重要。。。。那么当一个人在本地部署了这么多服务,出门在外的自己还能访问家里的资源将变得尤为重要;
恰好之前活动,120买了三年的云服务器,还带公网IP,于是果断选择了Frp 作为内网穿透的工具,frp可以将内网的端口映射到server的端口,比如本地服务端口8080,设置frp映射到996,那么通过官网IP:996进行访问,实际访问的便是本地IP:8080
后来又购买了域名,其实对域名解析不太了解,只知道购买域名要映射到公网IP,也就是一个域名对应一个公网IP,当时的问题是一个域名只能对应一个服务,如何将很多服务都加上呢?最蠢的方案来了,通过域名加端口的方式,比如域名是zjq2048.cn,那么加上端口不就能对应上不同的服务了么,比如访问996端口,就zjq2048.cn:996,传说中的CNAME和TXT域名解析设置,还真的持续了一段时间,直到有一天又学到了nginx域名转发,才发现原来可以通过设置二级域名,直接用nginx来解析访问的二级域名,在根据二级域名来解析到对应的端口即可,于是乎就有了域名解析→nginx解析→内网穿透→本地各个服务的架构设计如下图所示
实际上互联网的业务逻辑其实跟下面很像,不过是将所有的服务拆分到不同的机器上(我这里就一个主机,all in one),每个机器(多个节点)对应一个服务,每个服务对应一个二级域名,在通过集群型nginx做LVS负载均衡,最终由redis这种分布式缓存做数据强一致性校验,再由数据库做主备和容灾切换和备份。
将下面一套流程玩转,至少互联网大部分知识点都涉及到了,剩下的细节知识需要靠日积月累也要靠问题解决堆出来,不过有了一个整体的架构设计方向,在处理问题、新业务架构设计都能有非常大的帮助。
1. 总设计架构
下面就是我的all in one 了
常用docker命令
# 更新容器more重启
docker update --restart=always 容器名称# 连接WiFi
nmcli device wifi connect 'Wifi007' password 'duzejiang555'
nmcli c down 'Wifi007' # 关闭WiFi后面跟这个, 加速下载
registry.cn-beijing.aliyuncs.com/dusays/wechatbot/wechatbot:latest
frp内网穿透
域名解析, 设置云服务器IP, 对应tools.zjq2048.cn
云服务器上面的Nginx转发, 云服务器的端口6667对应tools.zjq2048.cn
# 本地服务, 8082的端口, TCP映射到这个云服务器的6667端口
# 在通过Nginx将6667端口映射成tools.zjq2048.cn上
server {listen 80;server_name tools.zjq2048.cn;location / {proxy_pass http://127.0.0.1:6667/;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}
frpc配置
[ssh-n5105-ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6666# 这里本地的8082服务, 通过tcp转发给远程服务器6667
[ssh-n5105-tools]
type = tcp
local_ip = 127.0.0.1
local_port = 8082
#custom_domains = tools.zjq2048.cn
remote_port = 6667
默认开机自启动
sudo vim /lib/systemd/system/frpc.service
[Unit]
Description=fraps client service
After=network.target syslog.target
Wants=network.target[Service]
Type=simple
#启动服务的命令(此处写你的frps的实际安装目录)
ExecStart=/home/zjq/.frp/frpc -c /home/zjq/.frp/frpc.ini[Install]
WantedBy=multi-user.targetsudo systemctl enable frpc
sudo systemctl start frpc
sudo systemctl restart frpc
sudo systemctl stop frps # 停止服务
sudo systemctl status frps # 查看服务日志
开启热点
创建WiFi热点使用的GitHub上一个开源项目:
https://github.com/oblique/create_ap#将代码copy到本地,安装
sudo git clone https://github.com/oblique/create_ap
cd create_ap
sudo apt-get install util-linux procps hostapd iproute2 iw -y
ifconfig查询wlan口
sudo create_ap wlan0 eth0 账号 密码
sudo ./create_ap wlo2 wlo2 zjq 密码
配置服务自启动
sudo vim /lib/systemd/system/ap.service # frpc就是对应的systemctl服务# 写入下面内容---------------------------------------------------------------
[Unit]
Description=create ap
After=network.target syslog.target
Wants=network.target[Service]
Type=simple
#启动服务的命令(此处写你的frps的实际安装目录)
ExecStart=/share/software/create_ap wlo2 wlo2 账号 密码[Install]
WantedBy=multi-user.target
# --------------------------------------------------------------sudo systemctl start frpc # 然后就启动frpc
sudo systemctl enable frpc # 再打开开机自启动
sudo systemctl restart frpc # 重启服务
sudo systemctl stop frps # 停止服务
sudo systemctl status frps # 查看服务日志
docker管理
docker volume create portainer_data
docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce浏览器访问 :9000
安装青龙面板
https://zhuanlan.zhihu.com/p/596197020
docker run -dit -v $PWD/ql:/ql/data -p 5700:5700 --name ql --hostname ql --restart unless-stopped whyour/qinglong:latest
# 浏览器登录
192.168.3.12:5700
开始安装
通知设置选择跳过
设置账号密码
登录邮箱
zjq2048qq.com
kruntbgkqiaobjbh
上面是秘钥
增加js依赖
依赖管理
Nodejs新建依赖点击自动拆分
crypto-js
prettytable
dotenv
jsdom
date-fns
tough-cookie
tslib
ws@7.4.3
ts-md5
jsdom -g
jieba
fs
form-data
json5
global-agent
png-js
@types/node
require
typescript
js-base64
axios
moment
ds
增加python依赖
点击自动拆分
requests
canvas
ping3
jieba
aiohttp
ql repo https://js.dayplus.xyz/https://github.com/6dylan6/jdpro.git "jd_|jx_|jddj_" "backUp" "^jd[^_]|USER|JD|function|sendNotify"ql repo https://git.metauniverse-cn.com/https://github.com/shufflewzc/faker3.git "jd_|jx_|gua_|jddj_|jdCookie" "activity|backUp" "^jd[^_]|USER|function|utils|sendNotify|ZooFaker_Necklace.js|JDJRValidator_|sign_graphics_validate|ql|JDSignValidator|magic|depend|h5sts" "main"
安装宝塔面板
docker run -tid --name baota -p 8180:80 -p 8143:443 -p 3306:3306 -p 8148:8888 -p 8138:888 -p 8120:20 -p 8121:21 -p 8122:22 -p 6379:6379 -p 6001:6001 --privileged=true --restart always pch18/baotadocker exec -it baota bash #进入docker宝塔容器
rm -f /www/server/panel/data/admin_path.pl #关闭安全出口
bt default #重置宝塔面板的登陆账号及密码,后期进入面板后可手动修改
password密码错误的话就输入 bt 5http://192.168.3.12:8148/login 进行访问了,正常部署一点问题都没有。docker run -tid --name baota -p 8180:80
-p 8143:443 # 用于SSL访问
-p 3306:3306 # mysql数据库
-p 8148:8888 # 管理面端口
-p 8138:888 # 数据库服务器端phpmyadmin
-p 8120:20 # 将容器的20和21端口映射到主机的20和21端口,用于FTP访问
-p 8121:21 # 将容器的20和21端口映射到主机的20和21端口,用于FTP访问
-p 8122:22
-p 6379:6379 # redis数据库
-p 6001:6001
--privileged=true --restart always pch18/baota
安装卡夫卡
–restart=always
https://juejin.cn/post/6960820341631352868
#参数说明:
-e KAFKA_BROKER_ID=0 在kafka集群中,每个kafka都有一个BROKER_ID来区分自己
-e KAFKA_ZOOKEEPER_CONNECT=192.168.124.28:2181/kafka 配置zookeeper管理kafka的路径192.168.124.28:2181/kafka
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.124.28:9002 把kafka的地址端口注册给zookeeper,如果是远程访问要改成外网IP,类如Java程序访问出现无法连接。
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9002 配置kafka的监听端口-v /etc/localtime:/etc/localtime 容器时间同步虚拟机的时间# 1. 下载docker镜像
docker pull wurstmeister/zookeeper
docker pull wurstmeister/kafka# 2. 启动zookeeper (单机方式)
docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper# 3. 启动kafka (单机方式)
注:下面启动命令中的IP(192.168.213.213)需要更换为你的服务器/虚拟机的静态IP
docker run -d --name kafka \
-p 9092:9092 \
-e KAFKA_BROKER_ID=0 \
-e KAFKA_ZOOKEEPER_CONNECT=192.168.213.213:2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.213.213:9092 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka# 4. 测试搭建的kafka是否可以正常进行发布/消费消息
如果使用的是xshell麻烦开两个窗口,一个provider发布消息,一个consumer消费消息第一个窗口:
4.1. 查看当前正在运行的容器(zookeeper和kafka)
docker ps
4.2. 进入kafka容器
docker exec -it 容器id /bin/bash
4.3. 进入kafka脚本启动目录
cd /opt/kafka_2.13-2.8.1/bin
4.4. 启动发布消息脚本,并创建test的topic
./kafka-console-producer.sh --broker-list localhost:9092 --topic test
4.5. 上条命令执行后,现在你可以发送消息了,等一会consumer脚本启动后就可以看到消费到的消息了第二个窗口:
4.1. 查看当前正在运行的容器(zookeeper和kafka)
docker ps
4.2. 进入kafka容器
docker exec -it 容器id /bin/bash
4.3. 进入kafka脚本启动目录
cd /opt/kafka_2.13-2.8.1/bin
4.4. 启动发布消息脚本,并创建test的topic
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
4.5. 上条命令执行后,现在你可以看到刚才发送的消息了
mqtt
# http://t.csdn.cn/PqPEo
docker run -dit --name emqx -p 18083:18083 -p 1883:1883 -p 8083:8083 -p 8084:8084 emqx/emqx:latest
浏览器登录: http://192.168.3.12:18083/#/dashboard/overview
admin 密码是public18083 管理控制端口
1883 mqtt协议端口
8083 MQTTwebSocket端口# 认证方式
https://blog.csdn.net/weixin_43869518/article/details/127558282
mqtt客户端校验
# 注意: 明文把加盐改成disableCREATE TABLE IF NOT EXISTS `mqtt_user` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`username` varchar(100) DEFAULT NULL,`password` varchar(100) DEFAULT NULL,`salt` varchar(35) DEFAULT NULL,`is_superuser` tinyint(1) DEFAULT 0,`created` datetime DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `mqtt_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;然后在创建两条
客户端授权
CREATE TABLE IF NOT EXISTS `mqtt_user` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`username` varchar(100) DEFAULT NULL,`password_hash` varchar(100) DEFAULT NULL,`salt` varchar(35) DEFAULT NULL,`is_superuser` tinyint(1) DEFAULT 0,`created` datetime DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `mqtt_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
web的客户端发送主题消息, 单片机接收信息
游戏
docker pull oldiy/dosgame-web-docker:latestdocker run -dit --name d -p 262:262 oldiy/dosgame-web-docker:latest
深度学习环境
docker run -it -p 8888:8888 --name jupyter --ipc=host ufoym/deepo:all-jupyter jupyter notebook --no-browser --ip=0.0.0.0 --allow-root --NotebookApp.token= --notebook-dir='/root'docker run -it -p 8888:8888 --name jupyter --ipc=host ufoym/deepo:all-jupyter
homeassistant
https://xiaolee.xyz/categories/homeassistant
docker run -itd \
--name hass \
--restart unless-stopped \
--privileged=true \
--net=host \
-e TZ=Asia/Shanghai \
-v /share/hass/config:/config \
homeassistant/home-assistant:2023.3下载hase极速版
https://gitee.com/hacs-chinamkdir -p /home/zjq/share/hass/config/custom_components/hacs
mv hacs.zip /home/zjq/share/hass/config/custom_components/hacs
unzip hacs.zip
docker restart hass
redis
- 宝塔里面安装redis7
- 放行端口
- 设置密码和访问ip为0.0.0.0 谁都可以访问
- 就可以访问了
pika
来自香港,全球互联,8k视频随你看,注册及送永久流量,地址:http://run.weaksharedptr.com/register?share_id=bb0ac878-d813-4c7e-9819-15eb43c5e5c4docker run -itd \--restart=always \--name pika \-v /home/zjq/share/pika:/root/file \-p 9221:9221 pikadb/pika:v3.3.6
Ubuntu
docker run -itd -p 9221:9221 -p 8030:22 --name pika -v /home/zjq/share/pika:/root/pick -d ubuntu:18.04 /bin/bash# 运行容器
$ docker exec -it pika /bin/bash
obs
docker run -itd -p 9010:9010 -p 8029:22 --name minio -v /home/zjq/share/minio/data:/data -e "MINIO_ROOT_USER=zjq" -e "MINIO_ROOT_PASSWORD=密码" minio/minio server /data --console-address ":9010"
饥荒
mkdir ${HOME}/Klei # 创建存放数据有文件夹# 拉取镜像并在前台启动
# 由于Steam要更新,根据网络环境可能要等比较久的时间
# 如果实在无法连接,再考虑给容器挂个代理下载。但总体不建议容器挂代理,因为我不清楚挂代理后steam是连接到服务器的游戏端口还是连到代理的端口上去了,取消容器的代理也非常麻烦。
docker run -itd --name dst -p 10999-11000:10999-11000/udp -p 12346-12347:12346-12347/udp jamesits/dst-server
jupyter
sudo vim /lib/systemd/system/jupyter.service# 写入下面内容---------------------------------------------------------------
[Unit]
Description=jupyter passwd = jupyter密码
After=network.target syslog.target
Wants=network.target[Service]
Type=simple
#启动服务的命令(此处写你的frps的实际安装目录)
ExecStart=nohup jupyter notebook /share/jupyter --allow-root > jupyter.log 2>&1 &
# 后面是展示的目录[Install]
WantedBy=multi-user.target
# --------------------------------------------------------------sudo systemctl start jupyter
sudo systemctl enable jupyter
sudo systemctl restart jupyter
sudo systemctl stop jupyter
sudo systemctl status jupyterdocker run -d -p 8888:8888 -p 7022:22 --name jupyter --ipc=host ufoym/deepo:all-jupyter jupyter notebook --no-browser --ip=0.0.0.0 --allow-root --NotebookApp.token= --port=8888 --no-browser --notebook-dir='/root'
WeChat reboot
docker run -d --name wechatbot -p 3001:3001 \
-e LOGIN_API_TOKEN="密码" \
-e RECVD_MSG_API="http://192.168.3.12:8080/receive_msg" \
dannicool/docker-wechatbot-webhook:latest
0c8605c58c4ac28a664987f43f0ab1b207ae26027fab9ba73196be21e0d228ba"http://192.168.3.12:8080/receive_msg" 这是本地端口发送请求docker logs -f wechatbot
游戏 幻兽帕鲁 pasharp/pal_server:latest
docker run -dit --name steamcmd --net host cm2network/steamcmd# 在容器内下载安装幻兽帕鲁服务端。
docker exec -it steamcmd bash -c "/home/steam/steamcmd/steamcmd.sh +login anonymous +app_update 2394010 validate +quit"# 在容器内运行幻兽帕鲁服务端。
docker exec -it steamcmd bash -c "/home/steam/Steam/steamapps/common/PalServer/PalServer.sh"# 后台执行的
docker exec -itd steamcmd bash -c "/home/steam/Steam/steamapps/common/PalServer/PalServer.sh"
花生壳映射
https://service.oray.com/question/11630.html
halo博客搭建
docker run -it -d --name halo -p 8090:8090 --restart=unless-stopped -v /share/share/halo:/root/.halo2 halohub/halo:2.12
安装Nginx转发端口到80端口
apt install nginx
安装安卓
sudo apt install cpu-checkerroot@zjq:/share/hass/config# kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used# 运行容器, http://192.168.3.99:6080
docker run -d -p 6080:6080 -e EMULATOR_DEVICE="Samsung Galaxy S10" -e WEB_VNC=true --device /dev/kvm --name android-container budtmo/docker-android:emulator_11.0
# 检测状态
docker exec -it android-container cat device_status
wget -c https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.10/amd64/linux-headers-5.10.0-051000_5.10.0-051000.202012132330_all.deb
wget -c https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.10/amd64/linux-headers-5.10.0-051000-generic_5.10.0-051000.202012132330_amd64.deb
wget -c https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.10/amd64/linux-image-unsigned-5.10.0-051000-generic_5.10.0-051000.202012132330_amd64.deb
wget -c https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.10/amd64/linux-modules-5.10.0-051000-generic_5.10.0-051000.202012132330_amd64.deb
相关文章:
通过内网穿透、域名解析实现本地服务部署到公网的架构设计方案
本文主要是总结这些年自己在家玩互联网服务的心得收获, 同时随着年龄增大, 发现脑子确实越来越不好用, 只有记录到笔记中才是真正有意义的。 学生时期做了一些实验, 比如给实验室做日报系统、管理10多台服务器,当时学习了很多架构设计的知识,比如集群化…...
语音陪玩交友软件系统程序-app小程序H5三端源码交付,支持二开!
电竞行业的发展带动其周边产业的发展,绘制着游戏人物图画的抱枕、鼠标垫、海报销量极大,电竞游戏直播、游戏教程短视频也备受人们喜爱,自然,像游戏陪练、代练行业也随之生长起来,本文就来讲讲,从软件开发角…...
import关键字的使用
- import : 导入 - import语句来显式引入指定包下所需要的类。相当于import语句告诉编译器到哪里去寻找这个类。为了使用定义在其它包中的 Java 类,需用 import 语句来显式引入指定包下所需要的类。相当于 import 语句告诉编译器到哪里去寻找这个类 。 语法格式 …...
江协STM32:点亮第一个LED灯和流水灯
很多单片机都是高电平弱驱动,低电平强驱动,所以这里是低电平有效 点亮一个LED灯 操作STM32的GPIO需要三个操作: 第一个使用RCC开启GPIO的时钟 第二步使用GPIO_Init函数初始化GPIO 第三步使用输出或输入函数控制GPIO 1.使用RCC开启GPIO的时…...
设计模式之建造者模式精讲
也叫生成器模式。将一个复杂的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 在建造者模式中,有如下4个角色: 抽象建造者(Builder):用于规范产品的各个组成部分,并进行抽象&…...
vue3源码解析——watch和watchEffect区别
watch和watchEffect是Vue 3.0中新增的两个响应式API,用于监听数据的变化。watch适用于需要获取新值和旧值,或者需要懒执行的场景,而watchEffect适用于需要监听多个数据源,并且需要立即执行的场景。它们之间的区别如下:…...
微服务(基础篇-006-Docker)
目录 初识Docker(1) Docker解决的问题(1.1) Docker与虚拟机(1.2) 镜像和容器(1.3) Docker和DockerHub(1.4) docker架构(1.5) 安…...
深度学习算法概念介绍
前言 深度学习算法是一类基于人工神经网络的机器学习方法,其核心思想是通过多层次的非线性变换,从数据中学习表示层次特征,从而实现对复杂模式的建模和学习。深度学习算法在图像识别、语音识别、自然语言处理等领域取得了巨大的成功…...
查找算法及查找常用数据结构总结
1.顺序表查找 基本方法: 设查找表以一维数组来存储,要求在此表中查找出关键字的值为x的元素的位置,若查找成功,则返回其位置(即下标),否则,返回一个表示元素不存在的下标࿰…...
大语言模型---强化学习
本文章参考,原文链接:https://blog.csdn.net/qq_35812205/article/details/133563158 SFT使用交叉熵损失函数,目标是调整参数使模型输出与标准答案一致,不能从整体把控output质量 RLHF(分为奖励模型训练、近端策略优化…...
前端三剑客 —— CSS (第二节)
目录 内容回顾: CSS选择器*** 属性选择器 伪类选择器 1):link 超链接点击之前 2):visited 超链接点击之后 3):hover 鼠标悬停在某个标签上时 4):active 鼠标点击某个标签时,但没有松开 5):fo…...
牛客NC31 第一个只出现一次的字符【simple map Java,Go,PHP】
题目 题目链接: https://www.nowcoder.com/practice/1c82e8cf713b4bbeb2a5b31cf5b0417c 核心 Map参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*…...
软考系统架构设计师(摘抄)01
架构师承担的责任 系统架构师设计师是承担系统架构设计的核心角色,他不仅是连接用户需求和系统进一步设计与实现的桥梁,也是系统开发早期阶段质量保证的关键角色。系统架构师就是项目的总设计师,他是一个既需要掌控整体又需要洞悉局部瓶颈&a…...
5G无线接入网和接口协议
**部分笔记** 4.3无线协议架构 NR无线协议分为两个平面:用户面和控制面。 用户面(UP):协议栈及用户数据采用的协议 控制面(Control Plane,CP)协议栈即系统的控制信令传输采用的协议簇。 虚线标注的是信令数据的流向。一个UE在…...
【力扣刷题日记】1173.即时食物配送I
前言 练习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。 今日题目: 1173.即时食物配送I 表:Delivery 列名类型delivery_idintcustomer_idintorder_datedatecustomer…...
2024年github之node排行榜top50
如果有帮助到您还请动动手帮忙点赞,关注,评论转发,感谢啦!💕💕💕😘😘😘 本文由Butterfly一键发布工具发布 2024年github之node排行榜top50 语言star项目名称…...
当我们在地址栏输入URL的时候浏览器发生了什么
URL 解析 是否合法 首先判断你输入的是一个合法的 URL 还是一个待搜索的关键词,并且根据你输入的内容进行自动完成、字符编码等操作。检查http缓存 DNS 查询 浏览器缓存 -> 操作系统缓存 -> 路由器缓存 -> DNS缓存 -> 根域名服务器查询 TCP 连接 …...
【研发日记】Matlab/Simulink开箱报告(十一)——Requirements Toolbox
目录 前言 Requirements Toolbox 编写需求 需求联接设计 需求跟踪开发进度 追溯性矩阵 分析和应用 总结 前言 见《开箱报告,Simulink Toolbox库模块使用指南(六)——S-Fuction模块(TLC)》 见《开箱报告&#x…...
Elastic 8.13:Elastic AI 助手中 Amazon Bedrock 的正式发布 (GA) 用于可观测性
作者:来自 Elastic Brian Bergholm 今天,我们很高兴地宣布 Elastic 8.13 的正式发布。 有什么新特性? 8.13 版本的三个最重要的组件包括 Elastic AI 助手中 Amazon Bedrock 支持的正式发布 (general availability - GA),新的向量…...
MFC 截取对话框生成图片、截取整个屏幕(可取黑白反色或者整体图片取反色)
HWND hwnd ::GetDesktopWindow();//截整个屏幕,用从这往下4句HDC hdc ::GetDC(hwnd);CDC dc;dc.Attach(hdc);CRect rc,rcw;GetWindowRect(&rcw);GetClientRect(&rc);//只截对话框,用这句//rc.SetRect(0, 0, GetSystemMetrics(SM_CXSCREEN), Ge…...
【LeetCode: 331. 验证二叉树的前序序列化 + DFS】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...
【Consul】Linux安装Consul保姆级教程
【Consul】Linux安装Consul保姆级教程 大家好 我是寸铁👊 总结了一篇【Consul】Linux安装Consul保姆级教程✨ 喜欢的小伙伴可以点点关注 💝 前言 今天要把编写的go程序放到linux上进行测试Consul服务注册与发现,那怎么样才能实现这一过程&am…...
pytorch常用的模块函数汇总(1)
目录 torch:核心库,包含张量操作、数学函数等基本功能 torch.nn:神经网络模块,包括各种层、损失函数和优化器等 torch.optim:优化算法模块,提供了各种优化器,如随机梯度下降 (SGD)、Adam、RMS…...
素数的计数律:Π函数、歪斜数
相当多的数字! 一、说明 自从人类开始掌握最起码的算术概念以来,有一类数字一直处于最前沿——素数。素数定义简单,但难以捕捉,众所周知,素数是数学中一些最困难问题的罪魁祸首,让几代最优秀的数学家感到…...
图像识别在农业领域的应用
图像识别技术在农业领域的应用正在逐渐成熟,它通过分析处理拍摄的植物或农田的图像,为农业生产提供决策支持。以下是图像识别在农业中的一些关键应用: 病虫害检测:图像识别技术能够识别作物上的病斑、虫害或异常状况。通过比较高…...
【JavaSE】java刷题--数组练习
前言 本篇讲解了一些数组相关题目(主要以代码的形式呈现),主要目的在于巩固数组相关知识。 上一篇 数组 讲解了一维数组和二维数组的基础知识~ 欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎…...
预处理、编译、汇编、链接过程
预处理、编译、汇编、链接过程 预处理 引入头文件 #include 展开宏定义 #define 处理条件编译指令 #ifdef 删除注释 添加行号 在Linux下可以使用gcc -E命令把hello.c文件预处理成hello.i文件。windows这些操作都集成在编译器visual studio这些里面了。 编译 进行语法分…...
3、Cocos Creator 节点和组件
目录 1、 节点和组件 2、 节点层级和显示顺序 3、坐标系和节点变换属性 坐标系 锚点 旋转 缩放 尺寸 4、 常用技巧 5、参考 1、 节点和组件 Cocos Creator 的工作流程是以组件式开发为核心的,组件式架构也称作 组件 — 实体系统(或 Entity-C…...
【js刷题:数据结构数组篇之长度最小的子数组】
长度最小的子数组 一、题目二、方法1.暴力解法2.滑动窗口是什么滑动窗口的起始位置滑动窗口的结束位置代码展示 3.力扣刷题水果成篮题目思路代码 一、题目 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组&…...
大话设计模式之装饰模式
装饰模式(Decorator Pattern)是一种结构型设计模式,它允许向现有对象动态地添加新功能,同时又不改变其结构。装饰模式通过将对象放入包装器中来实现,在包装器中可以动态地添加功能。 在装饰模式中,通常会有…...
wordpress 同步/2022社会热点事件及看法
3.2 数据挖掘建模过程 广州TipDM团队在多年的数据挖掘项目实施过程中,积累了一套行之有效的数据挖掘方法论,数据挖掘建模过程如图3-2所示。 3.2.1 定义挖掘目标 针对具体的数据挖掘应用需求,首先要非常清楚:本次的挖掘目标是什么&…...
wordpress写书typecho主题/推广普通话的意义
collection 定义命名元祖,让元祖的每个元素可以通过类似对象属性的方法用".属性"及其方便的取值. 定义可前后拿取值且可迭代的双端队列 定义有顺序的字典 定义有默认值的字典ps: 队列 :先进先出 堆栈 :先进后出具体用到的或…...
高级经济师/seo推广知识
Daniel2cscanf我不知道为什么,当我运行它时,它会跳过"书中有多少页" scanf并直接进入第二个循环"谁是作者".我确定这与空白有关,但我认为我用getcharfor循环的底部来解释这个问题.标题:struct bookInfo{char title[40];char author[25];float price;int pa…...
wordpress设置固定链接/推广公司产品
使用LINQ to SQL设计器设计Northwind数据库的五个类(Product,Category,Customer,Order和OrderDetail)的时候,每个类中的属性都映射了相应数据库中表的列,每个类的实例则代表了数据库表中的一条记…...
广东两学一做考试网站/视频运营管理平台
JS中的数据类型 虽然JS是弱类型语言,JS的变量声明的时候并不需要指定数据类型,但是在赋值上每一个数据是由类型的。 值得注意的是ES6之后,又基于以下的6中类型之外添加了一种新的类型:symbol 学习数据类型我们还常用typeof运算符…...
做购物网站数据库分析/网络营销软文范文
1.明确终端服务的2种模式 ----Windows 2000终端服务有2种运行模式: 远程管理模式和应用程序服务器模式。远程管理模式允许系统管理员远程管理服务器,而且只允许2个终端会话同时登录终端服务器。应用程序服务器模式允许用户运行一个以上应用程序ÿ…...