feat: manually mirror opencoze's code from bytedance
Change-Id: I09a73aadda978ad9511264a756b2ce51f5761adf
This commit is contained in:
3
docker/proxy/go.mod
Normal file
3
docker/proxy/go.mod
Normal file
@@ -0,0 +1,3 @@
|
||||
module github.com/coze-dev/coze-studio/docker/proxy
|
||||
|
||||
go 1.24.1
|
||||
100
docker/proxy/proxy.go
Normal file
100
docker/proxy/proxy.go
Normal file
@@ -0,0 +1,100 @@
|
||||
/*
|
||||
* Copyright 2025 coze-dev Authors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"net"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func main() {
|
||||
proxyURLListString := os.Getenv("COZE_SERVER_PROXY_URL_LIST")
|
||||
if proxyURLListString == "" {
|
||||
proxyURLListString = "mysql:3306,redis:6379,elasticsearch:9200,milvus:19530,minio:9000,nsqd:4150"
|
||||
}
|
||||
|
||||
proxyURLList := strings.Split(proxyURLListString, ",")
|
||||
for _, serverAddInDockerNet := range proxyURLList {
|
||||
err := listen(serverAddInDockerNet)
|
||||
if err != nil {
|
||||
fmt.Printf("listen %s failed: %v\n", serverAddInDockerNet, err)
|
||||
}
|
||||
}
|
||||
|
||||
// 阻塞主程序,防止退出
|
||||
select {}
|
||||
}
|
||||
|
||||
func listen(serverAddInDockerNet string) error {
|
||||
tcpAddr, err := net.ResolveTCPAddr("tcp", serverAddInDockerNet)
|
||||
if err != nil {
|
||||
fmt.Printf("解析失败: %v\n", err)
|
||||
return err
|
||||
}
|
||||
|
||||
fmt.Printf("host %s : %s:%d\n", serverAddInDockerNet, tcpAddr.IP, tcpAddr.Port)
|
||||
localAddr := fmt.Sprintf(":%d", tcpAddr.Port)
|
||||
addr := fmt.Sprintf("%s:%d", tcpAddr.IP, tcpAddr.Port)
|
||||
|
||||
go startListener(localAddr, addr)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func startListener(localAddr, targetAddr string) {
|
||||
// 监听本地端口
|
||||
listener, err := net.Listen("tcp", localAddr)
|
||||
if err != nil {
|
||||
log.Printf("无法监听端口 %s: %v", localAddr, err)
|
||||
return
|
||||
}
|
||||
defer listener.Close()
|
||||
|
||||
log.Printf("TCP 服务器已启动,监听端口 %s\n", localAddr)
|
||||
|
||||
for {
|
||||
// 接受客户端连接
|
||||
clientConn, err := listener.Accept()
|
||||
if err != nil {
|
||||
log.Printf("接受连接失败: %v", err)
|
||||
continue
|
||||
}
|
||||
|
||||
// 处理客户端连接
|
||||
go handleConnection(clientConn, targetAddr)
|
||||
}
|
||||
}
|
||||
|
||||
func handleConnection(clientConn net.Conn, targetAddr string) {
|
||||
defer clientConn.Close()
|
||||
|
||||
// 连接到目标服务器
|
||||
targetConn, err := net.Dial("tcp", targetAddr)
|
||||
if err != nil {
|
||||
log.Printf("无法连接到目标服务器 %s: %v", targetAddr, err)
|
||||
return
|
||||
}
|
||||
defer targetConn.Close()
|
||||
|
||||
// 启动两个协程进行双向数据转发
|
||||
go io.Copy(targetConn, clientConn)
|
||||
io.Copy(clientConn, targetConn)
|
||||
}
|
||||
Reference in New Issue
Block a user