1 /* 2 * Copyright 2016 The gRPC Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package io.grpc.netty; 18 19 import com.google.common.annotations.VisibleForTesting; 20 import io.grpc.Internal; 21 import io.grpc.internal.ClientTransportFactory; 22 import io.grpc.internal.GrpcUtil; 23 import io.grpc.internal.SharedResourcePool; 24 import io.grpc.internal.TransportTracer; 25 import io.netty.channel.socket.nio.NioSocketChannel; 26 27 /** 28 * Internal {@link NettyChannelBuilder} accessor. This is intended for usage internal to the gRPC 29 * team. If you *really* think you need to use this, contact the gRPC team first. 30 */ 31 @Internal 32 public final class InternalNettyChannelBuilder { 33 disableCheckAuthority(NettyChannelBuilder builder)34 public static void disableCheckAuthority(NettyChannelBuilder builder) { 35 builder.disableCheckAuthority(); 36 } 37 enableCheckAuthority(NettyChannelBuilder builder)38 public static void enableCheckAuthority(NettyChannelBuilder builder) { 39 builder.enableCheckAuthority(); 40 } 41 42 /** A class that provides a Netty handler to control protocol negotiation. */ 43 public interface ProtocolNegotiatorFactory { buildProtocolNegotiator()44 InternalProtocolNegotiator.ProtocolNegotiator buildProtocolNegotiator(); 45 } 46 47 /** 48 * Sets the {@link ProtocolNegotiatorFactory} to be used. Overrides any specified negotiation type 49 * and {@code SslContext}. 50 */ setProtocolNegotiatorFactory( NettyChannelBuilder builder, final ProtocolNegotiatorFactory protocolNegotiator)51 public static void setProtocolNegotiatorFactory( 52 NettyChannelBuilder builder, final ProtocolNegotiatorFactory protocolNegotiator) { 53 builder.protocolNegotiatorFactory(new ProtocolNegotiator.ClientFactory() { 54 @Override public ProtocolNegotiator newNegotiator() { 55 return protocolNegotiator.buildProtocolNegotiator(); 56 } 57 58 @Override public int getDefaultPort() { 59 return GrpcUtil.DEFAULT_PORT_SSL; 60 } 61 }); 62 } 63 64 /** 65 * Sets the {@link ProtocolNegotiatorFactory} to be used. Overrides any specified negotiation type 66 * and {@code SslContext}. 67 */ setProtocolNegotiatorFactory( NettyChannelBuilder builder, InternalProtocolNegotiator.ClientFactory protocolNegotiator)68 public static void setProtocolNegotiatorFactory( 69 NettyChannelBuilder builder, InternalProtocolNegotiator.ClientFactory protocolNegotiator) { 70 builder.protocolNegotiatorFactory(protocolNegotiator); 71 } 72 setStatsEnabled(NettyChannelBuilder builder, boolean value)73 public static void setStatsEnabled(NettyChannelBuilder builder, boolean value) { 74 builder.setStatsEnabled(value); 75 } 76 setTracingEnabled(NettyChannelBuilder builder, boolean value)77 public static void setTracingEnabled(NettyChannelBuilder builder, boolean value) { 78 builder.setTracingEnabled(value); 79 } 80 setStatsRecordStartedRpcs(NettyChannelBuilder builder, boolean value)81 public static void setStatsRecordStartedRpcs(NettyChannelBuilder builder, boolean value) { 82 builder.setStatsRecordStartedRpcs(value); 83 } 84 setStatsRecordFinishedRpcs(NettyChannelBuilder builder, boolean value)85 public static void setStatsRecordFinishedRpcs(NettyChannelBuilder builder, boolean value) { 86 builder.setStatsRecordFinishedRpcs(value); 87 } 88 setStatsRecordRealTimeMetrics(NettyChannelBuilder builder, boolean value)89 public static void setStatsRecordRealTimeMetrics(NettyChannelBuilder builder, boolean value) { 90 builder.setStatsRecordRealTimeMetrics(value); 91 } 92 setStatsRecordRetryMetrics(NettyChannelBuilder builder, boolean value)93 public static void setStatsRecordRetryMetrics(NettyChannelBuilder builder, boolean value) { 94 builder.setStatsRecordRetryMetrics(value); 95 } 96 97 /** 98 * Sets {@link io.grpc.Channel} and {@link io.netty.channel.EventLoopGroup} to Nio. A major 99 * benefit over using setters is gRPC will manage the life cycle of {@link 100 * io.netty.channel.EventLoopGroup}. 101 */ useNioTransport(NettyChannelBuilder builder)102 public static void useNioTransport(NettyChannelBuilder builder) { 103 builder.channelType(NioSocketChannel.class); 104 builder 105 .eventLoopGroupPool(SharedResourcePool.forResource(Utils.NIO_WORKER_EVENT_LOOP_GROUP)); 106 } 107 buildTransportFactory(NettyChannelBuilder builder)108 public static ClientTransportFactory buildTransportFactory(NettyChannelBuilder builder) { 109 return builder.buildTransportFactory(); 110 } 111 112 @VisibleForTesting setTransportTracerFactory( NettyChannelBuilder builder, TransportTracer.Factory factory)113 public static void setTransportTracerFactory( 114 NettyChannelBuilder builder, TransportTracer.Factory factory) { 115 builder.setTransportTracerFactory(factory); 116 } 117 InternalNettyChannelBuilder()118 private InternalNettyChannelBuilder() {} 119 } 120