我在azure上有一个go应用程序,它根据在url中发送的id作为事件源'.co / stream / {id}'生成SSE连接。其中一个ID比其他ID更常用,并且已停止连接,但任何其他id连接都很好。该应用程序位于ubuntu VM中。
客户端连接vue应用程序。
我不确定azure是否阻止了网址或连接是否有限制?
我试过的事情:
已在网络配置中使用azure配置端点和端口。重新启动应用程序和服务器可以工作几分钟(5-10分钟),但随后在客户端上获得Err_Connection_Refused。虚拟机上的CPU和RAM使用率非常低
客户
var url = "example.co:3000/";
var streaming = "stream/";
var source = new EventSource(url + streaming + this.$route.params.idCine);
console.log("ready state connecting = " + source.readyState);
source.onmessage = function(event) {
console.log("ready state = " + source.readyState);
console.log('yay');
}
后端连接到mysql数据库并为客户端消息生成json
package controllers
import (
"github.com/revel/revel"
"cplsAPI/app"
"time"
"fmt"
"strconv"
)
type App struct {
*revel.Controller
}
type Order struct {
IdOrder int` json:"idOrder" `
OrderNum string` json:"orderNum" `
CustomerName string` json:"customerName" `
DeliveryPoint int` json:"deliveryPoint" `
ImageUrl string` json:"imageUrl" `
Timer int` json:"timer" `
Status int` json:"status" `
IdCine int` json:"idCine" `
}
func (c App) Index() revel.Result {
return c.Render()
}
func (c App) GetOrders() revel.Result {
idCine := c.Params.Route.Get("idCine")
sql := "SELECT * FROM Orders WHERE idCine = "+idCine+";"
rows, err := app.DB.Query(sql)
var resul []Order
checkErr(err)
for rows.Next() {
var idOrder int
var orderNum string
var customerName string
var deliveryPoint int
var imageUrl string
var timer int
var status int
var idCine int
var createdAt string
var updatedAt string
err = rows.Scan(&idOrder,&orderNum,&customerName,&deliveryPoint,&imageUrl,&timer,&status,&idCine,&createdAt,&updatedAt)
checkErr(err)
resul = append(resul, Order{IdOrder:idOrder , OrderNum:orderNum , CustomerName:customerName , DeliveryPoint:deliveryPoint , ImageUrl:imageUrl , Timer:timer , Status:status , IdCine:idCine})
// fmt.Printf("%+v\n", resul)
}
defer rows.Close()
return c.RenderJSON(resul)
}
func (c App) NewOrder() revel.Result {
idCine := c.Params.Route.Get("idCine")
var jsonData Order
c.Params.BindJSON(&jsonData)
// fmt.Printf("%+v",jsonData)
// fmt.Printf("\n")
// fmt.Printf(jsonData.OrderNum)
// fmt.Printf("\n")
sql:= fmt.Sprintf("INSERT Orders (orderNum, customerName, deliveryPoint, imageUrl, timer, status, idCine) VALUES('%s', '%s', %d,'%s', %d, %d, %s)",jsonData.OrderNum,jsonData.CustomerName,jsonData.DeliveryPoint,jsonData.ImageUrl,jsonData.Timer,jsonData.Status,idCine)
// fmt.Printf(sql)
// fmt.Printf("\n")
// fmt.Printf(idCine)
res, err := app.DB.Exec(sql)
checkErr(err)
// fmt.Printf("=======================\n")
//var inserted Order
// fmt.Printf("%+v\n",res)
// fmt.Printf("=======================\n")
id, err := res.LastInsertId()
checkErr(err)
idCineInt, err := strconv.Atoi(idCine)
jsonData.IdOrder = int(id)
jsonData.IdCine = idCineInt
//id, err := res.LastInsertId()
//checkErr(err)
//fmt.Println(id)
// timerInt, err := strconv.ParseInt(timer,10,32)
checkErr(err)
//defer res.Close()
time.AfterFunc(300*time.Second, func() {
// fmt.Printf("===UPDATE===")
updt := fmt.Sprintf("DELETE FROM Orders WHERE idOrder=%d AND idCine=%s",id,idCine)
rows, err := app.DB.Query(updt)
checkErr(err)
defer rows.Close()
//fmt.Println(rows)
})
data := make(map[string]interface{})
data["error"] = nil
data["data"] = jsonData
return c.RenderJSON(data)
}
func (c App) UpdateOrder() revel.Result {
idCine := c.Params.Route.Get("idCine")
var jsonData Order
c.Params.BindJSON(&jsonData)
idCineInt, err := strconv.Atoi(idCine)
// fmt.Printf("===UPDATE===")
dlt := fmt.Sprintf("DELETE FROM Orders WHERE orderNum='%s' AND idCine=%s",jsonData.OrderNum,idCine)
rows, err := app.DB.Query(dlt)
checkErr(err)
fmt.Println(rows)
//jsonData.IdOrder = int(id)
jsonData.IdCine = idCineInt
defer rows.Close()
data := make(map[string]interface{})
data["error"] = nil
data["data"] = jsonData
return c.RenderJSON(data)
}
func checkErr(err error) {
if err != nil {
panic(err)
}
}
EventSource
接口要求请求和响应的内容类型是text/event-stream
,而不是application/json
或text/html
或其他。它在客户端和服务器上都需要相同的字符集。
所以我认为您可以尝试检查您的Content-Type
标头的请求和响应。
对于服务器端,为c.Response.ContentType = "text/event-stream"
处理程序添加代码/stream
。