<!-- If you need to report a security issue please visit https://github.com/apache/dubbo/security/policy -->

- [ ] I have searched the [issues](https://github.com/apache/dubbo/issues) of this repository and believe that this is not a duplicate.

### Environment

* Dubbo version: 3.1.4 
* Java version: 1.8

**我这里使用的是3.1.4版本，但是反馈的问题根据[Issue10761](https://github.com/apache/dubbo/pull/10761)描述已经在3.1.2版本修复**

### Steps to reproduce this issue

[复现此问题的demo](https://github.com/YuWan1117/dubbo-demo/tree/ft-upperAttachment)

1. 切到`github`的`dubbo-demo`项目的`ft-upperAttachment`分支
2. 启动`hello-service`（provider）
3. 启动`hello-admin` （consumer）
4. 请求`http://127.0.0.1:9321/`观察服务日志
#### Question Description
发起请求时，`hello-admin`通过`consumerFilter`向`attachment`中写入`header`信息`TestKey`对应的值为`TestValue`，观察`hello-service`日志通过`attachment`获取`TestKey`为`null`，获取`testkey`为`TestValue`。

### Code Reference
> consumerFilter
```
@Slf4j
@Activate(group = CommonConstants.CONSUMER)
public class ConsumerFilter implements Filter {

    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        RpcContext.getClientAttachment().setAttachment("TestKey", "TestValue");
        log.info("ConsumerFilter, TestKey=TestValue");
        return invoker.invoke(invocation);
    }
}
```
> hello-service log
```
log.info("call sayHello function, TestKey={} testkey={}",
                RpcContext.getServerAttachment().getAttachment("TestKey"),  
                RpcContext.getServerAttachment().getAttachment("testkey")); 
```

### Expected Behavior

<!-- What do you expect from the above steps？-->
期望`RpcContext.getServerAttachment().getAttachment("TestKey")`输出`TestValue`

### Actual Behavior

<!-- What actually happens? -->
实际`RpcContext.getServerAttachment().getAttachment("TestKey")`输出`null`，通过`RpcContext.getServerAttachment().getAttachment("testkey")`输出`TestValue`

### 最后
辛苦社区同学解答我的疑问，是3.1.2版本没有成功修复还是我这里的理解/使用方式存在问题。感谢

### Reference
[dubbo-3.1.2 release](https://github.com/apache/dubbo/releases/tag/dubbo-3.1.2)
[Issue 10761 ](https://github.com/apache/dubbo/pull/10761)

Map<String, Object> requestMetadata = headersToMap(headers);
            boolean hasStub = pathResolver.hasNativeStub(path);
            if (hasStub) {
                listener = new StubAbstractServerCall(invoker, TripleServerStream.this,
                    frameworkModel,
                    acceptEncoding, serviceName, originalMethodName, executor);
            } else {
                listener = new ReflectionAbstractServerCall(invoker, TripleServerStream.this,
                    frameworkModel, acceptEncoding, serviceName, originalMethodName, filters,
                    executor);
            }
            
            deframer = new TriDecoder(deCompressor, new ServerDecoderListener(listener));
            listener.onHeader(requestMetadata);
        }
        @Override
        public void onData(ByteBuf data, boolean endStream) {
            executor.execute(() -> doOnData(data, endStream));
        }
        private void doOnData(ByteBuf data, boolean endStream) {
            if (deframer == null) {
                return;
            }
            deframer.deframe(data);
            if (endStream) {
                deframer.close();
            }
        }
        @Override
        public void cancelByRemote(long errorCode) {