Eureka 2.0 开源工作宣告停止,对于注册中心来说 Consul 是个更好的选择。
consul 介绍
Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案,比如 Airbnb的SmartStack等相比,Consul的方案更“一站式”,内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。使用起来也较 为简单。Consul用Golang实现,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与Docker等轻量级容器可无缝配合。
一、Consul 安装
下载:
https://www.consul.io/downloads.html
解压:
Consul 安装包解压完成之后就是一个可执行程序,直接运行即可。
Consul 默认启动为 dev 模式,重启后丢失数据,启动参数详解请见附录部分。
启动:
1、Windows:
consul.exe agent -server -bootstrap -advertise 127.0.0.1 -data-dir ./data -ui
2、Linux:
consul agent -server -bootstrap -advertise 127.0.0.1 -data-dir ./data -ui
3、Mac:
//添加到usr/local/bin目录,就可以在任何地方访问 consul
sudo cp consul /usr/local/bin
//consul 如果没有可执行权限
sudo chmod a+x consul
consul agent -server -bootstrap -advertise 127.0.0.1 -data-dir ./data -ui
consul 已经成功启动。
二、创建consul-demo注入到 consul 服务中
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies>
<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>
</dependencies>
<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>
application.yml
management:
endpoints:
web:
exposure:
include: '*'
spring:
application:
name: consul-demo
cloud:
consul:
host: 127.0.0.1
port: 8500
App.java
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
启动 consul-demo……
刷新127.0.0.1:8500
可以看到我们的微服务已经成功的注入到了 consul 中。
三、consul 中key/value的使用
新建 consul-demo-1工程
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies>
<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-all</artifactId>
</dependency>
</dependencies>
<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>
这里spring-cloud-starter-consul-all 包含了:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-bus</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
bootstrap.yml:
spring:
application:
name: consul-demo-1
cloud:
consul:
host: 127.0.0.1
port: 8500
config:
format: yaml
server:
port: 8081
App.java
@SpringBootApplication
@RestController
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
@Autowired
ServerProperties serverProperties;
@RequestMapping("port" )
public String port(){
return "配置文件中的 port="+serverProperties.getPort();
}
}
启动……
在 log 中,propertySources=[ConsulPropertySource {name='config/consul-demo-1/'}, ConsulPropertySource {name='config/application/'}]
注意:application
为所有服务的通用配置,consul-demo-1为consul-demo-1专属配置。
在consul 中添加配置信息:
点击保存后,在 consul-demo-1在控制台打印了:
配置文件中的 server.port已发生改变,但是consul-demo-1服务的端口还是8081,重启consul-demo-1……