configuration.asciidoc 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. == Common configuration
  2. As explained in <<java-rest-low-usage-initialization>>, the `RestClientBuilder`
  3. supports providing both a `RequestConfigCallback` and an `HttpClientConfigCallback`
  4. which allow for any customization that the Apache Async Http Client exposes.
  5. Those callbacks make it possible to modify some specific behaviour of the client
  6. without overriding every other default configuration that the `RestClient`
  7. is initialized with. This section describes some common scenarios that require
  8. additional configuration for the low-level Java REST Client.
  9. === Timeouts
  10. Configuring requests timeouts can be done by providing an instance of
  11. `RequestConfigCallback` while building the `RestClient` through its builder.
  12. The interface has one method that receives an instance of
  13. https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/config/RequestConfig.Builder.html[`org.apache.http.client.config.RequestConfig.Builder`]
  14. as an argument and has the same return type. The request config builder can
  15. be modified and then returned. In the following example we increase the
  16. connect timeout (defaults to 1 second) and the socket timeout (defaults to 30
  17. seconds). Also we adjust the max retry timeout accordingly (defaults to 30
  18. seconds too).
  19. ["source","java",subs="attributes,callouts,macros"]
  20. --------------------------------------------------
  21. include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-config-timeouts]
  22. --------------------------------------------------
  23. === Number of threads
  24. The Apache Http Async Client starts by default one dispatcher thread, and a
  25. number of worker threads used by the connection manager, as many as the number
  26. of locally detected processors (depending on what
  27. `Runtime.getRuntime().availableProcessors()` returns). The number of threads
  28. can be modified as follows:
  29. ["source","java",subs="attributes,callouts,macros"]
  30. --------------------------------------------------
  31. include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-config-threads]
  32. --------------------------------------------------
  33. === Basic authentication
  34. Configuring basic authentication can be done by providing an
  35. `HttpClientConfigCallback` while building the `RestClient` through its builder.
  36. The interface has one method that receives an instance of
  37. https://hc.apache.org/httpcomponents-asyncclient-dev/httpasyncclient/apidocs/org/apache/http/impl/nio/client/HttpAsyncClientBuilder.html[`org.apache.http.impl.nio.client.HttpAsyncClientBuilder`]
  38. as an argument and has the same return type. The http client builder can be
  39. modified and then returned. In the following example we set a default
  40. credentials provider that requires basic authentication.
  41. ["source","java",subs="attributes,callouts,macros"]
  42. --------------------------------------------------
  43. include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-config-basic-auth]
  44. --------------------------------------------------
  45. Preemptive Authentication can be disabled, which means that every request will be sent without
  46. authorization headers to see if it is accepted and, upon receiving an HTTP 401 response, it will
  47. resend the exact same request with the basic authentication header. If you wish to do this, then
  48. you can do so by disabling it via the `HttpAsyncClientBuilder`:
  49. ["source","java",subs="attributes,callouts,macros"]
  50. --------------------------------------------------
  51. include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-config-disable-preemptive-auth]
  52. --------------------------------------------------
  53. <1> Disable preemptive authentication
  54. === Encrypted communication
  55. Encrypted communication can also be configured through the
  56. `HttpClientConfigCallback`. The
  57. https://hc.apache.org/httpcomponents-asyncclient-dev/httpasyncclient/apidocs/org/apache/http/impl/nio/client/HttpAsyncClientBuilder.html[`org.apache.http.impl.nio.client.HttpAsyncClientBuilder`]
  58. received as an argument exposes multiple methods to configure encrypted
  59. communication: `setSSLContext`, `setSSLSessionStrategy` and
  60. `setConnectionManager`, in order of precedence from the least important.
  61. The following is an example:
  62. ["source","java",subs="attributes,callouts,macros"]
  63. --------------------------------------------------
  64. include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-config-encrypted-communication]
  65. --------------------------------------------------
  66. If no explicit configuration is provided, the http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#CustomizingStores[system default configuration]
  67. will be used.
  68. === Others
  69. For any other required configuration needed, the Apache HttpAsyncClient docs
  70. should be consulted: https://hc.apache.org/httpcomponents-asyncclient-4.1.x/ .
  71. NOTE: If your application runs under the security manager you might be subject
  72. to the JVM default policies of caching positive hostname resolutions
  73. indefinitely and negative hostname resolutions for ten seconds. If the resolved
  74. addresses of the hosts to which you are connecting the client to vary with time
  75. then you might want to modify the default JVM behavior. These can be modified by
  76. adding
  77. http://docs.oracle.com/javase/8/docs/technotes/guides/net/properties.html[`networkaddress.cache.ttl=<timeout>`]
  78. and
  79. http://docs.oracle.com/javase/8/docs/technotes/guides/net/properties.html[`networkaddress.cache.negative.ttl=<timeout>`]
  80. to your
  81. http://docs.oracle.com/javase/8/docs/technotes/guides/security/PolicyFiles.html[Java
  82. security policy].
  83. === Node selector
  84. The client sends each request to one of the configured nodes in round-robin
  85. fashion. Nodes can optionally be filtered through a node selector that needs
  86. to be provided when initializing the client. This is useful when sniffing is
  87. enabled, in case only dedicated master nodes should be hit by HTTP requests.
  88. For each request the client will run the eventually configured node selector
  89. to filter the node candidates, then select the next one in the list out of the
  90. remaining ones.
  91. ["source","java",subs="attributes,callouts,macros"]
  92. --------------------------------------------------
  93. include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-init-allocation-aware-selector]
  94. --------------------------------------------------
  95. <1> Set an allocation aware node selector that allows to pick a node in the
  96. local rack if any available, otherwise go to any other node in any rack. It
  97. acts as a preference rather than a strict requirement, given that it goes to
  98. another rack if none of the local nodes are available, rather than returning
  99. no nodes in such case which would make the client forcibly revive a local node
  100. whenever none of the nodes from the preferred rack is available.
  101. WARNING: Node selectors that do not consistently select the same set of nodes
  102. will make round-robin behaviour unpredictable and possibly unfair. The
  103. preference example above is fine as it reasons about availability of nodes
  104. which already affects the predictability of round-robin. Node selection should
  105. not depend on other external factors or round-robin will not work properly.