一、consul 简介
Consul是一种服务发现和配置工具。Consul具有分布式,高可用性和极高的可扩展性。
- 服务发现 - 使用简单的服务来注册自己并通过DNS或HTTP接口发现其他服务。也可以注册SaaS提供商等外部服务。
- 运行状况检查 - 运行状况检查使Consul能够快速向运营商发出有关群集中任何问题的警报
与服务发现的集成可防止将流量路由到不健康的主机,并启用服务级别的断路器。 - 密钥/值存储 - 灵活的密钥/值存储可以存储动态配置,功能标记,协调,leader选举等。简单的HTTP API使其易于在任何地方使用。
多数据中心 - Consul可以识别数据中心,并且可以支持任意数量的区域而无需复杂的配置。 - 服务分段 - Consul Connect通过自动TLS加密和基于身份的授权实现安全的服务到服务通信。
官网地址:https://www.hashicorp.com/products/consul/
github:https://github.com/hashicorp/consul
注意:在本地启用consul 需要通过cmd 命令行,详见:
https://jingyan.baidu.com/article/ca41422f732f961eaf99ed5f.html
二、SpringCloud 用 consul作为注册中心
2.1 服务提供方
1) pom依赖
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
2)配置文件
application.properties
#0表示服务器随机端口
server.port=0
#consul 地址
spring.cloud.consul.host=localhost
#consul 端口
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.prefer-ip-address=true
bootstrap.properties
#服务名称
spring.application.name=waiter-service
3)代码配置
@SpringBootApplication
@EnableDiscoveryClient
public class WaiterServiceApplication implements WebMvcConfigurer {
public static void main(String[] args) {
SpringApplication.run(WaiterServiceApplication.class, args);
}
}
2.2 服务消费方
1) pom依赖
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
2)配置文件
application.properties
#0表示服务器随机端口
server.port=0
#consul 地址
spring.cloud.consul.host=localhost
#consul 端口
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.prefer-ip-address=true
bootstrap.properties
#服务名称
spring.application.name=customer-service
3)代码配置
@SpringBootApplication
@Slf4j
@EnableDiscoveryClient
public class CustomerServiceApplication {
public static void main(String[] args) {
SpringApplication.run(CustomerServiceApplication.class, args);
}
@Bean
public HttpComponentsClientHttpRequestFactory requestFactory() {
PoolingHttpClientConnectionManager connectionManager =
new PoolingHttpClientConnectionManager(30, TimeUnit.SECONDS);
connectionManager.setMaxTotal(200);
connectionManager.setDefaultMaxPerRoute(20);
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(connectionManager)
.evictIdleConnections(30, TimeUnit.SECONDS)
.disableAutomaticRetries()
// 有 Keep-Alive 认里面的值,没有的话永久有效
//.setKeepAliveStrategy(DefaultConnectionKeepAliveStrategy.INSTANCE)
// 换成自定义的
.setKeepAliveStrategy(new CustomConnectionKeepAliveStrategy())
.build();
HttpComponentsClientHttpRequestFactory requestFactory =
new HttpComponentsClientHttpRequestFactory(httpClient);
return requestFactory;
}
@LoadBalanced
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder
.setConnectTimeout(Duration.ofMillis(100))
.setReadTimeout(Duration.ofMillis(500))
.requestFactory(this::requestFactory)
.build();
}
}
2.3 验证 服务注册结果
注意:
- 本地运行的时候,consul服务重启后, 节点无法重新自动注册到 注册中心,需要重启节点服务;
- 在网上看到 consul 集群模式的时候,还有节点上下线节点信息无法更新问题;