精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产91视觉| 久久精品国产电影| 精品久久久久久久免费人妻| 黄色片视频在线观看| 久久精品72免费观看| 九九热这里只有在线精品视| 亚洲中文字幕无码av| 伊人久久高清| 亚洲一区二区av电影| 欧美另类视频在线| 99热这里只有精品5| 99亚洲精品| 久久久精品网站| wwwwww日本| 日本免费一区二区三区视频| 色天使色偷偷av一区二区| 国产精品12p| 久久视频www| 国产黄色精品视频| 国产精品丝袜一区二区三区| 日韩av免费网址| 欧美肥老太太性生活| 精品呦交小u女在线| 欧美一区二区三区影院| 国产69精品久久久久9999人| 疯狂做受xxxx欧美肥白少妇| 好色先生视频污| 精品三级久久久久久久电影聊斋| 国产91丝袜在线播放| 国产精品嫩草视频| 亚洲欧美精品一区二区三区| 欧美日韩综合| 久久精品91久久香蕉加勒比| 亚洲AV无码成人精品区明星换面| 欧美黑白配在线| 日韩三级在线免费观看| 在线观看免费的av| 日本精品网站| 黑人巨大精品欧美一区免费视频 | 国产精品热久久| 午夜一区二区三区不卡视频| 欧美极品少妇xxxxⅹ裸体艺术 | 99精品在线观看| 国产亚洲精品91在线| 捆绑凌虐一区二区三区| 97青娱国产盛宴精品视频| 91精品国产综合久久久久久久 | 九七电影院97理论片久久tvb| 欧美性xxxx极品hd欧美风情| 免费无码不卡视频在线观看| 黄页网站在线| 亚洲国产美女搞黄色| 永久免费在线看片视频| 黄网站在线免费看| 亚洲欧美国产三级| 国产一二三四五| 精品视频在线一区二区| 亚洲天堂网中文字| 2025韩国大尺度电影| 男人天堂久久久| 中文字幕欧美一| 在线观看成人av电影| 日本三级视频在线播放| 亚洲欧洲国产日本综合| 综合国产精品久久久| 日本高清在线观看wwwww色| 国产人妖乱国产精品人妖| 亚洲人体一区| 国产丝袜在线| 亚洲动漫第一页| 日韩免费一级视频| 五月激情久久| 欧美放荡的少妇| 色婷婷狠狠18禁久久| 欧美大胆a级| 在线日韩日本国产亚洲| 亚洲熟女少妇一区二区| 欧美日韩91| 2023亚洲男人天堂| 久草热在线观看| 国产乱码精品一区二区三区av| 99精品国产高清在线观看| 欧美77777| 久久久精品国产免费观看同学| 午夜精品区一区二区三| bt在线麻豆视频| 黑人巨大精品欧美一区二区一视频| 中文久久久久久| 伊人久久亚洲| 亚洲日本欧美日韩高观看| 免费黄色国产视频| 一道本一区二区| 成人免费淫片视频软件| 日韩在线观看视频网站| 亚洲国产精品高清| www.好吊操| 欧美va在线观看| 欧美一区二区三区成人| 久久精品国产亚洲av久| 午夜国产一区二区| 26uuu亚洲国产精品| 一级黄色大毛片| 91在线国产观看| 懂色av一区二区三区四区五区| 日本午夜大片a在线观看| 欧美日韩性生活| 国产女人18毛片水真多18| 日韩精品一区二区久久| 久久久综合av| 国产一区二区在线播放视频| 91尤物视频在线观看| 一区中文字幕在线观看| 亚洲成av在线| 日韩高清av在线| 免费一级片视频| 免费视频最近日韩| 欧美大陆一区二区| 菠萝蜜视频在线观看www入口| 欧美日韩精品是欧美日韩精品| 女同性恋一区二区三区| 综合激情一区| 成人国产精品久久久| 国产永久免费高清在线观看| 亚洲va欧美va人人爽| 激情久久综合网| 欧美视频免费| 日本中文字幕成人| 男人天堂av网| 亚洲综合男人的天堂| www午夜视频| 欧美日韩国产免费观看视频| 欧美有码在线观看视频| 黑人乱码一区二区三区av| 日韩美女啊v在线免费观看| 看欧美ab黄色大片视频免费| 亚洲黄页网站| 欧美有码在线视频| 四虎成人免费在线| 偷窥少妇高潮呻吟av久久免费| 欧美午夜精品一区二区| 欧美国产精品| 亚洲在线www| 国产激情在线视频| 91精品国产综合久久精品麻豆| 任我爽在线视频| 美女在线视频一区| 一区二区三区免费看| 成人在线观看免费视频| 中文字幕亚洲欧美日韩2019| 正在播放木下凛凛xv99| 中文字幕av不卡| 九九九九九国产| 欧美电影免费观看高清| 91精品视频在线看| 日本在线观看大片免费视频| 精品国产污网站| 国产真实乱人偷精品视频| 成人福利视频网站| 日本wwww视频| 成人3d动漫在线观看| 国产欧美一区二区| av电影免费在线观看| 日韩欧美你懂的| 日韩欧美三级在线观看| 91麻豆精东视频| 亚洲视频在线a| 97视频精品| 不卡视频一区二区| 国产在线天堂www网在线观看| 日韩精品视频免费| 中文字幕一区二区三区四区视频 | 亚洲精品美女在线观看播放| 久久久久久久黄色片| 久久蜜桃一区二区| 向日葵污视频在线观看| 欧美在线亚洲| 精品一区二区久久久久久久网站| 中文字幕一区久| 最新亚洲国产精品| 亚洲国产精品一| 欧美日韩在线第一页| 最新日韩免费视频| 国产精品综合视频| 浮妇高潮喷白浆视频| 日韩在线中文| 国产精品传媒毛片三区| 三上悠亚亚洲一区| 久久久精品一区二区| 免费成人在线看| 在线亚洲一区二区| 99精品久久久久| 久久婷婷国产综合精品青草| 九九热精品国产| 99国产精品自拍| 亚洲自拍偷拍二区| 久久99国产精品久久99大师| 国产精品免费一区| 岛国av在线播放| www.欧美免费| 青青青手机在线视频观看| 5566中文字幕一区二区电影| 欧美成人精品欧美一级乱黄| 亚洲欧洲性图库| 蜜桃传媒一区二区亚洲av| 国产一区二区三区av电影| 国产在线观看福利| 中文字幕一区二区av| 日本一区二区高清视频| 东京久久高清| 国产综合色香蕉精品| 免费电影日韩网站| 国内精品在线一区| av网址在线| 中文字幕亚洲无线码a| 特黄aaaaaaaaa真人毛片| 7777精品伊人久久久大香线蕉完整版 | 九色91porny| 蜜臀va亚洲va欧美va天堂| 国产人妻777人伦精品hd| 亚洲欧美网站在线观看| 人禽交欧美网站免费| 波多野结衣欧美| 亚洲一区制服诱惑| 欧洲精品久久久久毛片完整版| 清纯唯美亚洲综合| 国产盗摄精品一区二区酒店| 蜜臀久久99精品久久久久久宅男| av中文在线| 亚洲欧美日韩一区在线| 日韩在线视频观看免费| 日韩欧美成人一区二区| 国产又粗又猛又黄又爽无遮挡| 欧美色图在线观看| 波多野结衣在线电影| 欧美性猛交xxxx乱大交蜜桃 | 99精品国产在热久久婷婷| 真人做人试看60分钟免费| 国产精品久久天天影视| 亚洲欧美综合一区| 日韩黄色大片网站| 午夜欧美一区二区三区免费观看| 久久超碰99| 日本高清一区| 欧洲杯足球赛直播| 日本成人黄色| 青青草综合网| 亚洲欧洲一区二区在线观看| 成人直播大秀| 亚洲在线欧美| 自拍偷拍欧美专区| 日韩亚洲欧美视频| 国产精品色网| 欧美精品一区二区三区免费播放| 先锋影音久久| 无码人妻丰满熟妇区毛片| 久久亚洲欧美| 中文字幕网av| 激情欧美一区二区三区在线观看| 久久精品视频在线观看免费| 国产在线精品一区二区| 欧美性猛交xx| 本田岬高潮一区二区三区| 自拍视频一区二区| 久久久国际精品| 99在线视频免费| 亚洲欧美自拍偷拍| 美女毛片在线观看| 五月婷婷综合激情| 91精品国产综合久久久蜜臀九色| 欧美亚洲国产一区在线观看网站| 天天干天天插天天射| 欧美人与禽zozo性伦| 精品国产18久久久久久| 亚洲成av人乱码色午夜| 青青视频在线观| 久久精品一区中文字幕| av资源在线看片| 国产高清在线不卡| 亚洲一区二区av| 国产一区二区三区四区五区在线 | 亚洲欧美国产精品专区久久| 成年午夜在线| 欧美激情综合亚洲一二区| 超碰一区二区| 91久久国产婷婷一区二区| 国产三级精品三级在线观看国产| 欧美日韩无遮挡| 欧美成人中文| 日韩黄色片视频| 国产在线播精品第三| 亚洲天堂成人av| 18成人在线观看| 欧美日韩精品区| 91精品国产欧美一区二区18| 在线观看xxx| 美女av一区二区三区 | 91ph在线| 2019中文字幕在线免费观看| 国产精品亚洲欧美日韩一区在线 | 亚洲福利视频三区| 伊人久久亚洲综合| 亚洲激情视频网| av在线free| 国产精品美女视频网站| 狼人精品一区二区三区在线| 亚洲一区二区三区在线观看视频| 日韩午夜av在线| 亚洲网中文字幕| 久久精品免费在线观看| 久久久国产成人| 欧美精品在欧美一区二区少妇| 无码国产精品96久久久久| 久久99久久99精品免观看粉嫩| 在线免费一区| 欧美另类女人| 四季av一区二区三区| 91视频免费播放| 久久99久久98精品免观看软件| 欧美日韩一区 二区 三区 久久精品| 免费观看国产视频| 操91在线视频| 天堂综合在线播放| 日韩欧美第二区在线观看| 亚洲永久网站| 男人网站在线观看| 亚洲免费av网站| 国产又粗又猛又黄又爽无遮挡| 一区二区三区精品99久久| 小早川怜子影音先锋在线观看| 俄罗斯精品一区二区三区| 66视频精品| 99精品999| 国产精品久久久久久户外露出| 在线永久看片免费的视频| 日韩精品视频三区| 小早川怜子影音先锋在线观看| 国产伦理久久久| 欧美午夜不卡| 亚洲欧美日韩中文字幕在线观看| 国产精品盗摄一区二区三区| 亚洲最大成人在线视频| 最近2019免费中文字幕视频三| 欧美free嫩15| 午夜欧美性电影| 久久99精品久久只有精品| 九九九视频在线观看| 欧美视频在线播放| av在线之家电影网站| 国产日韩换脸av一区在线观看| 欧美高清视频在线观看mv| 手机版av在线| 亚洲三级在线观看| www.四虎在线观看| 欧美精品久久久久久久免费观看 | 亚洲国产精品成人精品 | 国产精品一区二区三区久久久 | 91美女蜜桃在线| 91丝袜一区二区三区| 亚洲色图美腿丝袜| www.国产精品| 亚洲一卡二卡三卡| 国内精品写真在线观看| 欧美黄片一区二区三区| 亚洲精品在线一区二区| 欧美在线极品| 神马影院我不卡| 国产一区二区在线看| 亚洲国产精品午夜在线观看| 日韩精品日韩在线观看| 日本黄色一区| 青青草视频在线视频| 91麻豆蜜桃一区二区三区| 中文亚洲av片在线观看| 久久久精品美女| 免费日韩一区二区三区 | 国产69精品一区二区亚洲孕妇| 日本少妇性高潮| 在线观看视频99| 亚洲性视频在线| 欧美 国产 小说 另类| 亚洲欧洲日韩在线| 色婷婷在线视频| 国产精品综合久久久| 一区二区亚洲精品| 少妇一级黄色片| 亚洲国产精品女人久久久| 岛国精品在线| 黄色国产一级视频| 最近日韩中文字幕| 污污网站在线免费观看| 91精品国产自产在线老师啪 | av伊人久久| 中文字幕在线国产| 欧美日韩在线播放一区| 8x8ⅹ拨牐拨牐拨牐在线观看| 性欧美videosex高清少妇| 成人天堂资源www在线| 最新中文字幕第一页| 久久久久久国产精品久久| 日本一区二区三区视频|