[apache/dubbo]为什么两次同样的请求,协议却不一样

2023-12-20 15 views
3
环境:
jdk:19
dubbo:3.2.0.beta-5
springboot: 3.0.4
这是我的dubbo过滤器
@Activate(group = CommonConstants.CONSUMER, value = "cookieValidationFilter")
public class CookieValidationFilter implements Filter {
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        RpcContext context = RpcContext.getServerContext();
        return invoker.invoke(invocation);
    }
}
这是我的controller:
@DubboReference
UserService userService;

@PostMapping(value = "/sign_in", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public ServerResponseEntity<Object> loginController(ServerHttpRequest serverHttpRequest) {
    RpcContext context = RpcContext.getServerContext();
    System.out.println("rest接口");
    System.out.println(context.getProtocol());
    System.out.println(context.getRemoteAddressString());
    System.out.println("-----------------------------------------");
    String userInfo = serverHttpRequest.getHeaders().getFirst(USERINFO);
    return userService.loginService(userInfo);
}
这是我的service:
@Override
public ServerResponseEntity<Object> loginService(String userInfo) {
    try {
        responseEntity = new ServerResponseEntity<>(0, "login success!", Decryptor.decrypt(userInfo));
    } catch (Exception e) {
        logger.info(e.toString());
    }
    return responseEntity;
}
这是我的consumer配置文件:
server.port=8081

spring.application.name=consumer
spring.cloud.nacos.discovery.server-addr=192.168.220.128:8848

dubbo.application.name=consumer
dubbo.registry.address=nacos://192.168.220.128:8848
dubbo.protocol.port=-1
dubbo.consumer.protocol=tri
dubbo.consumer.filter=appended
dubbo.application.qos-port=22223
这是打印结果:
这是客户端连续两次调用/sign_in的打印结果
rest接口
null
null:0
-----------------------------------------
rest接口
tri
null:0
-----------------------------------------

问:为什么前后两次协议打印结果不一样,第一次null,第二次是tri

回答

1

image 貌似并没有复现这个问题呢

1

你好,你的第一个打印rest接口下面不就是null吗,第一次的,后面才打印的是consumer 我的问题就是为什么第一次打印的是null

2

因为这个protocol是从consumerUrl里取的,当没有进行远程调用时,consumerUrl不会进行设置,所以第一次getServerContext取到的protocol为空。你可以这样调整下顺序,第一次就不为空了:

userService.loginService(userInfo)
RpcContext context = RpcContext.getServerContext();
System.out.println("rest接口");
System.out.println(context.getProtocol());
System.out.println(context.getRemoteAddressString());
System.out.println("-----------------------------------------");
String userInfo = serverHttpRequest.getHeaders().getFirst(USERINFO);
return userService.loginService(userInfo);