kitc执行流程分析

最近阅读了RPC框架kitc的部分源码,kitc是kite框架的客户端实现,kite框架是公司内部基于开源的thrift封装二次开发的,与开源的kite框架并不一样。kitc 的执行过程也是中间件调用链的执行过程。

对目标接口方法进行封装
// client端调用目标接口的方法,由工具根据接口定义自动生成
func (p *ExampleServiceClient) Method1(req *ExampleRequest) (r *ExampleResponse, err error) {
  if err = p.sendMethod1(req); err != nil { return }
   return p.recvMethod1()
 }
 
 // EndPoint represent one method for calling from remote.
 // EndPoint 代表一个远端方法的调用过程
type EndPoint func(ctx context.Context, req interface{}) (resp interface{}, err error)

// 对目标接口方法进行封装,封装为endpoint.EndPoint类型
func mkMethod1(client *example.ExampleServiceClient) endpoint.EndPoint {
     return func(ctx context.Context, request interface{}) (interface{}, error) {
         transport := client.Transport.(kitc.Transport)
         err := transport.OpenWithContext(ctx)
         if err != nil {...}
         defer transport.Close()
         // Method1为proto文件中定义的服务接口 
         resp, err := client.Method1(request.(endpoint.KitcCallRequest).RealRequest().(*example.ExampleRequest))
         addr := transport.RemoteAddr()
         return &KitcExampleResponse{resp, addr}, err
     }
 }
kitc中间件的定义
// Middleware deal with input EndPoint and output EndPoint
// 输入为EndPoint类型,输出为EndPoint类型
type Middleware func(EndPoint) EndPoint

// client端执行目标接口方法调用
func (c *Client) Method1(ctx context.Context, r *example.ExampleRequest) (*KitcExampleResponse, error) {
     kc := c.client
     if kc == nil {...}
     // 中间件的初始化
     **ctx, err := kc.MethodInit("Method1", ctx, r)**  @1
     if err != nil {...}
     client := GetExampleServiceClient(kc)
     **next := mkMethod1(client)**
     request := &KiteExampleRequest{r}
     **resp, err := kc.MethodCall(next, ctx, request)** @2
     kitcResp, ok := resp.(*KitcExampleResponse)
     if !ok {...}
     return kitcResp, err
 }

// @1 处的代码
func (kc *KitcClient) MethodInit(method string, ctx context.Context, request interface{}) (context.Context, error) {
     metricsClient.EmitCounter("kite.request.throughput", 1)
     // 初始化中间件调用链,包含服务发现中间件,负载均衡中间件, 连接池中间件等等
     kc.once.Do(kc.initMWChain)
     // 因为request会被生成代码包裹,
     // 如果用户使用了自定义的LB, 需要保证直接把最原始的req传递给用户
     ctx = context.WithValue(ctx, KITC_RAW_REQUEST_KEY, request)
     return kc.initRPCInfo(method, ctx)
 }

// @2 处的代码
func (kc *KitcClient) MethodCall(next endpoint.EndPoint, ctx context.Context, request interface{}) (endpoint.KitcCallResponse, error) {
    ......
    // kc.chain(next)执行中间件调用链,生成一个EndPoint类型,然后执行EndPoint方法
    // 如此就完成了目标接口方法的调用
     resp, err := kc.chain(next)(ctx, request)
     if _, ok := resp.(endpoint.KitcCallResponse); !ok {...}
     return resp.(endpoint.KitcCallResponse), err
}
怎么改{ "extensions.ignoreRecommendations": true, "explorer.confirmDragAndDrop": false, "explorer.confirmDelete": false, "security.workspace.trust.untrustedFiles": "open", "workbench.editor.enablePreview": false, "files.autoSave": "afterDelay", "editor.fontSize": 22, "workbench.commandPalette.experimental.suggestCommands": true, "code-runner.executorMap": { "javascript": "node", "java": "cd $dir && javac $fileName && java $fileNameWithoutExt", "c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt", "zig": "zig run", "cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt", "objective-c": "cd $dir && gcc -framework Cocoa $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt", "php": "php", "python": "python -u", "perl": "perl", "perl6": "perl6", "ruby": "ruby", "go": "go run", "lua": "lua", "groovy": "groovy", "powershell": "powershell -ExecutionPolicy ByPass -File", "bat": "cmd /c", "shellscript": "bash", "fsharp": "fsi", "csharp": "scriptcs", "vbscript": "cscript //Nologo", "typescript": "ts-node", "coffeescript": "coffee", "scala": "scala", "swift": "swift", "julia": "julia", "crystal": "crystal", "ocaml": "ocaml", "r": "Rscript", "applescript": "osascript", "clojure": "lein exec", "haxe": "haxe --cwd $dirWithoutTrailingSlash --run $fileNameWithoutExt", "rust": "cd $dir && rustc $fileName && $dir$fileNameWithoutExt", "racket": "racket", "scheme": "csi -script", "ahk": "autohotkey", "autoit": "autoit3", "dart": "dart", "pascal": "cd $dir && fpc $fileName && $dir$fileNameWithoutExt", "d": "cd $dir && dmd $fileName && $dir$fileNameWithoutExt", "haskell": "runghc", "nim": "nim compile --verbosity:0 --hints:off --run", "lisp": "sbcl --script", "kit": "kitc --run", "v": "v run", "sass": "sass --style expanded", "scss": "scss --style expanded", "less": "cd $dir && lessc $fileName $fileNameWithoutExt.css", "FortranFreeForm": "cd $dir && gfortran $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt", "fortran-modern": "cd $dir && gfortran $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt", "fortran_fixed-form": "cd $dir && gfortran $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt", "fortran": "cd $dir && gfortran $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt", "sml": "cd $dir && sml $fileName", "mojo": "mojo run", "erlang": "escript", "spwn": "spwn build", "pkl": "cd $dir && pkl eval -f yaml $fileName -o $fileNameWithoutExt.yaml", "gleam": "gleam run -m $fileNameWithoutExt" } }
03-21
这是用户区的settings.json: { "code-runner.fileDirectoryAsCwd": true, "code-runner.runInTerminal": true, "code-runner.clearPreviousOutput": true, "security.workspace.trust.untrustedFiles": "open", "markdown-preview-enhanced.mathRenderingOption": "MathJax", "markdown.extension.completion.enabled": true, "python.defaultInterpreterPath": "C:\\Users\\imsfp\\AppData\\Local\\Programs\\Python\\Python313\\python.exe", "editor.fontFamily": "Maple Mono, Consolas, monospace", "terminal.integrated.fontFamily": "monospace", "workbench.iconTheme": "vscode-icons", "workbench.colorCustomizations": { "editorCursor.foreground": "#FF0000", "terminalCursor.foreground": "#FF5555" }, "window.titleBarStyle": "custom", "python.terminal.executeInFileDir": true, "python.analysis.completeFunctionParens": true, "code-runner.executorMap": { "python": "set PYTHONIOENCODING=utf8 && $pythonPath -u $fullFileName" }, "code-runner.showExecutionMessage": false, "git.ignoreMissingGitWarning": true, "git.openRepositoryInParentFolders": "never", "github.copilot.chat.agent.thinkingTool": true, "github.copilot.chat.languageContext.typescript.enabled": true, "github.copilot.chat.newWorkspaceCreation.enabled": true, "github.copilot.chat.editor.temporalContext.enabled": true, "terminal.integrated.defaultProfile.windows": "Windows PowerShell", "editor.formatOnSave": true, "python.analysis.typeCheckingMode": "strict", "chat.editing.confirmEditRequestRetry": false, "github.copilot.chat.agent.toolValidation": "strict", "github.copilot.codeQualityScan.enabled": true, "chat.mcp.discovery.enabled": true, "[markdown]": { "editor.defaultFormatter": "DavidAnson.vscode-markdownlint" }, "explorer.confirmDelete": false, "files.autoSave": "afterDelay", "geminicodeassist.project": "noble-subset-466101-u9", "IntelligentCodeCompletion.disableLanguages": { "vue": "false", "typescript": "false", "javascript": "false", "python": "false", "go": "false", "c": "false", "c++": "false", "shell": "false", "bash": "false", "batch": "false", "lua": "false", "java": "false", "php": "false", "ruby": "false" }, "FunctionQuickCommands.disableLanguages": { "typescript": "false", "javascript": "false", "python": "false", "go": "false", "c": "false", "c++": "false", "lua": "false", "java": "false", "php": "false", "ruby": "false" }, "IntelligentCodeCompletion.enabled": true, "zgsm.allowedCommands": [ "npm test", "npm install", "tsc", "git log", "git diff", "git show" ], "github.copilot.nextEditSuggestions.enabled": true, "[python]": { "diffEditor.ignoreTrimWhitespace": false, "editor.defaultColorDecorators": "never", "gitlens.codeLens.symbolScopes": [ "!Module" ], "editor.formatOnType": true, "editor.wordBasedSuggestions": "off" }, "terminal.integrated.splitCwd": "workspaceRoot", "code-runner.executorMapByFileExtension": { ".vb": "cd $dir && vbc /nologo $fileName && $dir$fileNameWithoutExt", ".vbs": "cscript //Nologo", ".scala": "scala", ".jl": "julia", ".cr": "crystal", ".ml": "ocaml", ".zig": "zig run", ".exs": "elixir", ".hx": "haxe --cwd $dirWithoutTrailingSlash --run $fileNameWithoutExt", ".rkt": "racket", ".scm": "csi -script", ".ahk": "autohotkey", ".au3": "autoit3", ".kt": "cd $dir && kotlinc $fileName -include-runtime -d $fileNameWithoutExt.jar && java -jar $fileNameWithoutExt.jar", ".kts": "kotlinc -script", ".dart": "dart", ".pas": "cd $dir && fpc $fileName && $dir$fileNameWithoutExt", ".pp": "cd $dir && fpc $fileName && $dir$fileNameWithoutExt", ".d": "cd $dir && dmd $fileName && $dir$fileNameWithoutExt", ".hs": "runhaskell", ".nim": "nim compile --verbosity:0 --hints:off --run", ".csproj": "dotnet run --project", ".fsproj": "dotnet run --project", ".lisp": "sbcl --script", ".kit": "kitc --run", ".v": "v run", ".vsh": "v run", ".sass": "sass --style expanded", ".cu": "cd $dir && nvcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt", ".ring": "ring", ".sml": "cd $dir && sml $fileName", ".mojo": "mojo run", ".erl": "escript", ".spwn": "spwn build", ".pkl": "cd $dir && pkl eval -f yaml $fileName -o $fileNameWithoutExt.yaml", ".gleam": "gleam run -m $fileNameWithoutExt" }, "code-runner.saveAllFilesBeforeRun": true, "code-runner.saveFileBeforeRun": true, "code-runner.languageIdToFileExtensionMap": { "bat": ".bat", "powershell": ".ps1", "typescript": ".ts" }, "code-runner.terminalRoot": "'/mnt/", } 检查是哪个设置出了问题使得coderunner持续的使用unix风格命令
07-20
"Mstar Bin Tool"是一款专门针对Mstar系列芯片开发的固件处理软件,主要用于智能电视及相关电子设备的系统维护与深度定制。该工具包特别标注了"LETV USB SCRIPT"模块,表明其对乐视品牌设备具有兼容性,能够通过USB通信协议执行固件读写操作。作为一款专业的固件编辑器,它允许技术人员对Mstar芯片的底层二进制文件进行解析、修改与重构,从而实现系统功能的调整、性能优化或故障修复。 工具包中的核心组件包括固件编译环境、设备通信脚本、操作界面及技术文档等。其中"letv_usb_script"是一套针对乐视设备的自动化操作程序,可指导用户完成固件烧录全过程。而"mstar_bin"模块则专门处理芯片的二进制数据文件,支持固件版本的升级、降级或个性化定制。工具采用7-Zip压缩格式封装,用户需先使用解压软件提取文件内容。 操作前需确认目标设备采用Mstar芯片架构并具备完好的USB接口。建议预先备份设备原始固件作为恢复保障。通过编辑器修改固件参数时,可调整系统配置、增删功能模块或修复已知缺陷。执行刷机操作时需严格遵循脚本指示的步骤顺序,保持设备供电稳定,避免中断导致硬件损坏。该工具适用于具备嵌入式系统知识的开发人员或高级用户,在进行设备定制化开发、系统调试或维护修复时使用。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值