3

一种自动为应用分配端口号的方法(及系统)

 3 years ago
source link: https://blog.henix.info/blog/port-hash/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一种自动为应用分配端口号的方法(及系统)

最后更新日期:2019-07-26

  越来越多的应用要在同一台机器上运行,不知道怎么分配端口号怎么办?

  同时开发几个项目,大家默认端口都是 8080(或 3000 ,如果是 nodejs 应用),一启动就端口冲突,有没有什么方法来全局统一分配端口号?

  一个简单粗暴的办法:对应用名进行 hash 。这里直接使用 md5sum 和一些 Linux shell 技巧(16 进制转 10 进制):

#!/bin/sh
[ $# -ne 1 ] && echo "Usage: $0 name" && exit 1

p=$(printf "%d" "0x$(printf "%s" "$1" | md5sum | head -c 4)")
# 端口号范围为 1024 ~ 49151 ,48121 为小于 49151 - 1024 的第一个质数
# https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
port=$((p % 48121 + 1024))
echo "$port"

  测试用例:若项目名为 example ,计算出的端口号为 7801 ;若项目名为 1 ,计算出的端口号为 3281 。

  用中文描述一下:

  1. 计算应用名的 md5 ,取其 16 进制结果的前 4 位
  2. 上述结果作为 16 进制数转换为 10 进制(这一步的结果的范围是 0 ~ 65535)
  3. 上一步结果模 48121 取余再加 1024

  为什么最后要加 1024 :因为在一般的 Linux 系统上,小于 1024 的端口号为系统保留,监听需要 root 权限。一般应用应分配大于等于 1024 的端口号。

  为什么要用 48121:根据英文 wiki ,大于 49151 的端口号为动态端口,一般不推荐应用使用。因此端口号的合理范围为 1024 ~ 49151 ,48121 为小于 49151 - 1024 的第一个质数,hash 函数在取余的时候一般用质数,这样使得 hash 的结果更均匀。

评论邮箱 评论帮助

请按照如下格式发邮件:
[email protected]
[复制]
评论 / 回复内容,只支持纯文本


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK