开发者社区> 问答> 正文

什么是代理网关客户端?

什么是代理网关客户端?

展开
收起
商陆呀 2022-05-09 21:29:35 661 0
1 条回答
写回答
取消 提交回答
  • 代理网关服务端需要连接远程服务,进入代理网关客户端部分。 代理网关客户端初始化:

    /**
    * 初始化远程连接
    * @param ctx
    * @param httpRequest
    */
    protected void connectRemote(ChannelHandlerContext ctx, FullHttpRequest httpRequest) {
    Bootstrap b = new Bootstrap();
    b.group(ctx.channel().eventLoop()) // use the same EventLoop
    .channel(ctx.channel().getClass())
    .handler(new ClientChannelInitializer(auditProxyConfig, ctx, safeCopy(httpRequest)));
    // 动态连接代理
    FullHttpRequest originRequest = ctx.channel().attr(CONNECT_REQUEST).get();
    if (originRequest == null) {
    originRequest = httpRequest;
    }
    ChannelFuture cf = b.connect(new InetSocketAddress(calculateHost(originRequest), calculatePort(originRequest)));
    Channel cch = cf.channel();
    ctx.channel().attr(CLIENT_CHANNEL).set(cch);    
    }
    

    以上: 1. 复用代理网关服务端的workerGroup线程组; 2. 请求和结果的处理封装在ClientChannelInitializer; 3. 连接的远程服务端的HOST和PORT在服务端收到的请求中可以解析到。

    代理网关客户端的处理器的初始化逻辑:

    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
    SocketAddress socketAddress = calculateProxy();
    if (!Objects.isNull(socketAddress)) {
    ch.pipeline().addLast(new HttpProxyHandler(calculateProxy(), auditProxyConfig.getUserName(), auditProxyConfig
    .getPassword()));
    }
    if (isSslRequest()) {
    String host = host();
    int port = port();
    if (StringUtils.isNoneBlank(host) && port > 0) {
    ch.pipeline().addLast(new SslHandler(sslEngine(host, port)));
    }
    }
    ch.pipeline().addLast(new ClientChannelHandler(clientContext, httpRequest));
    }
    

    以上: 1. 如果下游是代理,那么会采用HttpProxyHandler,经由下游代理与远程服务端通信; 2. 如果当前需要升级为SSL协议,会对SocketChannel做透明的封装,实现SSL通信。 3. 最后,ClientChannelHandler只是简单消息的转发;唯一的不同是,由于代理网关拦截了第一个请求,此时需要将拦截的请求,转发到服务端。

    2022-05-10 18:55:54
    赞同 展开评论 打赏
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
阿里云容器 AHAS Sentinel 网关流控揭秘 立即下载
阿里Tengine网关最佳实践 立即下载
《MSE 微服务网关》 立即下载