consul作为注册中心
consul提供的功能
- 支持多数据中心的服务注册,服务发现和服务配置
- 基于raft试下一致性算法
- 使用gossip协议管理成员状态和广播消息
- 支持ACL访问控制
consul的特点
- 高效的raft一致性算法
- 支持多数据中心
- 监控检查
- http和DNS支持
多个注册中心的对比
功能 | eureka | consul | zookeeper | etcd |
---|---|---|---|---|
服务监控检查 | 支持 | 支持(服务状态,内存,磁盘) | 弱支持(长连接 keeplived) | 连接心跳 |
多数据中心 | 不支持 | 支持 | 不支持 | 不支持 |
key-val存储服务 | 不支持 | 支持 | 支持 | 支持 |
一致性 | 不支持 | 支持 | 支持 | 支持 |
CAP | AP | CP | CP | CP |
使用接口 | http | http 和dns | 客户端 | http grpc |
watch支持 | 支持long poling(长轮询) | 支持long poling | 支持 | 支持long poling |
自身监控 | 支持 | 支持 | 不支持 | metrics |
安全 | spring-secrity | acl https | ACL | https |
springcloud集成 | 支持 | 支持 | 支持 | 支持 |
consul服务的构成
- server(多机器部署,一般是基数位的机器,leader负责写入。同数据中心使用LAN,不同数据中心使用WAN)
consul运行
/usr/local/bin/consul agent -dev -ui=true -client 0.0.0.0 &
spring服务运行
maven配置
代码语言:txt复制<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>kconsul</artifactId>
<groupId>cn.beckbi</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>kconsul-server</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<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.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
server端
代码语言:txt复制@RestController
public class UserController {
private ObjectMapper mapper = new ObjectMapper();
@RequestMapping("/info")
public String info() throws JsonProcessingException {
@Data
class User {
private String name;
private int age;
}
User user = new User();
user.setName("tom");
user.setAge(21);
return mapper.writeValueAsString(user);
}
}
spring.application.name=consul-server
server.port=7301
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.service-name=consul-server-producer
client 端
代码语言:txt复制@Slf4j
@RestController
public class ApiController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
@RequestMapping("/info")
public String info() {
ServiceInstance serviceInstance = loadBalancerClient.choose("consul-server-producer");
log.info("url:" serviceInstance.getUri());
log.info("url:" serviceInstance.getServiceId());
return restTemplate.getForObject(
serviceInstance.getUri().toString() "/info", String.class
);
}
}
@Configuration
public class RestConfig {
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
spring.application.name=consul-client-consumer
server.port=7302
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.service-name=consul-client-consumer