Sync docs from v2.2.0.M1 to gh-pages
This commit is contained in:
1
spring-cloud-zookeeper/2.2.0.M1/css/spring.css
Normal file
1
spring-cloud-zookeeper/2.2.0.M1/css/spring.css
Normal file
File diff suppressed because one or more lines are too long
BIN
spring-cloud-zookeeper/2.2.0.M1/favicon.ico
Normal file
BIN
spring-cloud-zookeeper/2.2.0.M1/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 109 KiB |
0
spring-cloud-zookeeper/2.2.0.M1/images/.gitkeep
Normal file
0
spring-cloud-zookeeper/2.2.0.M1/images/.gitkeep
Normal file
975
spring-cloud-zookeeper/2.2.0.M1/index.html
Normal file
975
spring-cloud-zookeeper/2.2.0.M1/index.html
Normal file
@@ -0,0 +1,975 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]-->
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="generator" content="Asciidoctor 1.5.7.1">
|
||||
<title>Spring Cloud Zookeeper</title>
|
||||
<link rel="stylesheet" href="css/spring.css">
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
|
||||
<style>
|
||||
.hidden {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.switch {
|
||||
border-width: 1px 1px 0 1px;
|
||||
border-style: solid;
|
||||
border-color: #7a2518;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.switch--item {
|
||||
padding: 10px;
|
||||
background-color: #ffffff;
|
||||
color: #7a2518;
|
||||
display: inline-block;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.switch--item.selected {
|
||||
background-color: #7a2519;
|
||||
color: #ffffff;
|
||||
}
|
||||
</style>
|
||||
<script src="http://cdnjs.cloudflare.com/ajax/libs/zepto/1.2.0/zepto.min.js"></script>
|
||||
<script type="text/javascript">
|
||||
function addBlockSwitches() {
|
||||
$('.primary').each(function() {
|
||||
primary = $(this);
|
||||
createSwitchItem(primary, createBlockSwitch(primary)).item.addClass("selected");
|
||||
primary.children('.title').remove();
|
||||
});
|
||||
$('.secondary').each(function(idx, node) {
|
||||
secondary = $(node);
|
||||
primary = findPrimary(secondary);
|
||||
switchItem = createSwitchItem(secondary, primary.children('.switch'));
|
||||
switchItem.content.addClass('hidden');
|
||||
findPrimary(secondary).append(switchItem.content);
|
||||
secondary.remove();
|
||||
});
|
||||
}
|
||||
|
||||
function createBlockSwitch(primary) {
|
||||
blockSwitch = $('<div class="switch"></div>');
|
||||
primary.prepend(blockSwitch);
|
||||
return blockSwitch;
|
||||
}
|
||||
|
||||
function findPrimary(secondary) {
|
||||
candidate = secondary.prev();
|
||||
while (!candidate.is('.primary')) {
|
||||
candidate = candidate.prev();
|
||||
}
|
||||
return candidate;
|
||||
}
|
||||
|
||||
function createSwitchItem(block, blockSwitch) {
|
||||
blockName = block.children('.title').text();
|
||||
content = block.children('.content').first().append(block.next('.colist'));
|
||||
item = $('<div class="switch--item">' + blockName + '</div>');
|
||||
item.on('click', '', content, function(e) {
|
||||
$(this).addClass('selected');
|
||||
$(this).siblings().removeClass('selected');
|
||||
e.data.siblings('.content').addClass('hidden');
|
||||
e.data.removeClass('hidden');
|
||||
});
|
||||
blockSwitch.append(item);
|
||||
return {'item': item, 'content': content};
|
||||
}
|
||||
|
||||
$(addBlockSwitches);
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body class="book toc2 toc-left">
|
||||
<div id="header">
|
||||
<h1>Spring Cloud Zookeeper</h1>
|
||||
<div id="toc" class="toc2">
|
||||
<div id="toctitle">Table of Contents</div>
|
||||
<ul class="sectlevel1">
|
||||
<li><a href="#spring-cloud-zookeeper-install">Install Zookeeper</a></li>
|
||||
<li><a href="#spring-cloud-zookeeper-discovery">Service Discovery with Zookeeper</a>
|
||||
<ul class="sectlevel2">
|
||||
<li><a href="#_activating">Activating</a></li>
|
||||
<li><a href="#_registering_with_zookeeper">Registering with Zookeeper</a></li>
|
||||
<li><a href="#_using_the_discoveryclient">Using the DiscoveryClient</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#spring-cloud-zookeeper-netflix">Using Spring Cloud Zookeeper with Spring Cloud Netflix Components</a>
|
||||
<ul class="sectlevel2">
|
||||
<li><a href="#_ribbon_with_zookeeper">Ribbon with Zookeeper</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#spring-cloud-zookeeper-service-registry">Spring Cloud Zookeeper and Service Registry</a>
|
||||
<ul class="sectlevel2">
|
||||
<li><a href="#_instance_status">Instance Status</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#spring-cloud-zookeeper-dependencies">Zookeeper Dependencies</a>
|
||||
<ul class="sectlevel2">
|
||||
<li><a href="#spring-cloud-zookeeper-dependencies-using">Using the Zookeeper Dependencies</a></li>
|
||||
<li><a href="#spring-cloud-zookeeper-dependencies-activating">Activating Zookeeper Dependencies</a></li>
|
||||
<li><a href="#spring-cloud-zookeeper-dependencies-setting-up">Setting up Zookeeper Dependencies</a></li>
|
||||
<li><a href="#spring-cloud-zookeeper-dependencies-configuring">Configuring Spring Cloud Zookeeper Dependencies</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#spring-cloud-zookeeper-dependency-watcher">Spring Cloud Zookeeper Dependency Watcher</a>
|
||||
<ul class="sectlevel2">
|
||||
<li><a href="#_activating_2">Activating</a></li>
|
||||
<li><a href="#_registering_a_listener">Registering a Listener</a></li>
|
||||
<li><a href="#spring-cloud-zookeeper-dependency-watcher-presence-checker">Using the Presence Checker</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#spring-cloud-zookeeper-config">Distributed Configuration with Zookeeper</a>
|
||||
<ul class="sectlevel2">
|
||||
<li><a href="#_activating_3">Activating</a></li>
|
||||
<li><a href="#_customizing">Customizing</a></li>
|
||||
<li><a href="#_access_control_lists_acls">Access Control Lists (ACLs)</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div id="content">
|
||||
<div id="preamble">
|
||||
<div class="sectionbody">
|
||||
<div class="paragraph">
|
||||
<p>This project provides Zookeeper integrations for Spring Boot applications through
|
||||
autoconfiguration and binding to the Spring Environment and other Spring programming model
|
||||
idioms. With a few annotations, you can quickly enable and configure the common patterns
|
||||
inside your application and build large distributed systems with Zookeeper based
|
||||
components. The provided patterns include Service Discovery and Configuration. Integration
|
||||
with Spring Cloud Netflix provides Intelligent Routing (Zuul), Client Side Load Balancing
|
||||
(Ribbon), and Circuit Breaker (Hystrix).</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="spring-cloud-zookeeper-install"><a class="link" href="#spring-cloud-zookeeper-install">Install Zookeeper</a></h2>
|
||||
<div class="sectionbody">
|
||||
<div class="paragraph">
|
||||
<p>See the <a href="https://zookeeper.apache.org/doc/current/zookeeperStarted.html">installation
|
||||
documentation</a> for instructions on how to install Zookeeper.</p>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>Spring Cloud Zookeeper uses Apache Curator behind the scenes.
|
||||
While Zookeeper 3.5.x is still considered "beta" by the Zookeeper development team,
|
||||
the reality is that it is used in production by many users.
|
||||
However, Zookeeper 3.4.x is also used in production.
|
||||
Prior to Apache Curator 4.0, both versions of Zookeeper were supported via two versions of Apache Curator.
|
||||
Starting with Curator 4.0 both versions of Zookeeper are supported via the same Curator libraries.</p>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>In case you are integrating with version 3.4 you need to change the Zookeeper dependency
|
||||
that comes shipped with <code>curator</code>, and thus <code>spring-cloud-zookeeper</code>.
|
||||
To do so simply exclude that dependency and add the 3.4.x version like shown below.</p>
|
||||
</div>
|
||||
<div class="listingblock">
|
||||
<div class="title">maven</div>
|
||||
<div class="content">
|
||||
<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml"><dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-zookeeper-all</artifactId>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.apache.zookeeper</groupId>
|
||||
<artifactId>zookeeper</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.zookeeper</groupId>
|
||||
<artifactId>zookeeper</artifactId>
|
||||
<version>3.4.12</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-log4j12</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency></code></pre>
|
||||
</div>
|
||||
</div>
|
||||
<div class="listingblock">
|
||||
<div class="title">gradle</div>
|
||||
<div class="content">
|
||||
<pre class="highlightjs highlight"><code class="language-groovy hljs" data-lang="groovy">compile('org.springframework.cloud:spring-cloud-starter-zookeeper-all') {
|
||||
exclude group: 'org.apache.zookeeper', module: 'zookeeper'
|
||||
}
|
||||
compile('org.apache.zookeeper:zookeeper:3.4.12') {
|
||||
exclude group: 'org.slf4j', module: 'slf4j-log4j12'
|
||||
}</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="spring-cloud-zookeeper-discovery"><a class="link" href="#spring-cloud-zookeeper-discovery">Service Discovery with Zookeeper</a></h2>
|
||||
<div class="sectionbody">
|
||||
<div class="paragraph">
|
||||
<p>Service Discovery is one of the key tenets of a microservice based architecture. Trying to
|
||||
hand-configure each client or some form of convention can be difficult to do and can be
|
||||
brittle. <a href="https://curator.apache.org">Curator</a>(A Java library for Zookeeper) provides Service
|
||||
Discovery through a <a href="https://curator.apache.org/curator-x-discovery/">Service Discovery
|
||||
Extension</a>. Spring Cloud Zookeeper uses this extension for service registration and
|
||||
discovery.</p>
|
||||
</div>
|
||||
<div class="sect2">
|
||||
<h3 id="_activating"><a class="link" href="#_activating">Activating</a></h3>
|
||||
<div class="paragraph">
|
||||
<p>Including a dependency on
|
||||
<code>org.springframework.cloud:spring-cloud-starter-zookeeper-discovery</code> enables
|
||||
autoconfiguration that sets up Spring Cloud Zookeeper Discovery.</p>
|
||||
</div>
|
||||
<div class="admonitionblock note">
|
||||
<table>
|
||||
<tr>
|
||||
<td class="icon">
|
||||
<i class="fa icon-note" title="Note"></i>
|
||||
</td>
|
||||
<td class="content">
|
||||
For web functionality, you still need to include
|
||||
<code>org.springframework.boot:spring-boot-starter-web</code>.
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="admonitionblock caution">
|
||||
<table>
|
||||
<tr>
|
||||
<td class="icon">
|
||||
<i class="fa icon-caution" title="Caution"></i>
|
||||
</td>
|
||||
<td class="content">
|
||||
When working with version 3.4 of Zookeeper you need to change
|
||||
the way you include the dependency as described <a href="#spring-cloud-zookeeper-install">here</a>.
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect2">
|
||||
<h3 id="_registering_with_zookeeper"><a class="link" href="#_registering_with_zookeeper">Registering with Zookeeper</a></h3>
|
||||
<div class="paragraph">
|
||||
<p>When a client registers with Zookeeper, it provides metadata (such as host and port, ID,
|
||||
and name) about itself.</p>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>The following example shows a Zookeeper client:</p>
|
||||
</div>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@SpringBootApplication
|
||||
@RestController
|
||||
public class Application {
|
||||
|
||||
@RequestMapping("/")
|
||||
public String home() {
|
||||
return "Hello world";
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
new SpringApplicationBuilder(Application.class).web(true).run(args);
|
||||
}
|
||||
|
||||
}</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
<div class="admonitionblock note">
|
||||
<table>
|
||||
<tr>
|
||||
<td class="icon">
|
||||
<i class="fa icon-note" title="Note"></i>
|
||||
</td>
|
||||
<td class="content">
|
||||
The preceding example is a normal Spring Boot application.
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>If Zookeeper is located somewhere other than <code>localhost:2181</code>, the configuration must
|
||||
provide the location of the server, as shown in the following example:</p>
|
||||
</div>
|
||||
<div class="listingblock">
|
||||
<div class="title">application.yml</div>
|
||||
<div class="content">
|
||||
<pre class="highlightjs highlight"><code class="language-yml hljs" data-lang="yml">spring:
|
||||
cloud:
|
||||
zookeeper:
|
||||
connect-string: localhost:2181</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
<div class="admonitionblock caution">
|
||||
<table>
|
||||
<tr>
|
||||
<td class="icon">
|
||||
<i class="fa icon-caution" title="Caution"></i>
|
||||
</td>
|
||||
<td class="content">
|
||||
If you use <a href="#spring-cloud-zookeeper-config">Spring Cloud Zookeeper Config</a>, the
|
||||
values shown in the preceding example need to be in <code>bootstrap.yml</code> instead of
|
||||
<code>application.yml</code>.
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>The default service name, instance ID, and port (taken from the <code>Environment</code>) are
|
||||
<code>${spring.application.name}</code>, the Spring Context ID, and <code>${server.port}</code>, respectively.</p>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>Having <code>spring-cloud-starter-zookeeper-discovery</code> on the classpath makes the app into both
|
||||
a Zookeeper “service” (that is, it registers itself) and a “client” (that is, it can
|
||||
query Zookeeper to locate other services).</p>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>If you would like to disable the Zookeeper Discovery Client, you can set
|
||||
<code>spring.cloud.zookeeper.discovery.enabled</code> to <code>false</code>.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect2">
|
||||
<h3 id="_using_the_discoveryclient"><a class="link" href="#_using_the_discoveryclient">Using the DiscoveryClient</a></h3>
|
||||
<div class="paragraph">
|
||||
<p>Spring Cloud has support for
|
||||
<a href="https://github.com/spring-cloud/spring-cloud-netflix/blob/master/docs/src/main/asciidoc/spring-cloud-netflix.adoc#spring-cloud-feign">Feign</a>
|
||||
(a REST client builder) and
|
||||
<a href="https://github.com/spring-cloud/spring-cloud-netflix/blob/master/docs/src/main/asciidoc/spring-cloud-netflix.adoc#spring-cloud-ribbon">Spring
|
||||
<code>RestTemplate</code></a>, using logical service names instead of physical URLs.</p>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>You can also use the <code>org.springframework.cloud.client.discovery.DiscoveryClient</code>, which
|
||||
provides a simple API for discovery clients that is not specific to Netflix, as shown in
|
||||
the following example:</p>
|
||||
</div>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@Autowired
|
||||
private DiscoveryClient discoveryClient;
|
||||
|
||||
public String serviceUrl() {
|
||||
List<ServiceInstance> list = discoveryClient.getInstances("STORES");
|
||||
if (list != null && list.size() > 0 ) {
|
||||
return list.get(0).getUri().toString();
|
||||
}
|
||||
return null;
|
||||
}</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="spring-cloud-zookeeper-netflix"><a class="link" href="#spring-cloud-zookeeper-netflix">Using Spring Cloud Zookeeper with Spring Cloud Netflix Components</a></h2>
|
||||
<div class="sectionbody">
|
||||
<div class="paragraph">
|
||||
<p>Spring Cloud Netflix supplies useful tools that work regardless of which <code>DiscoveryClient</code>
|
||||
implementation you use. Feign, Turbine, Ribbon, and Zuul all work with Spring Cloud
|
||||
Zookeeper.</p>
|
||||
</div>
|
||||
<div class="sect2">
|
||||
<h3 id="_ribbon_with_zookeeper"><a class="link" href="#_ribbon_with_zookeeper">Ribbon with Zookeeper</a></h3>
|
||||
<div class="paragraph">
|
||||
<p>Spring Cloud Zookeeper provides an implementation of Ribbon’s <code>ServerList</code>. When you use
|
||||
the <code>spring-cloud-starter-zookeeper-discovery</code>, Ribbon is autoconfigured to use the
|
||||
<code>ZookeeperServerList</code> by default.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="spring-cloud-zookeeper-service-registry"><a class="link" href="#spring-cloud-zookeeper-service-registry">Spring Cloud Zookeeper and Service Registry</a></h2>
|
||||
<div class="sectionbody">
|
||||
<div class="paragraph">
|
||||
<p>Spring Cloud Zookeeper implements the <code>ServiceRegistry</code> interface, letting developers
|
||||
register arbitrary services in a programmatic way.</p>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>The <code>ServiceInstanceRegistration</code> class offers a <code>builder()</code> method to create a
|
||||
<code>Registration</code> object that can be used by the <code>ServiceRegistry</code>, as shown in the following
|
||||
example:</p>
|
||||
</div>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@Autowired
|
||||
private ZookeeperServiceRegistry serviceRegistry;
|
||||
|
||||
public void registerThings() {
|
||||
ZookeeperRegistration registration = ServiceInstanceRegistration.builder()
|
||||
.defaultUriSpec()
|
||||
.address("anyUrl")
|
||||
.port(10)
|
||||
.name("/a/b/c/d/anotherservice")
|
||||
.build();
|
||||
this.serviceRegistry.register(registration);
|
||||
}</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect2">
|
||||
<h3 id="_instance_status"><a class="link" href="#_instance_status">Instance Status</a></h3>
|
||||
<div class="paragraph">
|
||||
<p>Netflix Eureka supports having instances that are <code>OUT_OF_SERVICE</code> registered with the
|
||||
server. These instances are not returned as active service instances. This is useful for
|
||||
behaviors such as blue/green deployments. (Note that the Curator Service Discovery recipe
|
||||
does not support this behavior.) Taking advantage of the flexible payload has let Spring
|
||||
Cloud Zookeeper implement <code>OUT_OF_SERVICE</code> by updating some specific metadata and then
|
||||
filtering on that metadata in the Ribbon <code>ZookeeperServerList</code>. The <code>ZookeeperServerList</code>
|
||||
filters out all non-null instance statuses that do not equal <code>UP</code>. If the instance status
|
||||
field is empty, it is considered to be <code>UP</code> for backwards compatibility. To change the
|
||||
status of an instance, make a <code>POST</code> with <code>OUT_OF_SERVICE</code> to the <code>ServiceRegistry</code>
|
||||
instance status actuator endpoint, as shown in the following example:</p>
|
||||
</div>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre class="highlightjs highlight"><code class="language-sh hljs" data-lang="sh">$ http POST http://localhost:8081/service-registry status=OUT_OF_SERVICE</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
<div class="admonitionblock note">
|
||||
<table>
|
||||
<tr>
|
||||
<td class="icon">
|
||||
<i class="fa icon-note" title="Note"></i>
|
||||
</td>
|
||||
<td class="content">
|
||||
The preceding example uses the <code>http</code> command from <a href="https://httpie.org" class="bare">https://httpie.org</a>.
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="spring-cloud-zookeeper-dependencies"><a class="link" href="#spring-cloud-zookeeper-dependencies">Zookeeper Dependencies</a></h2>
|
||||
<div class="sectionbody">
|
||||
<div class="paragraph">
|
||||
<p>The following topics cover how to work with Spring Cloud Zookeeper dependencies:</p>
|
||||
</div>
|
||||
<div class="ulist">
|
||||
<ul>
|
||||
<li>
|
||||
<p><a href="#spring-cloud-zookeeper-dependencies-using">Using the Zookeeper Dependencies</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="#spring-cloud-zookeeper-dependencies-activating">Activating Zookeeper Dependencies</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="#spring-cloud-zookeeper-dependencies-setting-up">Setting up Zookeeper Dependencies</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="#spring-cloud-zookeeper-dependencies-configuring">Configuring Spring Cloud Zookeeper Dependencies</a></p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="sect2">
|
||||
<h3 id="spring-cloud-zookeeper-dependencies-using"><a class="link" href="#spring-cloud-zookeeper-dependencies-using">Using the Zookeeper Dependencies</a></h3>
|
||||
<div class="paragraph">
|
||||
<p>Spring Cloud Zookeeper gives you a possibility to provide dependencies of your application
|
||||
as properties. As dependencies, you can understand other applications that are registered
|
||||
in Zookeeper and which you would like to call through
|
||||
<a href="https://github.com/spring-cloud/spring-cloud-netflix/blob/master/docs/src/main/asciidoc/spring-cloud-netflix.adoc#spring-cloud-feign">Feign</a>
|
||||
(a REST client builder) and <a href="https://github.com/spring-cloud/spring-cloud-netflix/blob/master/docs/src/main/asciidoc/spring-cloud-netflix.adoc#spring-cloud-ribbon">Spring <code>RestTemplate</code></a>.</p>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>You can also use the Zookeeper Dependency Watchers functionality to control and monitor
|
||||
the state of your dependencies.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect2">
|
||||
<h3 id="spring-cloud-zookeeper-dependencies-activating"><a class="link" href="#spring-cloud-zookeeper-dependencies-activating">Activating Zookeeper Dependencies</a></h3>
|
||||
<div class="paragraph">
|
||||
<p>Including a dependency on
|
||||
<code>org.springframework.cloud:spring-cloud-starter-zookeeper-discovery</code> enables
|
||||
autoconfiguration that sets up Spring Cloud Zookeeper Dependencies. Even if you provide
|
||||
the dependencies in your properties, you can turn off the dependencies. To do so, set the
|
||||
<code>spring.cloud.zookeeper.dependency.enabled</code> property to false (it defaults to <code>true</code>).</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect2">
|
||||
<h3 id="spring-cloud-zookeeper-dependencies-setting-up"><a class="link" href="#spring-cloud-zookeeper-dependencies-setting-up">Setting up Zookeeper Dependencies</a></h3>
|
||||
<div class="paragraph">
|
||||
<p>Consider the following example of dependency representation:</p>
|
||||
</div>
|
||||
<div class="listingblock">
|
||||
<div class="title">application.yml</div>
|
||||
<div class="content">
|
||||
<pre class="highlightjs highlight"><code class="language-yml hljs" data-lang="yml">spring.application.name: yourServiceName
|
||||
spring.cloud.zookeeper:
|
||||
dependencies:
|
||||
newsletter:
|
||||
path: /path/where/newsletter/has/registered/in/zookeeper
|
||||
loadBalancerType: ROUND_ROBIN
|
||||
contentTypeTemplate: application/vnd.newsletter.$version+json
|
||||
version: v1
|
||||
headers:
|
||||
header1:
|
||||
- value1
|
||||
header2:
|
||||
- value2
|
||||
required: false
|
||||
stubs: org.springframework:foo:stubs
|
||||
mailing:
|
||||
path: /path/where/mailing/has/registered/in/zookeeper
|
||||
loadBalancerType: ROUND_ROBIN
|
||||
contentTypeTemplate: application/vnd.mailing.$version+json
|
||||
version: v1
|
||||
required: true</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>The next few sections go through each part of the dependency one by one. The root property
|
||||
name is <code>spring.cloud.zookeeper.dependencies</code>.</p>
|
||||
</div>
|
||||
<div class="sect3">
|
||||
<h4 id="spring-cloud-zookeeper-dependencies-setting-up-aliases"><a class="link" href="#spring-cloud-zookeeper-dependencies-setting-up-aliases">Aliases</a></h4>
|
||||
<div class="paragraph">
|
||||
<p>Below the root property you have to represent each dependency as an alias. This is due to
|
||||
the constraints of Ribbon, which requires that the application ID be placed in the URL.
|
||||
Consequently, you cannot pass any complex path, suchas <code>/myApp/myRoute/name</code>). The alias
|
||||
is the name you use instead of the <code>serviceId</code> for <code>DiscoveryClient</code>, <code>Feign</code>, or
|
||||
<code>RestTemplate</code>.</p>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>In the previous examples, the aliases are <code>newsletter</code> and <code>mailing</code>. The following
|
||||
example shows Feign usage with a <code>newsletter</code> alias:</p>
|
||||
</div>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@FeignClient("newsletter")
|
||||
public interface NewsletterService {
|
||||
@RequestMapping(method = RequestMethod.GET, value = "/newsletter")
|
||||
String getNewsletters();
|
||||
}</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect3">
|
||||
<h4 id="_path"><a class="link" href="#_path">Path</a></h4>
|
||||
<div class="paragraph">
|
||||
<p>The path is represented by the <code>path</code> YAML property and is the path under which the
|
||||
dependency is registered under Zookeeper. As described in the
|
||||
<a href="#spring-cloud-zookeeper-dependencies-setting-up-aliases">previous section</a>, Ribbon
|
||||
operates on URLs. As a result, this path is not compliant with its requirement.
|
||||
That is why Spring Cloud Zookeeper maps the alias to the proper path.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect3">
|
||||
<h4 id="_load_balancer_type"><a class="link" href="#_load_balancer_type">Load Balancer Type</a></h4>
|
||||
<div class="paragraph">
|
||||
<p>The load balancer type is represented by <code>loadBalancerType</code> YAML property.</p>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>If you know what kind of load-balancing strategy has to be applied when calling this
|
||||
particular dependency, you can provide it in the YAML file, and it is automatically
|
||||
applied. You can choose one of the following load balancing strategies:</p>
|
||||
</div>
|
||||
<div class="ulist">
|
||||
<ul>
|
||||
<li>
|
||||
<p>STICKY: Once chosen, the instance is always called.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>RANDOM: Picks an instance randomly.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>ROUND_ROBIN: Iterates over instances over and over again.</p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect3">
|
||||
<h4 id="_content_type_template_and_version"><a class="link" href="#_content_type_template_and_version"><code>Content-Type</code> Template and Version</a></h4>
|
||||
<div class="paragraph">
|
||||
<p>The <code>Content-Type</code> template and version are represented by the <code>contentTypeTemplate</code> and
|
||||
<code>version</code> YAML properties.</p>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>If you version your API in the <code>Content-Type</code> header, you do not want to add this header
|
||||
to each of your requests. Also, if you want to call a new version of the API, you do not
|
||||
want to roam around your code to bump up the API version. That is why you can provide a
|
||||
<code>contentTypeTemplate</code> with a special <code>$version</code> placeholder. That placeholder will be filled by the value of the
|
||||
<code>version</code> YAML property. Consider the following example of a <code>contentTypeTemplate</code>:</p>
|
||||
</div>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre>application/vnd.newsletter.$version+json</pre>
|
||||
</div>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>Further consider the following <code>version</code>:</p>
|
||||
</div>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre>v1</pre>
|
||||
</div>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>The combination of <code>contentTypeTemplate</code> and version results in the creation of a
|
||||
<code>Content-Type</code> header for each request, as follows:</p>
|
||||
</div>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre>application/vnd.newsletter.v1+json</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect3">
|
||||
<h4 id="_default_headers"><a class="link" href="#_default_headers">Default Headers</a></h4>
|
||||
<div class="paragraph">
|
||||
<p>Default headers are represented by the <code>headers</code> map in YAML.</p>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>Sometimes, each call to a dependency requires setting up of some default headers. To not
|
||||
do that in code, you can set them up in the YAML file, as shown in the following example
|
||||
<code>headers</code> section:</p>
|
||||
</div>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre class="highlightjs highlight"><code class="language-yml hljs" data-lang="yml">headers:
|
||||
Accept:
|
||||
- text/html
|
||||
- application/xhtml+xml
|
||||
Cache-Control:
|
||||
- no-cache</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>That <code>headers</code> section results in adding the <code>Accept</code> and <code>Cache-Control</code> headers with
|
||||
appropriate list of values in your HTTP request.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect3">
|
||||
<h4 id="_required_dependencies"><a class="link" href="#_required_dependencies">Required Dependencies</a></h4>
|
||||
<div class="paragraph">
|
||||
<p>Required dependencies are represented by <code>required</code> property in YAML.</p>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>If one of your dependencies is required to be up when your application boots, you can set
|
||||
the <code>required: true</code> property in the YAML file.</p>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>If your application cannot localize the required dependency during boot time, it throws an
|
||||
exception, and the Spring Context fails to set up. In other words, your application cannot
|
||||
start if the required dependency is not registered in Zookeeper.</p>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>You can read more about Spring Cloud Zookeeper Presence Checker
|
||||
<a href="#spring-cloud-zookeeper-dependency-watcher-presence-checker">later in this document</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect3">
|
||||
<h4 id="_stubs"><a class="link" href="#_stubs">Stubs</a></h4>
|
||||
<div class="paragraph">
|
||||
<p>You can provide a colon-separated path to the JAR containing stubs of the dependency, as
|
||||
shown in the following example:</p>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p><code>stubs: org.springframework:myApp:stubs</code></p>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>where:</p>
|
||||
</div>
|
||||
<div class="ulist">
|
||||
<ul>
|
||||
<li>
|
||||
<p><code>org.springframework</code> is the <code>groupId</code>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><code>myApp</code> is the <code>artifactId</code>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><code>stubs</code> is the classifier. (Note that <code>stubs</code> is the default value.)</p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>Because <code>stubs</code> is the default classifier, the preceding example is equal to the following
|
||||
example:</p>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p><code>stubs: org.springframework:myApp</code></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect2">
|
||||
<h3 id="spring-cloud-zookeeper-dependencies-configuring"><a class="link" href="#spring-cloud-zookeeper-dependencies-configuring">Configuring Spring Cloud Zookeeper Dependencies</a></h3>
|
||||
<div class="paragraph">
|
||||
<p>You can set the following properties to enable or disable parts of Zookeeper Dependencies
|
||||
functionalities:</p>
|
||||
</div>
|
||||
<div class="ulist">
|
||||
<ul>
|
||||
<li>
|
||||
<p><code>spring.cloud.zookeeper.dependencies</code>: If you do not set this property, you cannot use
|
||||
Zookeeper Dependencies.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><code>spring.cloud.zookeeper.dependency.ribbon.enabled</code> (enabled by default): Ribbon requires
|
||||
either explicit global configuration or a particular one for a dependency. By turning on
|
||||
this property, runtime load balancing strategy resolution is possible, and you can use the
|
||||
<code>loadBalancerType</code> section of the Zookeeper Dependencies. The configuration that needs
|
||||
this property has an implementation of <code>LoadBalancerClient</code> that delegates to the
|
||||
<code>ILoadBalancer</code> presented in the next bullet.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><code>spring.cloud.zookeeper.dependency.ribbon.loadbalancer</code> (enabled by default): Thanks to
|
||||
this property, the custom <code>ILoadBalancer</code> knows that the part of the URI passed to Ribbon
|
||||
might actually be the alias that has to be resolved to a proper path in Zookeeper. Without
|
||||
this property, you cannot register applications under nested paths.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><code>spring.cloud.zookeeper.dependency.headers.enabled</code> (enabled by default): This property
|
||||
registers a <code>RibbonClient</code> that automatically appends appropriate headers and content
|
||||
types with their versions, as presented in the Dependency configuration. Without this
|
||||
setting, those two parameters do not work.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><code>spring.cloud.zookeeper.dependency.resttemplate.enabled</code> (enabled by default): When
|
||||
enabled, this property modifies the request headers of a <code>@LoadBalanced</code>-annotated
|
||||
<code>RestTemplate</code> such that it passes headers and content type with the version set in
|
||||
dependency configuration. Without this setting, those two parameters do not work.</p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="spring-cloud-zookeeper-dependency-watcher"><a class="link" href="#spring-cloud-zookeeper-dependency-watcher">Spring Cloud Zookeeper Dependency Watcher</a></h2>
|
||||
<div class="sectionbody">
|
||||
<div class="paragraph">
|
||||
<p>The Dependency Watcher mechanism lets you register listeners to your dependencies. The
|
||||
functionality is, in fact, an implementation of the <code>Observator</code> pattern. When a
|
||||
dependency changes, its state (to either UP or DOWN), some custom logic can be applied.</p>
|
||||
</div>
|
||||
<div class="sect2">
|
||||
<h3 id="_activating_2"><a class="link" href="#_activating_2">Activating</a></h3>
|
||||
<div class="paragraph">
|
||||
<p>Spring Cloud Zookeeper Dependencies functionality needs to be enabled for you to use the
|
||||
Dependency Watcher mechanism.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect2">
|
||||
<h3 id="_registering_a_listener"><a class="link" href="#_registering_a_listener">Registering a Listener</a></h3>
|
||||
<div class="paragraph">
|
||||
<p>To register a listener, you must implement an interface called
|
||||
<code>org.springframework.cloud.zookeeper.discovery.watcher.DependencyWatcherListener</code> and
|
||||
register it as a bean. The interface gives you one method:</p>
|
||||
</div>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">void stateChanged(String dependencyName, DependencyState newState);</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>If you want to register a listener for a particular dependency, the <code>dependencyName</code> would
|
||||
be the discriminator for your concrete implementation. <code>newState</code> provides you with
|
||||
information about whether your dependency has changed to <code>CONNECTED</code> or <code>DISCONNECTED</code>.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect2">
|
||||
<h3 id="spring-cloud-zookeeper-dependency-watcher-presence-checker"><a class="link" href="#spring-cloud-zookeeper-dependency-watcher-presence-checker">Using the Presence Checker</a></h3>
|
||||
<div class="paragraph">
|
||||
<p>Bound with the Dependency Watcher is the functionality called Presence Checker. It lets
|
||||
you provide custom behavior when your application boots, to react according to the state
|
||||
of your dependencies.</p>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>The default implementation of the abstract
|
||||
<code>org.springframework.cloud.zookeeper.discovery.watcher.presence.DependencyPresenceOnStartupVerifier</code>
|
||||
class is the
|
||||
<code>org.springframework.cloud.zookeeper.discovery.watcher.presence.DefaultDependencyPresenceOnStartupVerifier</code>,
|
||||
which works in the following way.</p>
|
||||
</div>
|
||||
<div class="olist arabic">
|
||||
<ol class="arabic">
|
||||
<li>
|
||||
<p>If the dependency is marked us <code>required</code> and is not in Zookeeper, when your application
|
||||
boots, it throws an exception and shuts down.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>If the dependency is not <code>required</code>, the
|
||||
<code>org.springframework.cloud.zookeeper.discovery.watcher.presence.LogMissingDependencyChecker</code>
|
||||
logs that the dependency is missing at the <code>WARN</code> level.</p>
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>Because the <code>DefaultDependencyPresenceOnStartupVerifier</code> is registered only when there is
|
||||
no bean of type <code>DependencyPresenceOnStartupVerifier</code>, this functionality can be
|
||||
overridden.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="spring-cloud-zookeeper-config"><a class="link" href="#spring-cloud-zookeeper-config">Distributed Configuration with Zookeeper</a></h2>
|
||||
<div class="sectionbody">
|
||||
<div class="paragraph">
|
||||
<p>Zookeeper provides a
|
||||
<a href="https://zookeeper.apache.org/doc/current/zookeeperOver.html#sc_dataModelNameSpace">hierarchical namespace</a>
|
||||
that lets clients store arbitrary data, such as configuration data. Spring Cloud Zookeeper
|
||||
Config is an alternative to the
|
||||
<a href="https://github.com/spring-cloud/spring-cloud-config">Config Server and Client</a>.
|
||||
Configuration is loaded into the Spring Environment during the special “bootstrap”
|
||||
phase. Configuration is stored in the <code>/config</code> namespace by default. Multiple
|
||||
<code>PropertySource</code> instances are created, based on the application’s name and the active
|
||||
profiles, to mimic the Spring Cloud Config order of resolving properties. For example, an
|
||||
application with a name of <code>testApp</code> and with the <code>dev</code> profile has the following property
|
||||
sources created for it:</p>
|
||||
</div>
|
||||
<div class="ulist">
|
||||
<ul>
|
||||
<li>
|
||||
<p><code>config/testApp,dev</code></p>
|
||||
</li>
|
||||
<li>
|
||||
<p><code>config/testApp</code></p>
|
||||
</li>
|
||||
<li>
|
||||
<p><code>config/application,dev</code></p>
|
||||
</li>
|
||||
<li>
|
||||
<p><code>config/application</code></p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>The most specific property source is at the top, with the least specific at the bottom.
|
||||
Properties in the <code>config/application</code> namespace apply to all applications that use
|
||||
zookeeper for configuration. Properties in the <code>config/testApp</code> namespace are available
|
||||
only to the instances of the service named <code>testApp</code>.</p>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>Configuration is currently read on startup of the application. Sending a HTTP <code>POST</code>
|
||||
request to <code>/refresh</code> causes the configuration to be reloaded. Watching the configuration
|
||||
namespace (which Zookeeper supports) is not currently implemented.</p>
|
||||
</div>
|
||||
<div class="sect2">
|
||||
<h3 id="_activating_3"><a class="link" href="#_activating_3">Activating</a></h3>
|
||||
<div class="paragraph">
|
||||
<p>Including a dependency on
|
||||
<code>org.springframework.cloud:spring-cloud-starter-zookeeper-config</code> enables
|
||||
autoconfiguration that sets up Spring Cloud Zookeeper Config.</p>
|
||||
</div>
|
||||
<div class="admonitionblock caution">
|
||||
<table>
|
||||
<tr>
|
||||
<td class="icon">
|
||||
<i class="fa icon-caution" title="Caution"></i>
|
||||
</td>
|
||||
<td class="content">
|
||||
When working with version 3.4 of Zookeeper you need to change
|
||||
the way you include the dependency as described <a href="#spring-cloud-zookeeper-install">here</a>.
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect2">
|
||||
<h3 id="_customizing"><a class="link" href="#_customizing">Customizing</a></h3>
|
||||
<div class="paragraph">
|
||||
<p>Zookeeper Config may be customized by setting the following properties:</p>
|
||||
</div>
|
||||
<div class="listingblock">
|
||||
<div class="title">bootstrap.yml</div>
|
||||
<div class="content">
|
||||
<pre class="highlightjs highlight"><code class="language-yml hljs" data-lang="yml">spring:
|
||||
cloud:
|
||||
zookeeper:
|
||||
config:
|
||||
enabled: true
|
||||
root: configuration
|
||||
defaultContext: apps
|
||||
profileSeparator: '::'</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ulist">
|
||||
<ul>
|
||||
<li>
|
||||
<p><code>enabled</code>: Setting this value to <code>false</code> disables Zookeeper Config.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><code>root</code>: Sets the base namespace for configuration values.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><code>defaultContext</code>: Sets the name used by all applications.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><code>profileSeparator</code>: Sets the value of the separator used to separate the profile name in
|
||||
property sources with profiles.</p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect2">
|
||||
<h3 id="_access_control_lists_acls"><a class="link" href="#_access_control_lists_acls">Access Control Lists (ACLs)</a></h3>
|
||||
<div class="paragraph">
|
||||
<p>You can add authentication information for Zookeeper ACLs by calling the <code>addAuthInfo</code>
|
||||
method of a <code>CuratorFramework</code> bean. One way to accomplish this is to provide your own
|
||||
<code>CuratorFramework</code> bean, as shown in the following example:</p>
|
||||
</div>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@BoostrapConfiguration
|
||||
public class CustomCuratorFrameworkConfig {
|
||||
|
||||
@Bean
|
||||
public CuratorFramework curatorFramework() {
|
||||
CuratorFramework curator = new CuratorFramework();
|
||||
curator.addAuthInfo("digest", "user:password".getBytes());
|
||||
return curator;
|
||||
}
|
||||
|
||||
}</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>Consult
|
||||
<a href="https://github.com/spring-cloud/spring-cloud-zookeeper/blob/master/spring-cloud-zookeeper-core/src/main/java/org/springframework/cloud/zookeeper/ZookeeperAutoConfiguration.java">the ZookeeperAutoConfiguration class</a>
|
||||
to see how the <code>CuratorFramework</code> bean’s default configuration.</p>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>Alternatively, you can add your credentials from a class that depends on the existing
|
||||
<code>CuratorFramework</code> bean, as shown in the following example:</p>
|
||||
</div>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@BoostrapConfiguration
|
||||
public class DefaultCuratorFrameworkConfig {
|
||||
|
||||
public ZookeeperConfig(CuratorFramework curator) {
|
||||
curator.addAuthInfo("digest", "user:password".getBytes());
|
||||
}
|
||||
|
||||
}</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
<div class="paragraph">
|
||||
<p>The creation of this bean must occur during the boostrapping phase. You can register
|
||||
configuration classes to run during this phase by annotating them with
|
||||
<code>@BootstrapConfiguration</code> and including them in a comma-separated list that you set as the
|
||||
value of the <code>org.springframework.cloud.bootstrap.BootstrapConfiguration</code> property in the
|
||||
<code>resources/META-INF/spring.factories</code> file, as shown in the following example:</p>
|
||||
</div>
|
||||
<div class="listingblock">
|
||||
<div class="title">resources/META-INF/spring.factories</div>
|
||||
<div class="content">
|
||||
<pre>org.springframework.cloud.bootstrap.BootstrapConfiguration=\
|
||||
my.project.CustomCuratorFrameworkConfig,\
|
||||
my.project.DefaultCuratorFrameworkConfig</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript" src="js/tocbot/tocbot.min.js"></script>
|
||||
<script type="text/javascript" src="js/toc.js"></script>
|
||||
<link rel="stylesheet" href="js/highlight/styles/atom-one-dark-reasonable.min.css">
|
||||
<script src="js/highlight/highlight.min.js"></script>
|
||||
<script>hljs.initHighlighting()</script>
|
||||
</body>
|
||||
</html>
|
||||
2
spring-cloud-zookeeper/2.2.0.M1/js/highlight/highlight.min.js
vendored
Normal file
2
spring-cloud-zookeeper/2.2.0.M1/js/highlight/highlight.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
99
spring-cloud-zookeeper/2.2.0.M1/js/highlight/styles/a11y-dark.min.css
vendored
Normal file
99
spring-cloud-zookeeper/2.2.0.M1/js/highlight/styles/a11y-dark.min.css
vendored
Normal file
@@ -0,0 +1,99 @@
|
||||
/* a11y-dark theme */
|
||||
/* Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css */
|
||||
/* @author: ericwbailey */
|
||||
|
||||
/* Comment */
|
||||
.hljs-comment,
|
||||
.hljs-quote {
|
||||
color: #d4d0ab;
|
||||
}
|
||||
|
||||
/* Red */
|
||||
.hljs-variable,
|
||||
.hljs-template-variable,
|
||||
.hljs-tag,
|
||||
.hljs-name,
|
||||
.hljs-selector-id,
|
||||
.hljs-selector-class,
|
||||
.hljs-regexp,
|
||||
.hljs-deletion {
|
||||
color: #ffa07a;
|
||||
}
|
||||
|
||||
/* Orange */
|
||||
.hljs-number,
|
||||
.hljs-built_in,
|
||||
.hljs-builtin-name,
|
||||
.hljs-literal,
|
||||
.hljs-type,
|
||||
.hljs-params,
|
||||
.hljs-meta,
|
||||
.hljs-link {
|
||||
color: #f5ab35;
|
||||
}
|
||||
|
||||
/* Yellow */
|
||||
.hljs-attribute {
|
||||
color: #ffd700;
|
||||
}
|
||||
|
||||
/* Green */
|
||||
.hljs-string,
|
||||
.hljs-symbol,
|
||||
.hljs-bullet,
|
||||
.hljs-addition {
|
||||
color: #abe338;
|
||||
}
|
||||
|
||||
/* Blue */
|
||||
.hljs-title,
|
||||
.hljs-section {
|
||||
color: #00e0e0;
|
||||
}
|
||||
|
||||
/* Purple */
|
||||
.hljs-keyword,
|
||||
.hljs-selector-tag {
|
||||
color: #dcc6e0;
|
||||
}
|
||||
|
||||
.hljs {
|
||||
display: block;
|
||||
overflow-x: auto;
|
||||
background: #2b2b2b;
|
||||
color: #f8f8f2;
|
||||
padding: 0.5em;
|
||||
}
|
||||
|
||||
.hljs-emphasis {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.hljs-strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
@media screen and (-ms-high-contrast: active) {
|
||||
.hljs-addition,
|
||||
.hljs-attribute,
|
||||
.hljs-built_in,
|
||||
.hljs-builtin-name,
|
||||
.hljs-bullet,
|
||||
.hljs-comment,
|
||||
.hljs-link,
|
||||
.hljs-literal,
|
||||
.hljs-meta,
|
||||
.hljs-number,
|
||||
.hljs-params,
|
||||
.hljs-string,
|
||||
.hljs-symbol,
|
||||
.hljs-type,
|
||||
.hljs-quote {
|
||||
color: highlight;
|
||||
}
|
||||
|
||||
.hljs-keyword,
|
||||
.hljs-selector-tag {
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
89
spring-cloud-zookeeper/2.2.0.M1/js/highlight/styles/an-old-hope.min.css
vendored
Normal file
89
spring-cloud-zookeeper/2.2.0.M1/js/highlight/styles/an-old-hope.min.css
vendored
Normal file
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
|
||||
An Old Hope – Star Wars Syntax (c) Gustavo Costa <gusbemacbe@gmail.com>
|
||||
Original theme - Ocean Dark Theme – by https://github.com/gavsiu
|
||||
Based on Jesse Leite's Atom syntax theme 'An Old Hope' – https://github.com/JesseLeite/an-old-hope-syntax-atom
|
||||
|
||||
*/
|
||||
|
||||
/* Death Star Comment */
|
||||
.hljs-comment,
|
||||
.hljs-quote
|
||||
{
|
||||
color: #B6B18B;
|
||||
}
|
||||
|
||||
/* Darth Vader */
|
||||
.hljs-variable,
|
||||
.hljs-template-variable,
|
||||
.hljs-tag,
|
||||
.hljs-name,
|
||||
.hljs-selector-id,
|
||||
.hljs-selector-class,
|
||||
.hljs-regexp,
|
||||
.hljs-deletion
|
||||
{
|
||||
color: #EB3C54;
|
||||
}
|
||||
|
||||
/* Threepio */
|
||||
.hljs-number,
|
||||
.hljs-built_in,
|
||||
.hljs-builtin-name,
|
||||
.hljs-literal,
|
||||
.hljs-type,
|
||||
.hljs-params,
|
||||
.hljs-meta,
|
||||
.hljs-link
|
||||
{
|
||||
color: #E7CE56;
|
||||
}
|
||||
|
||||
/* Luke Skywalker */
|
||||
.hljs-attribute
|
||||
{
|
||||
color: #EE7C2B;
|
||||
}
|
||||
|
||||
/* Obi Wan Kenobi */
|
||||
.hljs-string,
|
||||
.hljs-symbol,
|
||||
.hljs-bullet,
|
||||
.hljs-addition
|
||||
{
|
||||
color: #4FB4D7;
|
||||
}
|
||||
|
||||
/* Yoda */
|
||||
.hljs-title,
|
||||
.hljs-section
|
||||
{
|
||||
color: #78BB65;
|
||||
}
|
||||
|
||||
/* Mace Windu */
|
||||
.hljs-keyword,
|
||||
.hljs-selector-tag
|
||||
{
|
||||
color: #B45EA4;
|
||||
}
|
||||
|
||||
/* Millenium Falcon */
|
||||
.hljs
|
||||
{
|
||||
display: block;
|
||||
overflow-x: auto;
|
||||
background: #1C1D21;
|
||||
color: #c0c5ce;
|
||||
padding: 0.5em;
|
||||
}
|
||||
|
||||
.hljs-emphasis
|
||||
{
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.hljs-strong
|
||||
{
|
||||
font-weight: bold;
|
||||
}
|
||||
77
spring-cloud-zookeeper/2.2.0.M1/js/highlight/styles/atom-one-dark-reasonable.min.css
vendored
Normal file
77
spring-cloud-zookeeper/2.2.0.M1/js/highlight/styles/atom-one-dark-reasonable.min.css
vendored
Normal file
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
|
||||
Atom One Dark With support for ReasonML by Gidi Morris, based off work by Daniel Gamage
|
||||
|
||||
Original One Dark Syntax theme from https://github.com/atom/one-dark-syntax
|
||||
|
||||
*/
|
||||
.hljs {
|
||||
display: block;
|
||||
overflow-x: auto;
|
||||
padding: 0.5em;
|
||||
line-height: 1.3em;
|
||||
color: #abb2bf;
|
||||
background: #282c34;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.hljs-keyword, .hljs-operator {
|
||||
color: #F92672;
|
||||
}
|
||||
.hljs-pattern-match {
|
||||
color: #F92672;
|
||||
}
|
||||
.hljs-pattern-match .hljs-constructor {
|
||||
color: #61aeee;
|
||||
}
|
||||
.hljs-function {
|
||||
color: #61aeee;
|
||||
}
|
||||
.hljs-function .hljs-params {
|
||||
color: #A6E22E;
|
||||
}
|
||||
.hljs-function .hljs-params .hljs-typing {
|
||||
color: #FD971F;
|
||||
}
|
||||
.hljs-module-access .hljs-module {
|
||||
color: #7e57c2;
|
||||
}
|
||||
.hljs-constructor {
|
||||
color: #e2b93d;
|
||||
}
|
||||
.hljs-constructor .hljs-string {
|
||||
color: #9CCC65;
|
||||
}
|
||||
.hljs-comment, .hljs-quote {
|
||||
color: #b18eb1;
|
||||
font-style: italic;
|
||||
}
|
||||
.hljs-doctag, .hljs-formula {
|
||||
color: #c678dd;
|
||||
}
|
||||
.hljs-section, .hljs-name, .hljs-selector-tag, .hljs-deletion, .hljs-subst {
|
||||
color: #e06c75;
|
||||
}
|
||||
.hljs-literal {
|
||||
color: #56b6c2;
|
||||
}
|
||||
.hljs-string, .hljs-regexp, .hljs-addition, .hljs-attribute, .hljs-meta-string {
|
||||
color: #98c379;
|
||||
}
|
||||
.hljs-built_in, .hljs-class .hljs-title {
|
||||
color: #e6c07b;
|
||||
}
|
||||
.hljs-attr, .hljs-variable, .hljs-template-variable, .hljs-type, .hljs-selector-class, .hljs-selector-attr, .hljs-selector-pseudo, .hljs-number {
|
||||
color: #d19a66;
|
||||
}
|
||||
.hljs-symbol, .hljs-bullet, .hljs-link, .hljs-meta, .hljs-selector-id, .hljs-title {
|
||||
color: #61aeee;
|
||||
}
|
||||
.hljs-emphasis {
|
||||
font-style: italic;
|
||||
}
|
||||
.hljs-strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
.hljs-link {
|
||||
text-decoration: underline;
|
||||
}
|
||||
96
spring-cloud-zookeeper/2.2.0.M1/js/highlight/styles/atom-one-dark.min.css
vendored
Normal file
96
spring-cloud-zookeeper/2.2.0.M1/js/highlight/styles/atom-one-dark.min.css
vendored
Normal file
@@ -0,0 +1,96 @@
|
||||
/*
|
||||
|
||||
Atom One Dark by Daniel Gamage
|
||||
Original One Dark Syntax theme from https://github.com/atom/one-dark-syntax
|
||||
|
||||
base: #282c34
|
||||
mono-1: #abb2bf
|
||||
mono-2: #818896
|
||||
mono-3: #5c6370
|
||||
hue-1: #56b6c2
|
||||
hue-2: #61aeee
|
||||
hue-3: #c678dd
|
||||
hue-4: #98c379
|
||||
hue-5: #e06c75
|
||||
hue-5-2: #be5046
|
||||
hue-6: #d19a66
|
||||
hue-6-2: #e6c07b
|
||||
|
||||
*/
|
||||
|
||||
.hljs {
|
||||
display: block;
|
||||
overflow-x: auto;
|
||||
padding: 0.5em;
|
||||
color: #abb2bf;
|
||||
background: #282c34;
|
||||
}
|
||||
|
||||
.hljs-comment,
|
||||
.hljs-quote {
|
||||
color: #5c6370;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.hljs-doctag,
|
||||
.hljs-keyword,
|
||||
.hljs-formula {
|
||||
color: #c678dd;
|
||||
}
|
||||
|
||||
.hljs-section,
|
||||
.hljs-name,
|
||||
.hljs-selector-tag,
|
||||
.hljs-deletion,
|
||||
.hljs-subst {
|
||||
color: #e06c75;
|
||||
}
|
||||
|
||||
.hljs-literal {
|
||||
color: #56b6c2;
|
||||
}
|
||||
|
||||
.hljs-string,
|
||||
.hljs-regexp,
|
||||
.hljs-addition,
|
||||
.hljs-attribute,
|
||||
.hljs-meta-string {
|
||||
color: #98c379;
|
||||
}
|
||||
|
||||
.hljs-built_in,
|
||||
.hljs-class .hljs-title {
|
||||
color: #e6c07b;
|
||||
}
|
||||
|
||||
.hljs-attr,
|
||||
.hljs-variable,
|
||||
.hljs-template-variable,
|
||||
.hljs-type,
|
||||
.hljs-selector-class,
|
||||
.hljs-selector-attr,
|
||||
.hljs-selector-pseudo,
|
||||
.hljs-number {
|
||||
color: #d19a66;
|
||||
}
|
||||
|
||||
.hljs-symbol,
|
||||
.hljs-bullet,
|
||||
.hljs-link,
|
||||
.hljs-meta,
|
||||
.hljs-selector-id,
|
||||
.hljs-title {
|
||||
color: #61aeee;
|
||||
}
|
||||
|
||||
.hljs-emphasis {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.hljs-strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.hljs-link {
|
||||
text-decoration: underline;
|
||||
}
|
||||
96
spring-cloud-zookeeper/2.2.0.M1/js/highlight/styles/atom-one-light.min.css
vendored
Normal file
96
spring-cloud-zookeeper/2.2.0.M1/js/highlight/styles/atom-one-light.min.css
vendored
Normal file
@@ -0,0 +1,96 @@
|
||||
/*
|
||||
|
||||
Atom One Light by Daniel Gamage
|
||||
Original One Light Syntax theme from https://github.com/atom/one-light-syntax
|
||||
|
||||
base: #fafafa
|
||||
mono-1: #383a42
|
||||
mono-2: #686b77
|
||||
mono-3: #a0a1a7
|
||||
hue-1: #0184bb
|
||||
hue-2: #4078f2
|
||||
hue-3: #a626a4
|
||||
hue-4: #50a14f
|
||||
hue-5: #e45649
|
||||
hue-5-2: #c91243
|
||||
hue-6: #986801
|
||||
hue-6-2: #c18401
|
||||
|
||||
*/
|
||||
|
||||
.hljs {
|
||||
display: block;
|
||||
overflow-x: auto;
|
||||
padding: 0.5em;
|
||||
color: #383a42;
|
||||
background: #fafafa;
|
||||
}
|
||||
|
||||
.hljs-comment,
|
||||
.hljs-quote {
|
||||
color: #a0a1a7;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.hljs-doctag,
|
||||
.hljs-keyword,
|
||||
.hljs-formula {
|
||||
color: #a626a4;
|
||||
}
|
||||
|
||||
.hljs-section,
|
||||
.hljs-name,
|
||||
.hljs-selector-tag,
|
||||
.hljs-deletion,
|
||||
.hljs-subst {
|
||||
color: #e45649;
|
||||
}
|
||||
|
||||
.hljs-literal {
|
||||
color: #0184bb;
|
||||
}
|
||||
|
||||
.hljs-string,
|
||||
.hljs-regexp,
|
||||
.hljs-addition,
|
||||
.hljs-attribute,
|
||||
.hljs-meta-string {
|
||||
color: #50a14f;
|
||||
}
|
||||
|
||||
.hljs-built_in,
|
||||
.hljs-class .hljs-title {
|
||||
color: #c18401;
|
||||
}
|
||||
|
||||
.hljs-attr,
|
||||
.hljs-variable,
|
||||
.hljs-template-variable,
|
||||
.hljs-type,
|
||||
.hljs-selector-class,
|
||||
.hljs-selector-attr,
|
||||
.hljs-selector-pseudo,
|
||||
.hljs-number {
|
||||
color: #986801;
|
||||
}
|
||||
|
||||
.hljs-symbol,
|
||||
.hljs-bullet,
|
||||
.hljs-link,
|
||||
.hljs-meta,
|
||||
.hljs-selector-id,
|
||||
.hljs-title {
|
||||
color: #4078f2;
|
||||
}
|
||||
|
||||
.hljs-emphasis {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.hljs-strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.hljs-link {
|
||||
text-decoration: underline;
|
||||
}
|
||||
76
spring-cloud-zookeeper/2.2.0.M1/js/highlight/styles/dracula.min.css
vendored
Normal file
76
spring-cloud-zookeeper/2.2.0.M1/js/highlight/styles/dracula.min.css
vendored
Normal file
@@ -0,0 +1,76 @@
|
||||
/*
|
||||
|
||||
Dracula Theme v1.2.0
|
||||
|
||||
https://github.com/zenorocha/dracula-theme
|
||||
|
||||
Copyright 2015, All rights reserved
|
||||
|
||||
Code licensed under the MIT license
|
||||
http://zenorocha.mit-license.org
|
||||
|
||||
@author Éverton Ribeiro <nuxlli@gmail.com>
|
||||
@author Zeno Rocha <hi@zenorocha.com>
|
||||
|
||||
*/
|
||||
|
||||
.hljs {
|
||||
display: block;
|
||||
overflow-x: auto;
|
||||
padding: 0.5em;
|
||||
background: #282a36;
|
||||
}
|
||||
|
||||
.hljs-keyword,
|
||||
.hljs-selector-tag,
|
||||
.hljs-literal,
|
||||
.hljs-section,
|
||||
.hljs-link {
|
||||
color: #8be9fd;
|
||||
}
|
||||
|
||||
.hljs-function .hljs-keyword {
|
||||
color: #ff79c6;
|
||||
}
|
||||
|
||||
.hljs,
|
||||
.hljs-subst {
|
||||
color: #f8f8f2;
|
||||
}
|
||||
|
||||
.hljs-string,
|
||||
.hljs-title,
|
||||
.hljs-name,
|
||||
.hljs-type,
|
||||
.hljs-attribute,
|
||||
.hljs-symbol,
|
||||
.hljs-bullet,
|
||||
.hljs-addition,
|
||||
.hljs-variable,
|
||||
.hljs-template-tag,
|
||||
.hljs-template-variable {
|
||||
color: #f1fa8c;
|
||||
}
|
||||
|
||||
.hljs-comment,
|
||||
.hljs-quote,
|
||||
.hljs-deletion,
|
||||
.hljs-meta {
|
||||
color: #6272a4;
|
||||
}
|
||||
|
||||
.hljs-keyword,
|
||||
.hljs-selector-tag,
|
||||
.hljs-literal,
|
||||
.hljs-title,
|
||||
.hljs-section,
|
||||
.hljs-doctag,
|
||||
.hljs-type,
|
||||
.hljs-name,
|
||||
.hljs-strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.hljs-emphasis {
|
||||
font-style: italic;
|
||||
}
|
||||
99
spring-cloud-zookeeper/2.2.0.M1/js/highlight/styles/github.min.css
vendored
Normal file
99
spring-cloud-zookeeper/2.2.0.M1/js/highlight/styles/github.min.css
vendored
Normal file
@@ -0,0 +1,99 @@
|
||||
/*
|
||||
|
||||
github.com style (c) Vasily Polovnyov <vast@whiteants.net>
|
||||
|
||||
*/
|
||||
|
||||
.hljs {
|
||||
display: block;
|
||||
overflow-x: auto;
|
||||
padding: 0.5em;
|
||||
color: #333;
|
||||
background: #f8f8f8;
|
||||
}
|
||||
|
||||
.hljs-comment,
|
||||
.hljs-quote {
|
||||
color: #998;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.hljs-keyword,
|
||||
.hljs-selector-tag,
|
||||
.hljs-subst {
|
||||
color: #333;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.hljs-number,
|
||||
.hljs-literal,
|
||||
.hljs-variable,
|
||||
.hljs-template-variable,
|
||||
.hljs-tag .hljs-attr {
|
||||
color: #008080;
|
||||
}
|
||||
|
||||
.hljs-string,
|
||||
.hljs-doctag {
|
||||
color: #d14;
|
||||
}
|
||||
|
||||
.hljs-title,
|
||||
.hljs-section,
|
||||
.hljs-selector-id {
|
||||
color: #900;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.hljs-subst {
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.hljs-type,
|
||||
.hljs-class .hljs-title {
|
||||
color: #458;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.hljs-tag,
|
||||
.hljs-name,
|
||||
.hljs-attribute {
|
||||
color: #000080;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.hljs-regexp,
|
||||
.hljs-link {
|
||||
color: #009926;
|
||||
}
|
||||
|
||||
.hljs-symbol,
|
||||
.hljs-bullet {
|
||||
color: #990073;
|
||||
}
|
||||
|
||||
.hljs-built_in,
|
||||
.hljs-builtin-name {
|
||||
color: #0086b3;
|
||||
}
|
||||
|
||||
.hljs-meta {
|
||||
color: #999;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.hljs-deletion {
|
||||
background: #fdd;
|
||||
}
|
||||
|
||||
.hljs-addition {
|
||||
background: #dfd;
|
||||
}
|
||||
|
||||
.hljs-emphasis {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.hljs-strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
83
spring-cloud-zookeeper/2.2.0.M1/js/highlight/styles/monokai-sublime.min.css
vendored
Normal file
83
spring-cloud-zookeeper/2.2.0.M1/js/highlight/styles/monokai-sublime.min.css
vendored
Normal file
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
|
||||
Monokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-license.org/
|
||||
|
||||
*/
|
||||
|
||||
.hljs {
|
||||
display: block;
|
||||
overflow-x: auto;
|
||||
padding: 0.5em;
|
||||
background: #23241f;
|
||||
}
|
||||
|
||||
.hljs,
|
||||
.hljs-tag,
|
||||
.hljs-subst {
|
||||
color: #f8f8f2;
|
||||
}
|
||||
|
||||
.hljs-strong,
|
||||
.hljs-emphasis {
|
||||
color: #a8a8a2;
|
||||
}
|
||||
|
||||
.hljs-bullet,
|
||||
.hljs-quote,
|
||||
.hljs-number,
|
||||
.hljs-regexp,
|
||||
.hljs-literal,
|
||||
.hljs-link {
|
||||
color: #ae81ff;
|
||||
}
|
||||
|
||||
.hljs-code,
|
||||
.hljs-title,
|
||||
.hljs-section,
|
||||
.hljs-selector-class {
|
||||
color: #a6e22e;
|
||||
}
|
||||
|
||||
.hljs-strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.hljs-emphasis {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.hljs-keyword,
|
||||
.hljs-selector-tag,
|
||||
.hljs-name,
|
||||
.hljs-attr {
|
||||
color: #f92672;
|
||||
}
|
||||
|
||||
.hljs-symbol,
|
||||
.hljs-attribute {
|
||||
color: #66d9ef;
|
||||
}
|
||||
|
||||
.hljs-params,
|
||||
.hljs-class .hljs-title {
|
||||
color: #f8f8f2;
|
||||
}
|
||||
|
||||
.hljs-string,
|
||||
.hljs-type,
|
||||
.hljs-built_in,
|
||||
.hljs-builtin-name,
|
||||
.hljs-selector-id,
|
||||
.hljs-selector-attr,
|
||||
.hljs-selector-pseudo,
|
||||
.hljs-addition,
|
||||
.hljs-variable,
|
||||
.hljs-template-variable {
|
||||
color: #e6db74;
|
||||
}
|
||||
|
||||
.hljs-comment,
|
||||
.hljs-deletion,
|
||||
.hljs-meta {
|
||||
color: #75715e;
|
||||
}
|
||||
70
spring-cloud-zookeeper/2.2.0.M1/js/highlight/styles/monokai.min.css
vendored
Normal file
70
spring-cloud-zookeeper/2.2.0.M1/js/highlight/styles/monokai.min.css
vendored
Normal file
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
Monokai style - ported by Luigi Maselli - http://grigio.org
|
||||
*/
|
||||
|
||||
.hljs {
|
||||
display: block;
|
||||
overflow-x: auto;
|
||||
padding: 0.5em;
|
||||
background: #272822; color: #ddd;
|
||||
}
|
||||
|
||||
.hljs-tag,
|
||||
.hljs-keyword,
|
||||
.hljs-selector-tag,
|
||||
.hljs-literal,
|
||||
.hljs-strong,
|
||||
.hljs-name {
|
||||
color: #f92672;
|
||||
}
|
||||
|
||||
.hljs-code {
|
||||
color: #66d9ef;
|
||||
}
|
||||
|
||||
.hljs-class .hljs-title {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.hljs-attribute,
|
||||
.hljs-symbol,
|
||||
.hljs-regexp,
|
||||
.hljs-link {
|
||||
color: #bf79db;
|
||||
}
|
||||
|
||||
.hljs-string,
|
||||
.hljs-bullet,
|
||||
.hljs-subst,
|
||||
.hljs-title,
|
||||
.hljs-section,
|
||||
.hljs-emphasis,
|
||||
.hljs-type,
|
||||
.hljs-built_in,
|
||||
.hljs-builtin-name,
|
||||
.hljs-selector-attr,
|
||||
.hljs-selector-pseudo,
|
||||
.hljs-addition,
|
||||
.hljs-variable,
|
||||
.hljs-template-tag,
|
||||
.hljs-template-variable {
|
||||
color: #a6e22e;
|
||||
}
|
||||
|
||||
.hljs-comment,
|
||||
.hljs-quote,
|
||||
.hljs-deletion,
|
||||
.hljs-meta {
|
||||
color: #75715e;
|
||||
}
|
||||
|
||||
.hljs-keyword,
|
||||
.hljs-selector-tag,
|
||||
.hljs-literal,
|
||||
.hljs-doctag,
|
||||
.hljs-title,
|
||||
.hljs-section,
|
||||
.hljs-type,
|
||||
.hljs-selector-id {
|
||||
font-weight: bold;
|
||||
}
|
||||
84
spring-cloud-zookeeper/2.2.0.M1/js/highlight/styles/solarized-light.min.css
vendored
Normal file
84
spring-cloud-zookeeper/2.2.0.M1/js/highlight/styles/solarized-light.min.css
vendored
Normal file
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
|
||||
Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull <sourdrums@gmail.com>
|
||||
|
||||
*/
|
||||
|
||||
.hljs {
|
||||
display: block;
|
||||
overflow-x: auto;
|
||||
padding: 0.5em;
|
||||
background: #fdf6e3;
|
||||
color: #657b83;
|
||||
}
|
||||
|
||||
.hljs-comment,
|
||||
.hljs-quote {
|
||||
color: #93a1a1;
|
||||
}
|
||||
|
||||
/* Solarized Green */
|
||||
.hljs-keyword,
|
||||
.hljs-selector-tag,
|
||||
.hljs-addition {
|
||||
color: #859900;
|
||||
}
|
||||
|
||||
/* Solarized Cyan */
|
||||
.hljs-number,
|
||||
.hljs-string,
|
||||
.hljs-meta .hljs-meta-string,
|
||||
.hljs-literal,
|
||||
.hljs-doctag,
|
||||
.hljs-regexp {
|
||||
color: #2aa198;
|
||||
}
|
||||
|
||||
/* Solarized Blue */
|
||||
.hljs-title,
|
||||
.hljs-section,
|
||||
.hljs-name,
|
||||
.hljs-selector-id,
|
||||
.hljs-selector-class {
|
||||
color: #268bd2;
|
||||
}
|
||||
|
||||
/* Solarized Yellow */
|
||||
.hljs-attribute,
|
||||
.hljs-attr,
|
||||
.hljs-variable,
|
||||
.hljs-template-variable,
|
||||
.hljs-class .hljs-title,
|
||||
.hljs-type {
|
||||
color: #b58900;
|
||||
}
|
||||
|
||||
/* Solarized Orange */
|
||||
.hljs-symbol,
|
||||
.hljs-bullet,
|
||||
.hljs-subst,
|
||||
.hljs-meta,
|
||||
.hljs-meta .hljs-keyword,
|
||||
.hljs-selector-attr,
|
||||
.hljs-selector-pseudo,
|
||||
.hljs-link {
|
||||
color: #cb4b16;
|
||||
}
|
||||
|
||||
/* Solarized Red */
|
||||
.hljs-built_in,
|
||||
.hljs-deletion {
|
||||
color: #dc322f;
|
||||
}
|
||||
|
||||
.hljs-formula {
|
||||
background: #eee8d5;
|
||||
}
|
||||
|
||||
.hljs-emphasis {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.hljs-strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
80
spring-cloud-zookeeper/2.2.0.M1/js/highlight/styles/zenburn.min.css
vendored
Normal file
80
spring-cloud-zookeeper/2.2.0.M1/js/highlight/styles/zenburn.min.css
vendored
Normal file
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
|
||||
Zenburn style from voldmar.ru (c) Vladimir Epifanov <voldmar@voldmar.ru>
|
||||
based on dark.css by Ivan Sagalaev
|
||||
|
||||
*/
|
||||
|
||||
.hljs {
|
||||
display: block;
|
||||
overflow-x: auto;
|
||||
padding: 0.5em;
|
||||
background: #3f3f3f;
|
||||
color: #dcdcdc;
|
||||
}
|
||||
|
||||
.hljs-keyword,
|
||||
.hljs-selector-tag,
|
||||
.hljs-tag {
|
||||
color: #e3ceab;
|
||||
}
|
||||
|
||||
.hljs-template-tag {
|
||||
color: #dcdcdc;
|
||||
}
|
||||
|
||||
.hljs-number {
|
||||
color: #8cd0d3;
|
||||
}
|
||||
|
||||
.hljs-variable,
|
||||
.hljs-template-variable,
|
||||
.hljs-attribute {
|
||||
color: #efdcbc;
|
||||
}
|
||||
|
||||
.hljs-literal {
|
||||
color: #efefaf;
|
||||
}
|
||||
|
||||
.hljs-subst {
|
||||
color: #8f8f8f;
|
||||
}
|
||||
|
||||
.hljs-title,
|
||||
.hljs-name,
|
||||
.hljs-selector-id,
|
||||
.hljs-selector-class,
|
||||
.hljs-section,
|
||||
.hljs-type {
|
||||
color: #efef8f;
|
||||
}
|
||||
|
||||
.hljs-symbol,
|
||||
.hljs-bullet,
|
||||
.hljs-link {
|
||||
color: #dca3a3;
|
||||
}
|
||||
|
||||
.hljs-deletion,
|
||||
.hljs-string,
|
||||
.hljs-built_in,
|
||||
.hljs-builtin-name {
|
||||
color: #cc9393;
|
||||
}
|
||||
|
||||
.hljs-addition,
|
||||
.hljs-comment,
|
||||
.hljs-quote,
|
||||
.hljs-meta {
|
||||
color: #7f9f7f;
|
||||
}
|
||||
|
||||
|
||||
.hljs-emphasis {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.hljs-strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
107
spring-cloud-zookeeper/2.2.0.M1/js/toc.js
Normal file
107
spring-cloud-zookeeper/2.2.0.M1/js/toc.js
Normal file
@@ -0,0 +1,107 @@
|
||||
var toctitle = document.getElementById('toctitle');
|
||||
var path = window.location.pathname;
|
||||
if (toctitle != null) {
|
||||
var oldtoc = toctitle.nextElementSibling;
|
||||
var newtoc = document.createElement('div');
|
||||
newtoc.setAttribute('id', 'tocbot');
|
||||
newtoc.setAttribute('class', 'js-toc desktop-toc');
|
||||
oldtoc.setAttribute('class', 'mobile-toc');
|
||||
oldtoc.parentNode.appendChild(newtoc);
|
||||
tocbot.init({
|
||||
contentSelector: '#content',
|
||||
headingSelector: 'h1, h2, h3, h4, h5',
|
||||
positionFixedSelector: 'body',
|
||||
fixedSidebarOffset: 90,
|
||||
smoothScroll: false
|
||||
});
|
||||
if (!path.endsWith("index.html") && !path.endsWith("/")) {
|
||||
var link = document.createElement("a");
|
||||
link.setAttribute("href", "index.html");
|
||||
link.innerHTML = "<span><i class=\"fa fa-chevron-left\" aria-hidden=\"true\"></i></span> Back to index";
|
||||
var block = document.createElement("div");
|
||||
block.setAttribute('class', 'back-action');
|
||||
block.appendChild(link);
|
||||
var toc = document.getElementById('toc');
|
||||
var next = document.getElementById('toctitle').nextElementSibling;
|
||||
toc.insertBefore(block, next);
|
||||
}
|
||||
}
|
||||
|
||||
var headerHtml = '<div id="header-spring">\n' +
|
||||
'<h1>\n' +
|
||||
'<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0"\n' +
|
||||
'viewBox="0 0 245.8 45.3" style="enable-background:new 0 0 245.8 45.3;" xml:space="preserve">\n' +
|
||||
'<g id="logos">\n' +
|
||||
'<g>\n' +
|
||||
'<path class="st0" d="M39.4,3.7c-0.6,1.5-1.4,2.8-2.3,4c-3.9-4-9.3-6.4-15.2-6.4c-11.7,0-21.3,9.5-21.3,21.3\n' +
|
||||
'c0,6.2,2.6,11.7,6.8,15.6l0.8,0.7c3.7,3.1,8.5,5,13.7,5c11.2,0,20.4-8.7,21.2-19.8C43.7,18.7,42.1,11.8,39.4,3.7z M10.5,38.3\n' +
|
||||
'c-0.6,0.8-1.8,0.9-2.6,0.3C7.1,37.9,7,36.8,7.6,36c0.6-0.8,1.8-0.9,2.6-0.3C11,36.4,11.1,37.5,10.5,38.3z M39.3,31.9\n' +
|
||||
'c-5.2,7-16.5,4.6-23.6,5c0,0-1.3,0.1-2.6,0.3c0,0,0.5-0.2,1.1-0.4c5-1.7,7.4-2.1,10.5-3.7c5.8-3,11.5-9.4,12.7-16.1\n' +
|
||||
'c-2.2,6.4-8.9,12-14.9,14.2c-4.2,1.5-11.7,3-11.7,3c0,0-0.3-0.2-0.3-0.2c-5.1-2.5-5.3-13.6,4-17.1c4.1-1.6,8-0.7,12.4-1.8\n' +
|
||||
'C31.6,14.1,37,10.6,39.2,6C41.7,13.3,44.7,24.8,39.3,31.9z"/>\n' +
|
||||
'<g>\n' +
|
||||
'<path class="st0" d="M55.2,30.9c-0.5-0.3-0.9-0.9-0.9-1.6c0-1.1,0.8-1.9,1.9-1.9c0.4,0,0.7,0.1,1,0.3c2,1.3,4.1,2,5.9,2\n' +
|
||||
'c2,0,3.2-0.9,3.2-2.2v-0.1c0-1.6-2.2-2.2-4.6-2.9c-3-0.9-6.5-2.1-6.5-6.1v-0.1c0-3.9,3.2-6.3,7.4-6.3c2.2,0,4.5,0.6,6.5,1.7\n' +
|
||||
'c0.7,0.4,1.1,1,1.1,1.8c0,1.1-0.9,1.9-2,1.9c-0.4,0-0.6-0.1-0.9-0.2c-1.7-0.9-3.4-1.4-4.9-1.4c-1.8,0-2.9,0.9-2.9,2v0.1\n' +
|
||||
'c0,1.5,2.2,2.2,4.7,2.9c3,0.9,6.4,2.3,6.4,6v0.1c0,4.3-3.4,6.5-7.7,6.5C60.4,33.3,57.6,32.5,55.2,30.9z"/>\n' +
|
||||
'<path class="st0" d="M72.5,14.3c0-1.3,1-2.4,2.3-2.4c1.3,0,2.4,1.1,2.4,2.4v1.4c1.5-2.2,3.7-3.9,7-3.9c4.8,0,9.6,3.8,9.6,10.7\n' +
|
||||
'v0.1c0,6.8-4.7,10.7-9.6,10.7c-3.4,0-5.6-1.7-7-3.6V37c0,1.3-1.1,2.4-2.4,2.4c-1.3,0-2.3-1-2.3-2.4V14.3z M89.1,22.7L89.1,22.7\n' +
|
||||
'c0-4.1-2.7-6.7-5.9-6.7c-3.2,0-6,2.7-6,6.6v0.1c0,4,2.8,6.6,6,6.6C86.4,29.3,89.1,26.7,89.1,22.7z"/>\n' +
|
||||
'<path class="st0" d="M95.7,14.3c0-1.3,1-2.4,2.3-2.4c1.3,0,2.4,1.1,2.4,2.4v1.1c0.2-1.8,3.1-3.5,5.2-3.5c1.5,0,2.3,1,2.3,2.3\n' +
|
||||
'c0,1.3-0.8,2.1-1.9,2.3c-3.4,0.6-5.7,3.5-5.7,7.6V31c0,1.3-1.1,2.3-2.4,2.3c-1.3,0-2.3-1-2.3-2.3V14.3z"/>\n' +
|
||||
'<path class="st0" d="M109.7,14.3c0-1.3,1-2.4,2.3-2.4c1.3,0,2.4,1.1,2.4,2.4V31c0,1.3-1.1,2.3-2.4,2.3c-1.3,0-2.3-1-2.3-2.3V14.3\n' +
|
||||
'z"/>\n' +
|
||||
'<path class="st0" d="M116.9,14.3c0-1.3,1-2.4,2.3-2.4c1.3,0,2.4,1.1,2.4,2.4v1c1.3-1.9,3.2-3.4,6.5-3.4c4.7,0,7.4,3.1,7.4,7.9V31\n' +
|
||||
'c0,1.3-1,2.3-2.3,2.3c-1.3,0-2.4-1-2.4-2.3v-9.7c0-3.2-1.6-5-4.4-5c-2.7,0-4.7,1.9-4.7,5.1V31c0,1.3-1.1,2.3-2.4,2.3\n' +
|
||||
'c-1.3,0-2.3-1-2.3-2.3V14.3z"/>\n' +
|
||||
'<path class="st0" d="M156.2,11.9c-1.3,0-2.4,1.1-2.4,2.4v1.4c-1.5-2.2-3.7-3.9-7-3.9c-4.9,0-9.6,3.8-9.6,10.7v0.1\n' +
|
||||
'c0,6.8,4.7,10.7,9.6,10.7c3.4,0,5.6-1.7,7-3.6c-0.2,3.7-2.5,5.7-6.5,5.7c-2.4,0-4.5-0.6-6.3-1.6c-0.2-0.1-0.5-0.2-0.9-0.2\n' +
|
||||
'c-1.1,0-2,0.9-2,2c0,0.9,0.5,1.6,1.3,1.9c2.5,1.2,5.1,1.8,8,1.8c3.7,0,6.6-0.9,8.5-2.8c1.7-1.7,2.7-4.3,2.7-7.8V14.3\n' +
|
||||
'C158.5,13,157.5,11.9,156.2,11.9z M147.9,29.2c-3.2,0-5.9-2.5-5.9-6.6v-0.1c0-4,2.7-6.6,5.9-6.6c3.2,0,6,2.7,6,6.6v0.1\n' +
|
||||
'C153.9,26.6,151.1,29.2,147.9,29.2z"/>\n' +
|
||||
'<path class="st0" d="M114.5,6.3c0,1.3-1.1,2.4-2.4,2.4c-1.3,0-2.4-1.1-2.4-2.4c0-1.3,1.1-2.4,2.4-2.4\n' +
|
||||
'C113.4,3.9,114.5,4.9,114.5,6.3z"/>\n' +
|
||||
'</g>\n' +
|
||||
'</g>\n' +
|
||||
'<g class="st1">\n' +
|
||||
'<g>\n' +
|
||||
'<g>\n' +
|
||||
'<g>\n' +
|
||||
'<path class="st2" d="M200.1,21.1H198V19h2.1V21.1z M200.1,32.9H198V22.6h2.1V32.9z"/>\n' +
|
||||
'</g>\n' +
|
||||
'<g>\n' +
|
||||
'<g>\n' +
|
||||
'<path class="st2" d="M212.5,22.6l-3,8.9c-0.5,1.5-1.4,1.6-2.2,1.6c-1.1,0-1.8-0.5-2.2-1.6l-2.5-7.4h-1v-1.5h2.6l2.6,8.3\n' +
|
||||
'c0.1,0.4,0.2,0.6,0.5,0.6c0.3,0,0.4-0.2,0.5-0.6l2.6-8.3H212.5z"/>\n' +
|
||||
'<path class="st2" d="M217.8,22.6c2.8,0,4.7,1.8,4.7,4.5v1.6c0,2.6-1.9,4.5-4.7,4.5c-2.8,0-4.7-1.8-4.7-4.5v-1.6\n' +
|
||||
'C213,24.4,215,22.6,217.8,22.6 M217.8,31.4c1.7,0,2.7-1.3,2.7-2.8v-1.6c0-1.5-1-2.8-2.7-2.8c-1.8,0-2.7,1.3-2.7,2.8v1.6\n' +
|
||||
'C215.1,30.2,216,31.4,217.8,31.4"/>\n' +
|
||||
'<path class="st2" d="M239.6,22.9c-1.1-0.3-2.7-0.5-4-0.5c-2.8,0-4.6,1.8-4.6,4.6v1.1c0,2.9,1.7,4.7,4.6,4.7c0.1,0,0.6,0,0.8,0\n' +
|
||||
'v-1.7c-0.1,0-0.7,0-0.8,0c-1.5,0-2.6-1.2-2.6-2.9v-1.1c0-1.8,1-2.9,2.6-2.9c0.7,0,1.7,0.1,2.1,0.1l0.1,0l0,8.6h2.1v-9.6\n' +
|
||||
'C240,23.1,240,23,239.6,22.9"/>\n' +
|
||||
'<rect x="242.1" y="19" class="st2" width="2.1" height="13.9"/>\n' +
|
||||
'<path class="st2" d="M190.5,19h-3.8v13.9h2.2V20.9h1.3c0.3,0,0.5,0,0.8,0c1.9,0,2.9,0.8,2.9,2.3c0,0.1,0,0.1,0,0.2\n' +
|
||||
'c0,1.4-0.8,2.3-2.9,2.3c-0.2,0-0.4,0-0.6,0c0,0.5,0,1.5,0,1.9c0.2,0,0.4,0,0.6,0c3,0,5.2-1.2,5.2-4.2c0-0.1,0-0.1,0-0.2\n' +
|
||||
'C196.2,20.2,193.9,19,190.5,19"/>\n' +
|
||||
'<path class="st2" d="M226.3,20.4v2.2h3.5v1.7h-3.5v6c0,0.9,0.6,1,1.5,1h2v1.7H227c-2,0-2.9-0.8-2.9-2.6v-9.6L226.3,20.4z"/>\n' +
|
||||
'</g>\n' +
|
||||
'</g>\n' +
|
||||
'</g>\n' +
|
||||
'</g>\n' +
|
||||
'<g>\n' +
|
||||
'<path class="st2" d="M167.7,32.9v-10h1.1v3.8c0.6-0.8,1.5-1.3,2.4-1.3c1.9,0,3.2,1.5,3.2,3.8c0,2.4-1.3,3.8-3.2,3.8\n' +
|
||||
'c-1,0-1.9-0.5-2.4-1.3v1.1H167.7z M171,32.1c1.5,0,2.3-1.2,2.3-2.8c0-1.6-0.9-2.8-2.3-2.8c-0.9,0-1.8,0.5-2.2,1.2v3.3\n' +
|
||||
'C169.2,31.6,170.1,32.1,171,32.1z"/>\n' +
|
||||
'<path class="st2" d="M175.9,34.7c0.2,0.1,0.4,0.1,0.6,0.1c0.5,0,0.8-0.2,1.1-0.8l0.5-1.1l-3-7.3h1.2l2.4,5.9l2.4-5.9h1.2\n' +
|
||||
'l-3.6,8.7c-0.4,1-1.2,1.5-2.1,1.5c-0.2,0-0.6,0-0.8-0.1L175.9,34.7z"/>\n' +
|
||||
'</g>\n' +
|
||||
'</g>\n' +
|
||||
'</g>\n' +
|
||||
'</svg>\n' +
|
||||
'\n' +
|
||||
'</h1>\n' +
|
||||
'</div>';
|
||||
|
||||
var header = document.createElement("div");
|
||||
header.innerHTML = headerHtml;
|
||||
document.body.insertBefore(header, document.body.firstChild);
|
||||
1
spring-cloud-zookeeper/2.2.0.M1/js/tocbot/tocbot.css
Normal file
1
spring-cloud-zookeeper/2.2.0.M1/js/tocbot/tocbot.css
Normal file
@@ -0,0 +1 @@
|
||||
.toc{overflow-y:auto}.toc>.toc-list{overflow:hidden;position:relative}.toc>.toc-list li{list-style:none}.toc-list{margin:0;padding-left:10px}a.toc-link{color:currentColor;height:100%}.is-collapsible{max-height:1000px;overflow:hidden;transition:all 300ms ease-in-out}.is-collapsed{max-height:0}.is-position-fixed{position:fixed !important;top:0}.is-active-link{font-weight:700}.toc-link::before{background-color:#EEE;content:' ';display:inline-block;height:inherit;left:0;margin-top:-1px;position:absolute;width:2px}.is-active-link::before{background-color:#54BC4B}
|
||||
1
spring-cloud-zookeeper/2.2.0.M1/js/tocbot/tocbot.min.js
vendored
Normal file
1
spring-cloud-zookeeper/2.2.0.M1/js/tocbot/tocbot.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user