精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一個 Dubbo Triple 協議的 "Bug"

開發 前端
在使用 Dubbo-go 客戶端調用 Dubbo-java 服務時,發現通過 context 設置的 attachment 中,"remote.application" 鍵值對在服務端無法獲取,而 "remote.application1" 和 "remote.application2" 可以正常獲取。

問題描述

近期涂鴉智能的筒子反饋:dubbogo 客戶端使用 Triple 協議發往 dubbo (Java) 服務端的某些 attachment 會發送丟失現象,并報了 issue:

https://github.com/apache/dubbo-go/issues/2752

問題簡述:服務端無法從附件中獲取鍵名為 remote.application 的值。

具體來說,在使用 Dubbo-go 客戶端調用 Dubbo-java 服務時,發現通過 context 設置的 attachment 中,"remote.application" 鍵值對在服務端無法獲取,而 "remote.application1" 和 "remote.application2" 可以正常獲取。

這里先給出結論:這不是一個 bug,之所以 attachment 中 key 為 "remote.application" 的 item 在 dubbo server 端被過濾掉,是因為該 key 是 dubbo(Java) attachment 中的保留字段,不允許用戶使用。

下面給出問題復現,以及問題分析過程。

環境準備

  • 服務端:Dubbo-Java v3.3.0
  • 客戶端:Dubbo-go v3.2.0-rc2
  • 協議:triple
  • 注冊中心:Zookeeper

參考:https://github.com/apache/dubbo-go-samples

  • 代碼:Dubbo java and go interoperability, protobuf and triple protocol
  • 文檔:基于 protobuf 實現 triple 協議互通(適用于兩邊都用 protobuf 開發的場景)

Client 端

先下載 dubbo-go-samples 工程,在工程根目錄下執行如下命令,以更新 dubbo-go-sample 依賴的 dubbogo 版本。

$ go get dubbo.apache.org/dubbo-go/v3@v3.2.0-rc2

java_interop/protobuf-triple/go/go-client/cmd/client.go:

package main


import (
	"context"
	"dubbo.apache.org/dubbo-go/v3/client"
	"dubbo.apache.org/dubbo-go/v3/common/constant"
	_ "dubbo.apache.org/dubbo-go/v3/imports"
	greet "github.com/apache/dubbo-go-samples/java_interop/protobuf-triple/go/proto"
	"github.com/dubbogo/gost/log/logger"
)
func main() {
	cli, err := client.NewClient(
		client.WithClientURL("127.0.0.1:50052"),
	)
	if err != nil {
		panic(err) // If there's an error, it's handled immediately by panicking.
	}
	svc, err := greet.NewGreeter(cli)
	if err != nil {
		panic(err) // Same here, handle the error immediately.
	}
	ctx := context.Background()
	ctx = context.WithValue(ctx, constant.AttachmentKey, map[string]interface{}{
		"remote.application":  "appname",
		"remote.application1": "appname",
		"remote.application2": "appname",
	})
	resp, err := svc.SayHello(ctx, &greet.HelloRequest{Name: "hello world"})
	if err != nil {
		logger.Error(err)
		return // Now, we explicitly handle the error by logging it and then returning from the function.
	}
	logger.Infof("Greet response: %s", resp.Message)
}

Server 端

java_interop/protobuf-triple/java/java-server/pom.xml:

<properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <dubbo.version>3.3.0</dubbo.version>
</properties>

java_interop/protobuf-triple/java/java-server/src/main/java/org/apache/dubbo/sample/GreeterImpl.java:

package org.apache.dubbo.sample;
import com.alibaba.fastjson2.JSON;
import org.apache.dubbo.rpc.RpcContext;

import java.util.Map;

public class GreeterImpl extends DubboGreeterTriple.GreeterImplBase {
    @Override
    public HelloReply sayHello(HelloRequest request) {
        Map<String, Object> serverAttachments = RpcContext.getServerAttachment().getObjectAttachments();
        System.out.println("ContextService serverAttachments:" + JSON.toJSONString(serverAttachments));
        return HelloReply.newBuilder()
                .setMessage(request.getName())
                .build();
    }
}

運行

Go client 調用 java server

  • java-server 目錄中:
$ ./run.sh
...
Dubbo triple java server started
  • go-client 目錄中:
$ go run cmd/client.go
  • 結果輸出

服務端:

2月 12, 2025 6:26:30 下午 org.apache.dubbo.common.logger.jdk.JdkLogger info
信息:  [DUBBO] The connection [id: 0x156ed855, L:/127.0.0.1:50052 - R:/127.0.0.1:56961] of 127.0.0.1:56961 -> 127.0.0.1:50052 is established., dubbo version: 3.3.0, current host: 10.60.200.103
ContextService serverAttachments:{"retries":"","remote.application1":"appname","remote.application2":"appname"}
2月 12, 2025 6:26:30 下午 org.apache.dubbo.common.logger.jdk.JdkLogger info
信息:  [DUBBO] The connection [id: 0x156ed855, L:/127.0.0.1:50052 ! R:/127.0.0.1:56961] of 127.0.0.1:56961 -> 127.0.0.1:50052 is disconnected., dubbo version: 3.3.0, current host: 10.60.200.103
2月 12, 2025 6:26:30 下午 org.apache.dubbo.common.logger.jdk.JdkLogger warn
警告:  [DUBBO] All clients has disconnected from /127.0.0.1:50052. You can graceful shutdown now., dubbo version: 3.3.0, current host: 10.60.200.103, error code: 99-0. This may be caused by unknown error in remoting module, go to https://dubbo.apache.org/faq/99/0 to find instructions. 
2月 12, 2025 6:26:30 下午 org.apache.dubbo.common.logger.jdk.JdkLogger info
信息:  [DUBBO] The connection [id: 0x156ed855, L:/127.0.0.1:50052 ! R:/127.0.0.1:56961] of 127.0.0.1:56961 -> 127.0.0.1:50052 is disconnected., dubbo version: 3.3.0, current host: 10.60.200.103

客戶端:

2025-02-12 18:26:29	INFO	logger/logging.go:42	URL specified explicitly 127.0.0.1:50052
2025-02-12 18:26:30	INFO	logger/logging.go:42	[TRIPLE Protocol] Refer service: tri://127.0.0.1:50052/org.apache.dubbo.sample.Greeter?app.version=&application=dubbo.io&async=false&bean.name=org.apache.dubbo.sample.Greeter&cluster=failover&config.tracing=&environment=&generic=&group=&interface=org.apache.dubbo.sample.Greeter&loadbalance=&metadata-type=local&module=sample&name=dubbo.io&organization=dubbo-go&owner=dubbo-go&peer=true&provided-by=&reference.filter=cshutdown?istry.role=0&release=dubbo-golang-3.2.0&remote.timestamp=&retries=&serialization=protobuf&side=consumer&sticky=false×tamp=1739355989&version=
2025-02-12 18:26:30	INFO	logger/logging.go:42	Greet response: hello world

注意到 java-server 無法從 go-server 傳遞的 attachment 獲取 "remote.application" 鍵。

問題分析

在這個場景中涉及到 ClientAttachment 和 ServerAttachment:

  • ClientAttachmen:Go 客戶端寫入參數
  • ServerAttachment:Java 服務端讀取參數

調用流程:

  • client 端:Method Invoke 發起調用 $\rightarrow$ 寫入 RpcClientAttachment $\rightarrow$ 封裝進 Invocation $\rightarrow$ 序列化傳輸
  • server 端:解析 Invocation $\rightarrow$ 生成 Method Invoke 參數和 RpcServerAttachment $\rightarrow$ 真實調用

$\rightarrow$ 處理后生成 Result(包含 Response 和 Context)$\rightarrow$ 序列化返回。

參考 官方文檔:

圖片

Triple 協議會將 attachment 轉換為 HTTP header 傳輸,使用 Wireshark 抓包分析,確認 "remote.application" 確實被正確封裝在 HTTP header 中,說明 Go 客戶端的 ClientAttachment → Invocation → 網絡傳輸鏈路是正常的。

關注 Java 服務端的 org.apache.dubbo.rpc.protocol.tri.h12.AbstractServerTransportListener 服務端是請求處理的核心類,負責接收和處理 HTTP 請求,并構建 RPC 調用對象。

// AbstractServerTransportListener.java
protected RpcInvocation buildRpcInvocation(RpcInvocationBuildContext context) {
    // ...
    // 關鍵轉換點:將 HTTP Header 轉為 RPC Attachment
    inv.setObjectAttachments(StreamUtils.toAttachments(httpMetadata.headers()));
    // ...
}

調用 StreamUtils.toAttachments() 之前,Header 中是包含 "remote.application" 的。

調用 StreamUtils.toAttachments() 之后,RpcInvocation 類型對象 inv 的成員變量 Map<String,Object>attachments 不包含 "remote.application"。

StreamUtils#toAttachments(HttpHeaders headers):

/**
 * Parse and convert headers to attachments. Ignore Http2 PseudoHeaderName and internal name
 *
 * @param headers the headers
 * @return the attachments
 */
public static Map<String, Object> toAttachments(HttpHeaders headers) {
    if (headers == null) {
        return Collections.emptyMap();
    }
    Map<String, Object> attachments = CollectionUtils.newHashMap(headers.size());
    for (Map.Entry<CharSequence, String> entry : headers) {
        String key = entry.getKey().toString();
        String value = entry.getValue();
        int len = key.length() - TripleConstants.HEADER_BIN_SUFFIX.length();
        if (len > 0 && TripleConstants.HEADER_BIN_SUFFIX.equals(key.substring(len))) {
            try {
                putAttachment(attachments, key.substring(0, len), value == null ? null : dec
            } catch (Exception e) {
                LOGGER.error(PROTOCOL_FAILED_PARSE, "", "", "Failed to parse response attach
            }
        } else {
            putAttachment(attachments, key, value);
        }
    }
    // try converting upper key
    String converted = headers.getFirst(TripleHeaderEnum.TRI_HEADER_CONVERT.getKey());
    if (converted == null) {
        return attachments;
    }
    String json = TriRpcStatus.decodeMessage(converted);
    Map<String, String> map = JsonUtils.toJavaObject(json, Map.class);
    for (Map.Entry<String, String> entry : map.entrySet()) {
        String key = entry.getKey();
        Object value = attachments.remove(key);
        if (value != null) {
            putAttachment(attachments, entry.getValue(), value);
        }
    }
    return attachments;
}

StreamUtils#putAttachment(Map<String, Object> attachments, String key, Object value):

圖片

進一步查看 TripleHeaderEnum :

圖片

為了防止業務層誤用或覆蓋這個鍵值,Dubbo 將其加入了排除列表,導致即使在 attachment 中設置了這個鍵值對,在轉換時也會被過濾掉。

責任編輯:姜華 來源: dubbogo示土區
相關推薦

2022-04-06 08:47:03

Dubbo服務協議

2009-09-14 17:08:02

WebFormView

2021-10-08 07:50:57

軟件設計程序

2017-10-10 15:14:23

BUGiOS 11蘋果

2024-09-14 14:14:26

Dubbo框架微服務

2024-04-22 00:00:01

Redis集群

2014-12-17 09:40:22

dockerLinuxPaaS

2022-05-16 08:42:26

Pandasbug

2019-08-01 12:59:21

Bug代碼程序

2022-06-15 08:14:40

Go線程遞歸

2015-08-24 10:07:13

程序員bug

2023-03-13 08:09:03

Protobuffeature分割

2024-08-08 08:09:38

2018-06-19 16:04:27

Dubbo應用Java

2011-03-03 21:04:08

bug程序員

2015-08-19 09:29:35

Git協議編寫

2021-09-11 19:00:54

Intro元素MemoryCache

2017-03-22 09:11:45

bugbug賞金計劃眾包項目

2013-06-18 11:37:42

XFSRHEL 6.4

2019-05-23 09:30:22

網絡框架數據
點贊
收藏

51CTO技術棧公眾號

欧美日韩一区二区视频在线| 欧美精品一区二区免费| 天天干在线影院| 欧美人xxx| 成人动漫在线一区| 国产精品吊钟奶在线| 天天综合天天做| 色婷婷久久久| 91麻豆精品国产91久久久| 国产3p露脸普通话对白| 亚洲成a人v欧美综合天堂麻豆| 国产不卡视频在线播放| 国产成人亚洲综合| 久草视频手机在线观看| 操欧美老女人| 亚洲娇小xxxx欧美娇小| 婷婷激情5月天| 周于希免费高清在线观看| 自拍av一区二区三区| 久久久水蜜桃| 性欧美videos另类hd| 日韩精品91亚洲二区在线观看| 欧美激情啊啊啊| 国产99在线 | 亚洲| 精品深夜福利视频| 欧美一区中文字幕| 天堂网在线免费观看| 亚洲最大网站| 午夜精品成人在线| 成人免费在线视频播放| 日本高清在线观看wwwww色| 99久久99久久精品免费看蜜桃| 91九色精品视频| 奴色虐av一区二区三区| 国产精品一级| 国语自产精品视频在线看抢先版图片 | 久久99九九99精品| 国产精品99久久久久久人| 亚洲国产精品午夜在线观看| 欧美国产高潮xxxx1819| 色偷偷9999www| 九九九视频在线观看| 亚洲综合图色| 精品视频在线播放免| 成年女人免费视频| 超碰地址久久| 精品少妇一区二区三区视频免付费| 天天干天天色天天干| 精品乱码一区二区三区四区| 欧美亚洲综合网| 亚洲黄色a v| 日韩精品99| 在线亚洲人成电影网站色www| 国产日韩一区二区在线| 亚洲精品动漫| 91精品福利在线| 成年人在线观看视频免费| 美女网站视频一区| 日本精品视频一区二区三区| 欧美精品成人网| 婷婷激情一区| 欧美三级资源在线| 中文字幕 日韩 欧美| 免费视频成人| 欧美日韩久久一区| 永久看看免费大片| 国产一区丝袜| 亚洲欧洲偷拍精品| 貂蝉被到爽流白浆在线观看| 亚洲va在线| 欧美华人在线视频| 天堂网一区二区三区| 亚洲欧美清纯在线制服| 国产精品美乳一区二区免费| 亚洲综合精品国产一区二区三区| 狠狠色狠狠色综合系列| 91手机在线观看| 亚洲欧美自偷自拍| 国产欧美日本一区二区三区| 一区二区精品视频| 男男gaygays亚洲| 日韩欧美在线国产| 91高清国产视频| 国产精品视频一| www.国产三级| 国产亚洲欧美色| 青青视频免费在线| 欧美××××黑人××性爽 | 亚洲不卡免费视频| 91小视频免费看| 亚洲欧美日韩综合一区| 欧美四级在线| 欧洲亚洲精品在线| 九色91porny| 国产精品午夜一区二区三区| www.日韩av.com| 亚洲黄色三级视频| 激情图片小说一区| 噜噜噜噜噜久久久久久91| 色大18成网站www在线观看| 亚洲高清不卡在线| 小明看看成人免费视频| 蜜桃久久久久| 久热精品视频在线免费观看| 少妇一级淫片免费放中国 | 精品动漫一区| 国产精品美女免费| 日本高清视频网站| 亚洲色图丝袜美腿| 玩弄japan白嫩少妇hd| 成人爽a毛片免费啪啪红桃视频| 伊人久久男人天堂| 日韩av大片在线观看| 国产剧情av麻豆香蕉精品| 欧美一区观看| www.综合| 欧美精品一区二区三区四区| 少妇视频一区二区| 日韩电影在线免费| 久精品国产欧美| 伊人精品影院| 在线成人av网站| 国产在线免费av| 久久精品一区二区国产| 国产精品免费一区二区三区四区| 美女免费久久| 欧美日韩黄色一区二区| 少妇真人直播免费视频| 影音先锋日韩资源| 91成人伦理在线电影| 天堂中文а√在线| 欧美在线高清视频| 中文幕无线码中文字蜜桃| 日韩视频二区| 国产在线精品二区| 国产精品186在线观看在线播放| 在线播放中文一区| 国产免费一区二区三区四区| 另类小说视频一区二区| 日本一区二区三区免费观看 | 欧美性猛交xxx| 你懂的在线观看网站| 黄色精品免费| 国产成人精品一区二区三区福利| 深夜国产在线播放| 精品久久人人做人人爱| 久久精品国产亚洲AV无码麻豆| 国产丶欧美丶日本不卡视频| 天天想你在线观看完整版电影免费| 一级欧美视频| 米奇精品一区二区三区在线观看| 国产女无套免费视频| 亚洲第一大网站| 免费看的黄色欧美网站| 精品视频导航| 97se综合| 在线色欧美三级视频| 美女黄页在线观看| 中文字幕一区二区三区不卡| 国产乱叫456| 午夜久久黄色| 精品国产一区二区三区四区vr| 操人在线观看| 有码中文亚洲精品| 一级特黄aaa| 一区二区三区鲁丝不卡| 天堂久久久久久| 久久成人精品| 正在播放精油久久| 日韩成人视屏| 69av成年福利视频| 99视频在线观看地址| 欧美日本一道本| 精品无码黑人又粗又大又长| 99久久综合狠狠综合久久| 久久精品午夜福利| 无码一区二区三区视频| 国产精品欧美久久| 欧美精品总汇| 久久精品青青大伊人av| 成人爽a毛片一区二区| 色综合久久综合中文综合网| 在线观看黄网址| 99国产精品99久久久久久| 日本中文字幕高清| 国内精品久久久久久久97牛牛| 久久er99热精品一区二区三区 | 欧美精品国产一区| 国产精品自拍首页| 欧美日韩伦理一区二区| 欧美激情亚洲另类| www.在线播放| 亚洲精品一区二区在线观看| 国产成人自拍偷拍| 亚洲在线视频免费观看| 国产又粗又猛又爽视频| 国产精品一区二区久久精品爱涩| 欧美日韩第二页| 欧美精品97| 日韩三级电影免费观看| 国产精品sss在线观看av| 国产精品影院在线观看| 国产色播av在线| 欧美成人激情视频免费观看| 日本免费不卡| 精品少妇一区二区三区| 在线黄色av网站| 日韩欧美成人免费视频| 久草免费在线观看视频| 国产精品福利电影一区二区三区四区 | 成人污网站在线观看| 精品黄色一级片| 国内精品视频在线播放| 日本免费一区二区视频| 国产精品久久久久久搜索| 看黄在线观看| 久久久久久中文字幕| 日韩大片在线永久免费观看网站| 亚洲精品网址在线观看| 少妇一级淫片免费看| 欧美一区二区三区视频在线观看| 亚洲精品国产无码| 精品福利在线视频| 国产无套内射又大又猛又粗又爽| 亚洲日穴在线视频| 日本裸体美女视频| 国产精品私人自拍| 日本美女xxx| 国产午夜精品一区二区| 久久精品老司机| gogo大胆日本视频一区| 欧美做受高潮中文字幕| 国产精品亚洲午夜一区二区三区| av在线网址导航| 九九**精品视频免费播放| 欧美大尺度做爰床戏| 日韩**一区毛片| 韩国中文字幕av| 男人操女人的视频在线观看欧美| 激情婷婷综合网| 欧美一级二区| 国产成人综合一区| 蜜桃视频一区二区三区| 三级视频中文字幕| 美腿丝袜亚洲一区| 国产福利精品一区二区三区| 精品一区二区精品| 夜夜爽久久精品91| 高清国产一区二区三区| www.美色吧.com| a美女胸又www黄视频久久| 国产黄色三级网站| 久久奇米777| 欧美人妻一区二区三区| 国产欧美精品国产国产专区 | 免费人成黄页在线观看忧物| 亚洲美女av黄| 2019中文字幕在线视频| 久久精品这里热有精品| aaa大片在线观看| 国模极品一区二区三区| 色一区二区三区| 国产精品看片资源| 成人在线啊v| 国产精品jizz视频| 九九久久成人| 在线观看成人av| 亚洲天堂成人| 韩国日本美国免费毛片| 久久av老司机精品网站导航| 欧美熟妇另类久久久久久多毛| 成人一区二区三区在线观看| 影音先锋人妻啪啪av资源网站| 国产午夜一区二区三区| 亚洲综合网在线| 婷婷中文字幕综合| 中文字幕一区二区三区免费看| 日韩一区二区三免费高清| 视频污在线观看| 最好看的2019年中文视频 | 日韩美女视频在线观看| 日韩成人一区| 久久本道综合色狠狠五月| 成人激情免费视频| 国产一级不卡视频| 久久一区视频| 中文字幕一二三区| 国产午夜亚洲精品午夜鲁丝片| 欧美另类videoxo高潮| 欧美日韩国产黄| 国产精品老熟女视频一区二区| 亚洲国产欧美日韩精品| 天天综合视频在线观看| 91av在线免费观看视频| va天堂va亚洲va影视| 精品无码久久久久国产| 天天影视欧美综合在线观看| 久久无码高潮喷水| 国产伦精一区二区三区| 亚洲人成人无码网www国产| 夜夜嗨av一区二区三区网页| 国产免费一级视频| 精品不卡在线视频| 国内外激情在线| 日本不卡高字幕在线2019| 少妇精品在线| 最近中文字幕免费mv| 久久精品盗摄| 久久久久国产精品无码免费看| 日韩理论片网站| 国产又粗又猛又爽又| 亚洲精品720p| 狂野欧美激情性xxxx欧美| 国产一区香蕉久久| 国产亚洲电影| 国产淫片免费看| 成人午夜电影网站| 亚洲欧美一区二区三区四区五区| 欧美色区777第一页| 免费a在线观看| 性欧美在线看片a免费观看| 亚洲视频三区| 中文字幕在线乱| 久久国产精品99精品国产| 在线免费看黄视频| 色又黄又爽网站www久久| 十八禁一区二区三区| 久久久久国产精品www| 日韩精品视频一区二区三区| 亚洲午夜在线观看| 免费不卡在线视频| 美女av免费看| 欧美视频第二页| 岛国大片在线观看| 国产精品爱啪在线线免费观看| 欧美激情网址| 成年人视频观看| 久久久久久99精品| 精品久久久久久久久久久国产字幕| 精品视频中文字幕| 小黄鸭精品aⅴ导航网站入口| 久久精品日韩| 丝袜亚洲另类欧美综合| 中文字幕av网址| 欧美自拍丝袜亚洲| 在线视频1区2区| 成人国产精品一区| 五月天久久网站| 女教师高潮黄又色视频| 亚洲精品欧美二区三区中文字幕| 91丨porny丨在线中文| 久久久精品一区| 日本一区影院| 蜜臀av无码一区二区三区| 91美女片黄在线观看| 国产一级一级国产| 自拍亚洲一区欧美另类| 9.1麻豆精品| av在线com| 26uuu亚洲综合色欧美| 久久久蜜桃一区二区| 北条麻妃在线一区二区| 精品国产亚洲一区二区在线观看 | 国产盗摄一区二区三区在线| 日韩欧美在线影院| 超级白嫩亚洲国产第一| 麻豆一区区三区四区产品精品蜜桃| 玖玖在线精品| 91高清免费看| 亚洲精品福利资源站| 欧洲成人一区| 国产一区 在线播放| 久久久午夜精品| 一级黄色片视频| 欧美精品一区二区免费| 色婷婷狠狠五月综合天色拍| www.亚洲高清| 亚洲电影中文字幕在线观看| 日本一区视频| 亚洲一区久久久| 性色一区二区三区| 欧美日韩色视频| 精品网站999www| 四虎在线精品| 97国产精东麻豆人妻电影| 国产精品每日更新在线播放网址| www.亚洲欧美| 国产成人免费av电影| 亚洲综合婷婷| 色一情一交一乱一区二区三区 | 国产精品一区二区三区免费视频| 综合天堂av久久久久久久| 中文字幕丰满乱子伦无码专区| 9191久久久久久久久久久| 性感女国产在线| 五月天激情图片| 国产精品天美传媒沈樵| 日本成人动漫在线观看| 亚洲va男人天堂| 肉丝袜脚交视频一区二区|