# Spark端口代理服务 **Repository Path**: flowerbirds/spark-port-proxy ## Basic Information - **Project Name**: Spark端口代理服务 - **Description**: Spark Port Proxy - **Primary Language**: Go - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-08-04 - **Last Updated**: 2024-11-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spark Port Proxy ## 设计思路 基于go开发,使用redis存储相关信息。从环境变量中获取参数信息,参数是PORT_RANGE,字符类型,多个值用逗号隔开,例如5011-5029或者5011-5029,50029-50036等。 程序启动后,执行心跳逻辑:提取本机主机名,将本机主机名作为值,存入到redis中key为spark-port-proxy-online的hash类型中,hash的key为主机名,value为当前时间。 心跳中检测spark-port-proxy-online中的所有值,查看每个hash中的value值的时间,如果时间和当前时间相差3倍的时间间隔,则删除hash中对应的key。根据存活的主机数量, 将根据端口范围参数中的端口数量,平均分配到每个主机上,比如配置了16个端口,当前存活两个主机,则每个主机各自分配8个端口, 每隔10s执行,间隔时间可以配置,来源环境变量。 基于go开发,当前程序设计为多实例,即可以启动多个实例。通过udp协议进行广播寻找当前启动的实例,广播地址为10.6.6.4,启动时,将当前节点的节点ID设置为1,并且记录当前时间戳,然后将节点ID和时间戳信息广播出去,询问其他节点是否存在 相同的节点ID且时间戳信息是否比自己的早,如果有早于这个时间戳的节点,则应答反馈当前节点ID已存在,如没有或者时间戳晚,则自身的节点ID+1并更新时间戳,并应答 不存在,如果两个时间戳一样,则应该节点变更节点ID。如果有新加入的节点,则节点ID从1开始进行询问,直到没有被占用。每个节点每隔5s发送一次广播信息,报告自身的健康状态, 并携带节点ID等信息。当节点ID确认后,开始分配port,根据节点的数量,均分port,将端口分布列表广播到每个节点。当新节点加入时,所有未被分配的端口重新进行分配, 如果待分配的不够分,则当前节点无port可用。同时,udp服务提供端口查询功能,可以根据发送请求来查询对应端口属于哪个主机。