前言 開發時一定要用管理員模式打開VS或者VSCODE進行開發,同時不要在nuget上直接下載,要去github上下載源代碼調試。第一方便調試,第二Surging迭代較快,nuget版本往往不是最新的。 錯誤 問題:fail: Surging.Core.DotNetty.DotNettyServer ...
前言
開發時一定要用管理員模式打開VS或者VSCODE進行開發,同時不要在nuget上直接下載,要去github上下載源代碼調試。第一方便調試,第二Surging迭代較快,nuget版本往往不是最新的。
錯誤
問題:fail: Surging.Core.DotNetty.DotNettyServerMessageListener[0] 服務主機啟動失敗XXX
- 使用netstat -ano命令查看報錯的埠是否被占用或者是不是當前vs許可權不夠,不夠請用管理員模式打開
新版本中不要使用option.UseDotNettyTransport();該方法已過時,如果在Program中再調用的話會有衝突。
問題:Generic types are not valid arg_paramname_name
介面不支持泛型類型,就是說不能這麼寫
[ServiceBundle("api/{Service}")]
public interface IOracleDBServcie : IServiceKey
{
Task<List<T>> Query<T>(string sql);
Task<T> ExecuteScalar<T>(string sql);
Task<int> Execute(string sql);
}
要寫成這樣,這還是挺坑的,不同的查詢得定義不同的類型
[ServiceBundle("api/{Service}")]
public interface IOracleDBServcie : IServiceKey
{
Task<List<ROUTE_SERVICE_TABLE>> QueryRouteService(string sql);
Task<List<SERVICE_MASTER_TABLE>> QueryServiceMasterTable(string sql);
Task<int> ExecuteScalar(string sql);
Task<int> Execute(string sql);
}
問題:A suitable constructor for type 'xxx' could not be located. Ensure the type is concrete and services are registered for all parameters of a public constructor
出現這個錯誤你肯定看了網上一些弔人的文章,跑不起來就往網上放,原因是因為Startup,在使用UseStartup
public class Startup : IStartup
問題:One or more errors occurred.由於目標電腦積極拒絕,無法連接
看下報錯的類,比如是在這個類ConsulServiceCacheManager
中報錯那就是Consul沒有聯上,看下有沒有啟動consul或者是地址埠配置的對不對。在Rabbitmq中報錯,那就是RBMQ沒有聯上,一樣檢查連接
。如果是部署在docker中出現 這個錯誤,那就是映射的ip和埠不對
開發調試
問題:在代理方法上打了斷點進行調試,每次都很快的返回但取不到返回值一直是null
這是由於Surging熔斷中的超時配置ExecutionTimeoutInMilliseconds該值預設是一秒,調試的時候手速慢點就會立即返回,所以這個值建議設置成60000(1分鐘)
問題:迴圈任務中在代理方法上打了斷點進行調試,剛開始正常但後來每次都很快的返回但取不到返回值一直是null
同樣也是熔斷的限流配置MaxConcurrentRequests問題,查下你是不是在迴圈中用了非同步或者是用的Parallel.ForEach這類來進行迴圈,預設最大併發是20,超過這個值就會炸掉,設置的高一點問題解決
下麵附上配置欄位的一些註解
部署
問題:Docker中部署時配置文件內容未生效
查看你程式中是怎麼引用的,可能是反斜杠的問題
錯誤寫法:build.AddCPlatformFile("${surgingpath}|Configs\\surgingSettings.json", optional: false, reloadOnChange: true);
正確寫法:build.AddCPlatformFile("${surgingpath}|Configs/surgingSettings.json", optional: false, reloadOnChange: true);
Docker中服務單獨部署時的命令
#docker run --name surgingserver --env Mapping_ip=192.168.249.162 --env Mapping_Port=198 --env RootPath=/app --env
Register_Conn=192.168.249.162:8500 --env EventBusConnection=172.17.0.4 --env Surging_Server_IP=0.0.0.0 -it -p 198:198 surgingserver
配置說明
Mapping_ip:映射的外部IP(環境變數)
Mapping_port:映射的外部埠(環境變數)
RootPath:業務模塊存儲的根路徑(環境變數)
Register_Conn:註冊中心地址(環境變數)
EventBusConnection:eventbus 地址(環境變數)
Surging_Server_IP:容器內部IP(環境變數)
通過Docker-compose進行部署
這種方式我只發現了 一個問題,build的內容這麼寫有問題
service_datainteract:
build:
context: .
dockerfile: Service_DataInteract/Dockerfile
container_name: service_datainteract
正確寫法,我不知道是不是我操作有問題,反正我這邊部署的時候有個問題這樣寫就好了
service_datainteract:
build:
context: ./Service_DataInteract
dockerfile: Dockerfile
container_name: service_datainteract
結語
我整個開發的時候問題就這麼多,可能有些沒忘了,總體來說還是比較簡單的。
另外比較可惜的是Surging出完2.0就不更新了,作者跑路了。。。。後面只能自己在上面完善了
微信關註我哦!(轉載註明出處)