gRPC Java client with TLS Mutual authentication

The English Debate

Does fire aspect on a sword, destroy mob drops?

Why I don't get the wanted width of tcbox?

How to test the sharpness of a knife?

Nested Dynamic SOQL Query

Which partition to make active?

Recursively updating the MLE as new observations stream in

How can a new country break out from a developed country without war?

Print last inputted byte

10 year ban after applying for a UK student visa

Why is "la Gestapo" feminine?

Is VPN a layer 3 concept?

I got the following comment from a reputed math journal. What does it mean?

Determine voltage drop over 10G resistors with cheap multimeter

What is it called when someone votes for an option that's not their first choice?

Hackerrank All Women's Codesprint 2019: Name the Product

Is xar preinstalled on macOS?

UK Tourist Visa- Enquiry

Does convergence of polynomials imply that of its coefficients?

How old is Nick Fury?

Why is participating in the European Parliamentary elections used as a threat?

Do people actually use the word "kaputt" in conversation?

Hot air balloons as primitive bombers

Emojional cryptic crossword



gRPC Java client with TLS Mutual authentication














0












$begingroup$


I'm not a Java developer but I'm trying to put together a quick start snippet to help Java users consume our service using code generated from .proto service definitions.



I've cobbled together some code, drawing from the examples in grpc/grpc-java, but I don't feel comfortable with how the host and port parameters are being set, or with the null return from the createUser method.



I'd appreciate any feedback on how easy the code below would be to implement, and highlight any significant issues or improvements that could be made to improve performance and developer productivity.



Example User Client class:



package com.example.UserClient;

import io.grpc.ManagedChannel;
import io.grpc.StatusRuntimeException;
import io.grpc.testing.TestUtils;
import io.grpc.netty.GrpcSslContexts;
import io.grpc.netty.NegotiationType;
import io.grpc.netty.NettyChannelBuilder;
import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.SslContextBuilder;

import javax.net.ssl.SSLException;
import java.io.File;
import java.security.cert.X509Certificate;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.example.UserGrpc;
import com.example.UserGrpc.UserBlockingStub;
import com.example.UserOuterClass.NewUser;
import com.example.UserOuterClass.NewUserResponse;

public class UserClient

private static final Logger logger = Logger.getLogger(UserClient.class.getName());

private static String host;
private static int port;

private final ManagedChannel channel;
private final UserBlockingStub userStub;

private static SslContext buildSslContext(String h, int p, String trustFile, String clientCertFile, String clientKeyFile) throws SSLException
mHost = host;
mPort = port;
return GrpcSslContexts.forClient()
.trustManager(new File(trustFile))
.keyManager(new File(clientCertFile), new File(clientKeyFile))
.build();


public QuickStart(String host, int port, String trustFile, String clientCertFile, String clientKeyFile) throws SSLException
this(buildSslContext(host, port, trustFile, clientCertFile, clientKeyFile));


public QuickStart(SslContext sslContext) throws SSLException
this(NettyChannelBuilder.forAddress(host, port)
.negotiationType(NegotiationType.TLS)
.sslContext(sslContext)
.build());


QuickStart(ManagedChannel channel)
this.channel = channel;
userStub = UserGrpc.newBlockingStub(channel);


public NewUserResponse createUser(NewUser user)
NewUserResponse newUser;
try
newUser = userStub.createUser(user);
return newUser;
catch (StatusRuntimeException e)
logger.log(Level.WARNING, "RPC failed: 0", e.getStatus());
return null;



// Other method implementations....

public void shutdown() throws InterruptedException
channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);




Consuming the class:



UserClient client;
try
client = new UserClient("api.example.com", 443, "ca.pem", "client.pem", "client-key.pem");
NewUser user = NewUser.newBuilder()
.setUsername("TestyMcTest")
.setEmailAddress("Testy.McTest@testy.com")
// additional params...
.build();

NewUserResponse response = client.createUser(user);

catch(Exception e)
e.printStackTrace();









share







New contributor




PassKit is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.







$endgroup$
















    0












    $begingroup$


    I'm not a Java developer but I'm trying to put together a quick start snippet to help Java users consume our service using code generated from .proto service definitions.



    I've cobbled together some code, drawing from the examples in grpc/grpc-java, but I don't feel comfortable with how the host and port parameters are being set, or with the null return from the createUser method.



    I'd appreciate any feedback on how easy the code below would be to implement, and highlight any significant issues or improvements that could be made to improve performance and developer productivity.



    Example User Client class:



    package com.example.UserClient;

    import io.grpc.ManagedChannel;
    import io.grpc.StatusRuntimeException;
    import io.grpc.testing.TestUtils;
    import io.grpc.netty.GrpcSslContexts;
    import io.grpc.netty.NegotiationType;
    import io.grpc.netty.NettyChannelBuilder;
    import io.netty.handler.ssl.SslContext;
    import io.netty.handler.ssl.SslContextBuilder;

    import javax.net.ssl.SSLException;
    import java.io.File;
    import java.security.cert.X509Certificate;
    import java.util.concurrent.TimeUnit;
    import java.util.logging.Level;
    import java.util.logging.Logger;

    import com.example.UserGrpc;
    import com.example.UserGrpc.UserBlockingStub;
    import com.example.UserOuterClass.NewUser;
    import com.example.UserOuterClass.NewUserResponse;

    public class UserClient

    private static final Logger logger = Logger.getLogger(UserClient.class.getName());

    private static String host;
    private static int port;

    private final ManagedChannel channel;
    private final UserBlockingStub userStub;

    private static SslContext buildSslContext(String h, int p, String trustFile, String clientCertFile, String clientKeyFile) throws SSLException
    mHost = host;
    mPort = port;
    return GrpcSslContexts.forClient()
    .trustManager(new File(trustFile))
    .keyManager(new File(clientCertFile), new File(clientKeyFile))
    .build();


    public QuickStart(String host, int port, String trustFile, String clientCertFile, String clientKeyFile) throws SSLException
    this(buildSslContext(host, port, trustFile, clientCertFile, clientKeyFile));


    public QuickStart(SslContext sslContext) throws SSLException
    this(NettyChannelBuilder.forAddress(host, port)
    .negotiationType(NegotiationType.TLS)
    .sslContext(sslContext)
    .build());


    QuickStart(ManagedChannel channel)
    this.channel = channel;
    userStub = UserGrpc.newBlockingStub(channel);


    public NewUserResponse createUser(NewUser user)
    NewUserResponse newUser;
    try
    newUser = userStub.createUser(user);
    return newUser;
    catch (StatusRuntimeException e)
    logger.log(Level.WARNING, "RPC failed: 0", e.getStatus());
    return null;



    // Other method implementations....

    public void shutdown() throws InterruptedException
    channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);




    Consuming the class:



    UserClient client;
    try
    client = new UserClient("api.example.com", 443, "ca.pem", "client.pem", "client-key.pem");
    NewUser user = NewUser.newBuilder()
    .setUsername("TestyMcTest")
    .setEmailAddress("Testy.McTest@testy.com")
    // additional params...
    .build();

    NewUserResponse response = client.createUser(user);

    catch(Exception e)
    e.printStackTrace();









    share







    New contributor




    PassKit is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.







    $endgroup$














      0












      0








      0





      $begingroup$


      I'm not a Java developer but I'm trying to put together a quick start snippet to help Java users consume our service using code generated from .proto service definitions.



      I've cobbled together some code, drawing from the examples in grpc/grpc-java, but I don't feel comfortable with how the host and port parameters are being set, or with the null return from the createUser method.



      I'd appreciate any feedback on how easy the code below would be to implement, and highlight any significant issues or improvements that could be made to improve performance and developer productivity.



      Example User Client class:



      package com.example.UserClient;

      import io.grpc.ManagedChannel;
      import io.grpc.StatusRuntimeException;
      import io.grpc.testing.TestUtils;
      import io.grpc.netty.GrpcSslContexts;
      import io.grpc.netty.NegotiationType;
      import io.grpc.netty.NettyChannelBuilder;
      import io.netty.handler.ssl.SslContext;
      import io.netty.handler.ssl.SslContextBuilder;

      import javax.net.ssl.SSLException;
      import java.io.File;
      import java.security.cert.X509Certificate;
      import java.util.concurrent.TimeUnit;
      import java.util.logging.Level;
      import java.util.logging.Logger;

      import com.example.UserGrpc;
      import com.example.UserGrpc.UserBlockingStub;
      import com.example.UserOuterClass.NewUser;
      import com.example.UserOuterClass.NewUserResponse;

      public class UserClient

      private static final Logger logger = Logger.getLogger(UserClient.class.getName());

      private static String host;
      private static int port;

      private final ManagedChannel channel;
      private final UserBlockingStub userStub;

      private static SslContext buildSslContext(String h, int p, String trustFile, String clientCertFile, String clientKeyFile) throws SSLException
      mHost = host;
      mPort = port;
      return GrpcSslContexts.forClient()
      .trustManager(new File(trustFile))
      .keyManager(new File(clientCertFile), new File(clientKeyFile))
      .build();


      public QuickStart(String host, int port, String trustFile, String clientCertFile, String clientKeyFile) throws SSLException
      this(buildSslContext(host, port, trustFile, clientCertFile, clientKeyFile));


      public QuickStart(SslContext sslContext) throws SSLException
      this(NettyChannelBuilder.forAddress(host, port)
      .negotiationType(NegotiationType.TLS)
      .sslContext(sslContext)
      .build());


      QuickStart(ManagedChannel channel)
      this.channel = channel;
      userStub = UserGrpc.newBlockingStub(channel);


      public NewUserResponse createUser(NewUser user)
      NewUserResponse newUser;
      try
      newUser = userStub.createUser(user);
      return newUser;
      catch (StatusRuntimeException e)
      logger.log(Level.WARNING, "RPC failed: 0", e.getStatus());
      return null;



      // Other method implementations....

      public void shutdown() throws InterruptedException
      channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);




      Consuming the class:



      UserClient client;
      try
      client = new UserClient("api.example.com", 443, "ca.pem", "client.pem", "client-key.pem");
      NewUser user = NewUser.newBuilder()
      .setUsername("TestyMcTest")
      .setEmailAddress("Testy.McTest@testy.com")
      // additional params...
      .build();

      NewUserResponse response = client.createUser(user);

      catch(Exception e)
      e.printStackTrace();









      share







      New contributor




      PassKit is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.







      $endgroup$




      I'm not a Java developer but I'm trying to put together a quick start snippet to help Java users consume our service using code generated from .proto service definitions.



      I've cobbled together some code, drawing from the examples in grpc/grpc-java, but I don't feel comfortable with how the host and port parameters are being set, or with the null return from the createUser method.



      I'd appreciate any feedback on how easy the code below would be to implement, and highlight any significant issues or improvements that could be made to improve performance and developer productivity.



      Example User Client class:



      package com.example.UserClient;

      import io.grpc.ManagedChannel;
      import io.grpc.StatusRuntimeException;
      import io.grpc.testing.TestUtils;
      import io.grpc.netty.GrpcSslContexts;
      import io.grpc.netty.NegotiationType;
      import io.grpc.netty.NettyChannelBuilder;
      import io.netty.handler.ssl.SslContext;
      import io.netty.handler.ssl.SslContextBuilder;

      import javax.net.ssl.SSLException;
      import java.io.File;
      import java.security.cert.X509Certificate;
      import java.util.concurrent.TimeUnit;
      import java.util.logging.Level;
      import java.util.logging.Logger;

      import com.example.UserGrpc;
      import com.example.UserGrpc.UserBlockingStub;
      import com.example.UserOuterClass.NewUser;
      import com.example.UserOuterClass.NewUserResponse;

      public class UserClient

      private static final Logger logger = Logger.getLogger(UserClient.class.getName());

      private static String host;
      private static int port;

      private final ManagedChannel channel;
      private final UserBlockingStub userStub;

      private static SslContext buildSslContext(String h, int p, String trustFile, String clientCertFile, String clientKeyFile) throws SSLException
      mHost = host;
      mPort = port;
      return GrpcSslContexts.forClient()
      .trustManager(new File(trustFile))
      .keyManager(new File(clientCertFile), new File(clientKeyFile))
      .build();


      public QuickStart(String host, int port, String trustFile, String clientCertFile, String clientKeyFile) throws SSLException
      this(buildSslContext(host, port, trustFile, clientCertFile, clientKeyFile));


      public QuickStart(SslContext sslContext) throws SSLException
      this(NettyChannelBuilder.forAddress(host, port)
      .negotiationType(NegotiationType.TLS)
      .sslContext(sslContext)
      .build());


      QuickStart(ManagedChannel channel)
      this.channel = channel;
      userStub = UserGrpc.newBlockingStub(channel);


      public NewUserResponse createUser(NewUser user)
      NewUserResponse newUser;
      try
      newUser = userStub.createUser(user);
      return newUser;
      catch (StatusRuntimeException e)
      logger.log(Level.WARNING, "RPC failed: 0", e.getStatus());
      return null;



      // Other method implementations....

      public void shutdown() throws InterruptedException
      channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);




      Consuming the class:



      UserClient client;
      try
      client = new UserClient("api.example.com", 443, "ca.pem", "client.pem", "client-key.pem");
      NewUser user = NewUser.newBuilder()
      .setUsername("TestyMcTest")
      .setEmailAddress("Testy.McTest@testy.com")
      // additional params...
      .build();

      NewUserResponse response = client.createUser(user);

      catch(Exception e)
      e.printStackTrace();







      java protocol-buffers





      share







      New contributor




      PassKit is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.










      share







      New contributor




      PassKit is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.








      share



      share






      New contributor




      PassKit is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      asked 1 min ago









      PassKitPassKit

      1012




      1012




      New contributor




      PassKit is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.





      New contributor





      PassKit is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






      PassKit is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.




















          0






          active

          oldest

          votes











          Your Answer





          StackExchange.ifUsing("editor", function ()
          return StackExchange.using("mathjaxEditing", function ()
          StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix)
          StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
          );
          );
          , "mathjax-editing");

          StackExchange.ifUsing("editor", function ()
          StackExchange.using("externalEditor", function ()
          StackExchange.using("snippets", function ()
          StackExchange.snippets.init();
          );
          );
          , "code-snippets");

          StackExchange.ready(function()
          var channelOptions =
          tags: "".split(" "),
          id: "196"
          ;
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function()
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled)
          StackExchange.using("snippets", function()
          createEditor();
          );

          else
          createEditor();

          );

          function createEditor()
          StackExchange.prepareEditor(
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: false,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: null,
          bindNavPrevention: true,
          postfix: "",
          imageUploader:
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          ,
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          );



          );






          PassKit is a new contributor. Be nice, and check out our Code of Conduct.









          draft saved

          draft discarded


















          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f215723%2fgrpc-java-client-with-tls-mutual-authentication%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown

























          0






          active

          oldest

          votes








          0






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          PassKit is a new contributor. Be nice, and check out our Code of Conduct.









          draft saved

          draft discarded


















          PassKit is a new contributor. Be nice, and check out our Code of Conduct.












          PassKit is a new contributor. Be nice, and check out our Code of Conduct.











          PassKit is a new contributor. Be nice, and check out our Code of Conduct.














          Thanks for contributing an answer to Code Review Stack Exchange!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid


          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.

          Use MathJax to format equations. MathJax reference.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f215723%2fgrpc-java-client-with-tls-mutual-authentication%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          कुँवर स्रोत दिक्चालन सूची"कुँवर""राणा कुँवरके वंशावली"

          Why is a white electrical wire connected to 2 black wires?How to wire a light fixture with 3 white wires in box?How should I wire a ceiling fan when there's only three wires in the box?Two white, two black, two ground, and red wire in ceiling box connected to switchWhy is there a white wire connected to multiple black wires in my light box?How to wire a light with two white wires and one black wireReplace light switch connected to a power outlet with dimmer - two black wires to one black and redHow to wire a light with multiple black/white/green wires from the ceiling?Ceiling box has 2 black and white wires but fan/ light only has 1 of eachWhy neutral wire connected to load wire?Switch with 2 black, 2 white, 2 ground and 1 red wire connected to ceiling light and a receptacle?

          चैत्य भूमि चित्र दीर्घा सन्दर्भ बाहरी कडियाँ दिक्चालन सूची"Chaitya Bhoomi""Chaitya Bhoomi: Statue of Equality in India""Dadar Chaitya Bhoomi: Statue of Equality in India""Ambedkar memorial: Centre okays transfer of Indu Mill land"चैत्यभमि