当时项目提出的具体项目需求, 后续实现之后感觉挺有趣的就把其单独剔除出来总结起来;
具体需求就是商家在我们自己商户平台 注册并绑定当前地址, 然后用户需要在平台检索最近的注册商家.
这里实现方式其实也十分简单, 只需要在注册的时候使用 MySQL|MariaDB 的 Geometry 类型保存位置经纬度.
注意: MySQL版本必须在 5.7 之后才能支持该类型.
Geometry 类型是专门用于空间存储的类型, 具体支持以下细分类型:
Point(110.3 44.0): 点, 保存坐标点位置, 也就是位置标识经纬度
LineString(80.07 23.45, 99.23 34.56): 线, 两个点联系的直线, 用于标识两点直线
Polygon((93.30 35.301 90.332 30.341)): 面, 多点连接采用的多边形面
MultiPoint: 多点, 用于多个点记录, 一般是复杂的多点位置记录
MultiLineString: 多线, 用于多条路线记录, 一般是复杂的多路线记录
MultiPolygon: 多面, 用于多个面对象, 一 ...
这种是游戏服务端当中最常见的碰撞检测游戏寻路方式, 日常AI机器人也十分依赖寻路策略.
静态可以采用 AStar, 而动态则需要 Dstar 的 Dijkstra 处理运算寻路, 移动端游戏尽可能采用静态寻路处理
游戏客户端大部分实现这些插件让其更加易用( Unity的NavMesh ),
但是服务端则缺失这部分功能也就没办法在服务端模拟玩家行走路线从而同步.
AStar寻路实际上是采用 网格(Gird) 的寻路计算, 具体原理就是先把整个地图分解成 Width * Height 多个格子,
然后通过网格周边连线来处理出最短路径, 同时支持标识障碍物绕过计算, 这种过程就是将 平面栅格化.
大部分寻路都是基于这种方式, 只是按照不同算法评估周边格子从而采样路径处理.
注: 在空间寻路当中必须要具有 方向 和 距离 才能形成正确的寻路路径(向量|矢量)
寻路方式按照不同方式计算寻路:
曼哈顿估价法(Manhattan Heuristic)
几何估价法(Euclidean Heuristic)
对角线估价法(Diagonal Heuristic)
对应三种寻路方式 ...
Nginx 常用来负载均衡, 用来多个服务端反向代理内部服务器组从而获取到内部网络资源对外提供服务,
后续还有些静态资源就需要考虑多地缓存而不走直接后端流量.
常见比如网状反向服务架构, 多个对外服务Nginx同时转发到内网单机情况; 需要缓存内网资源到外部访问服务器本地, 后续资源不走内部服务器.
假设目前内网机已经部署好对外静态资源服务端, 这时候则需要在可以被对外访问得服务器上安装配置 Nginx:
12# 安装好 NGINX 服务sudo apt install -y nginx
之后这里就是假设需求: 目前需要 .mp4|.mkv|.avi|.wmv 这些视频文件十分庞大且占用流量十分多,
所以在对外服务器上需要将内网服务器的资源缓存, 并且后续超时时间设定为 6 个月才重新更新缓存.
这里编写配置来处理这方面设置即可:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263http { ...
虽然 Git 已经满足代码版本托管, 但是对于美术/策划等工作来说没必要搞什么代码托管或者版本管理, 只需要不断推送就行了.
这里基于 debian 系统安装
12345# 安装 subversion 软件sudo apt install -y subversion# 之后创建版本库sudo mkdir /svn && cd /svn
生成版本库
这里多版本库首先定义好子版本库, 以后不断扩展不同版本库:
12345678910111213# 创建子版本库 code sudo mkdir -p /svn/code && cd /svn/code# 生成版本库sudo svnadmin create /svn/code# 没问题就含有以下文件目录:# conf# db# format# hooks# locks# README.txt
这里主要修改配置文件 conf:
conf/authz: 权限控制
conf/passwd: 账号密码文件
conf/svnserve.conf: 服务器配置文件
首先修改账号密码文件( conf/pas ...
收集些日常用到的 Shell 脚本
通过PID获取指定应用占用情况
123456789101112131415161718192021222324252627```shell#!/bin/bashread -p "请输入要查询的用户名:" nameecho "------------------------------"n=`cat /etc/passwd | awk -F: '$1~/^'${name}'$/{print}' | wc -l`if [ $n -eq 0 ];thenecho -e "\e[31m该用户不存在!\e[0m"echo "------------------------------"else echo "该用户的用户名:${name}" echo "该用户的UID:$(cat /etc/passwd | awk -F: '$1~/^ ...
systemd 系统单元可以利用 @ 后面传递某些变量, 比如:
12sudo systemctl start [email protected]# 可以看到其实内部系统配置文件为 [email protected]
这种就是 systemd 的模板服务, 用于调用可变的系统服务.
1234[Unit]# 内部采用 %I 获取到外部 [email protected] 传入 yyy 模板值Description=Temple Service By %IAfter=network.target nss-lookup.target
这里 systemd 内置不少可能需要的变量, 这些模板服务依赖大量系统环境, 所以编写的时候需要在 Description 打印好做好排查:
%n: 完整的 Unit 文件名字,包括 .service 后缀名
%N: 完整的 Unit 文件名字,不包括 .service 后缀名
%p: Unit 模板文件名中 @ 符号之前的部分,不包括 @ 符号
%P: Unit 模板文件名中 @ 符号之前的部分,包括 @ 符号
%i: Unit 模板文件名中 ...
这里源于多用户登录的时候,想要各自用户达成运行 systemd 以下效果:
123456# 常见的 systemd 启动服务sudo systemctl start nginx.service# 但是现在要求生成某个服务, 让其只允许启动自己家目录的应用, 类似如下:systemcl start owner-worker.service# 这个服务会根据当前登录的不同用户在自己 Home 目录下创建自己的工具目录
对于 Linux 这种多用户分配的时候, 需要自己与根据自己根目录生成不同开发配置等就需要这种效果.
常见的系统服务脚本都是放置于 /lib/systemd/system, 但是如果区分个人用户则是放置于 /lib/systemd/user 之中,
所以这里脚本已经放置于此:
12# 编写用户级别的启动服务sudo vim /lib/systemd/user/owner-worker.service
这里需要先科普下 systemd 模板声明变量, 建议先了解好内置模板变量再进行编写.
123456789101112131415161718192021# owner-work ...
这种请求针对某些合法接口的 CC(Challenge Collapsar) 攻击对某些接口进行重复合法访问, 能够有效利用 Nginx 来压低访问频率.
这里面基于 Nginx 的两个模块:
ngx_http_limit_conn_module: 单一IP的连接限制( 限制连接并发 )
ngx_http_limit_req_module: 单一IP的请求限制( 限制请求并发 )
ngx_http_limit_conn_module
用于对单个 IP 地址限制连接数, 只有正常处理HTTP标头的时候才会被计算为一个连接; 这种请求下, 可以识别出单个 IP
是否只请求连接而不进行任何处理卡住访问链接.
这里配置如下:
123456789101112131415161718192021222324252627282930313233# 这里是 HTTP 请求, 所以放置于 HTTP 块配置之中http { # 这里需要在内存之中定义内存区放置请求的标识区域, 注意重启会释放这块区域 # 关键点: # 1. 设置名为 `limitaddr` 的共享内存 ...
这里需要说明内部的环境需要区分:
开发测试环境(Development), 这里一般采用 Docker/虚拟机开发.
正式部署环境(Production), 这里习惯性由 Tomcat 托管 War 包或者直接 Jar 写入系统服务.
而且一般部署都是基于 Linux 环境, 所以基本上对于正式部署来说只需要处理 Linux 平台.
这里的采用平台是Debian系统, 剩下发行版大同小异; 且这里采用系统源安装, Java 版本采用系统默认版本来处理, 可以自己手动调整源安装
Java1.8.
对于正式服务器, 只需要安装 java 命令就行, 常规的直接命令挂起:
12# 最好不要安装 JDK, package.jar 是自己打的 Jar 包java -jar package.jar # 直接前台运行, 如果想正规启用需要编写成系统应用, 这里仅仅是作为测试不做展开.
Linux测试搭建
安装 Java/Jdk:
12345apt install -y default-jre # 安装默认Java运行时java -version # 安装成功之后就会显示 openjdk 输出 ...
现在因为某个原因, 导致本地 DNS 对网络影响特别严重, 所以建议本地如果有能力可以自己搭建 DNS 服务器来进行部署.
默认的 Ubuntu 之中会默认开启 systemd-resolved.service 监听 53 端口来做本地域名解析, 所以需要将他关闭:
1234567# 编辑默认服务文件sudo vim /etc/systemd/resolved.conf # 找到如下配置修改如下:# DNSStubListener=no# 之后重启下服务即可sudo systemctl restart systemd-resolved.service
之后直接采用 SmartDns 的服务进行管理:
12345# 直接系统服务安装sudo apt install smartdns -y # 安装之后就是编辑下配置文件sudo vim /etc/smartdns/smartdns.conf
需要配置文件如下:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495 ...






