Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其它分布式服务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与发现框架、分布式一致性协议实现、健康检查、Key/Value 存储(配置中心)、多数据中心方案,不再需要依赖其它工具(比如 ZooKeeper 等),使用起来也较为简单。

  Consul 使用 Go 语言编写,因此具有天然可移植性(支持Linux、Windows 和 Mac OS);安装包仅包含一个可执行文件,方便部署,与 Docker 等轻量级容器可无缝配合。

 

主要的功能是注册中心和配置中心;

consul下载

f1c0e454965a8cf91dd0925eb4f1ca6a.png

下载完成后解压

8481d914d4783932c9f5eca934afede1.png

在路径上输入cmd,打开 命令提示符 输入 consul.exe agent -dev;启动consul

c40beb1df2a23278478907d86454d4d0.png

 启动成功后,访问路径:http://127.0.0.1:8500

dcc1f54cb71e0dd2c33c871d9acf9fca.png

Services(服务中心):向conusl中注册的服务都会显示在这上面;

Key/Value(配置中心):存放服务配置文件;

缺点:通过 consul.exe agent -dev 启动的服务,当关闭命令提示符,consul就会被关闭,而且服务中心和配置中心都会被清除,这样就无法永久保留;

持久化

其实就是把consul 注册成一个服务在后台运行;

在consul.exe 目录下创建一个 XX.bat文件

96f0b905af386bfc99be7de2aacf4364.png

在consul_start.bat 文件中输入以下命令,然后运行

@echo.service startup......  
@echo off  
@sc create Consul binpath= "E:\java\consul\consul.exe agent -server -ui -bind=127.0.0.1 -client=127.0.0.1 -bootstrap-expect  1  -data-dir E:\java\consul\data"
@net start Consul
@sc config Consul start= AUTO  
@echo.Consul starting success! 
@pause

说明

sc create :创建windows服务的命令
Consul :是我们的服务名
binPath:程序的一些路径和别的配置
	-client:改成自己的ip
	-data-dir:数据持久化的数据存放在哪

运行以后,就可以看到consul被注册到服务中,这样就可以保证consul一直在后台运行了;

a9c820f433ff2fed6ef632b2c4ee2dcc.png

SpringBoot 集成 consul

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>Greenwich.SR5</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

启动类上添加 @EnableDiscoveryClient

主要作用就是能被服务中心发现并且注册

@SpringBootApplication
@EnableDiscoveryClient
public class TextApplication {

    public static void main(String[] args) {
        SpringApplication.run(TextApplication.class, args);
    }

}

配置,consul的配置信息一般写在 bootstrap.properties 文件中

b16418f6e0c540e2b8b15d3c04c313f4.png

application.properties

server.port=8090
server.address=127.0.0.1

bootstrap.properties

spring.application.name=text

# consul 服务地址
spring.cloud.consul.host=127.0.0.1
# consul 服务端口
spring.cloud.consul.port=8500

# 服务 ip
spring.cloud.consul.discovery.hostname=192.168.96.138
# 实例名称
spring.cloud.consul.discovery.service-name=${spring.application.name}
# 是否使用ip地址注册(开启后可以在web界面看到实例ip)
spring.cloud.consul.discovery.prefer-ip-address=true
# 注册的实例id  必须唯一
spring.cloud.consul.discovery.instance-id=${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
# 健康检测 API
spring.cloud.consul.discovery.health-check-path=/actuator/health
# 健康检测间隔时间
spring.cloud.consul.discovery.health-check-interval=10s
# 使用心跳检查push机制定期向consul server汇报自身存活情况,逾期没有汇报则server认为异常
spring.cloud.consul.discovery.heartbeat.enabled=true

实例ID:必须是唯一,一般以 服务名称-服务ip-服务端口 做为ID 注册;除了在配置文件中 配置实例ID外,我们还可以通过代码的形式实现自定义配置;

@Configuration
public class ImccConsulServiceRegistry extends ConsulServiceRegistry {

    private final Logger logger = LoggerFactory.getLogger(ImccConsulServiceRegistry.class);

    private ConsulDiscoveryProperties properties;

    private ConsulClient consulClient;

    public ImccConsulServiceRegistry(ConsulClient client, ConsulDiscoveryProperties properties, @Autowired(required = false) TtlScheduler ttlScheduler, HeartbeatProperties heartbeatProperties) {
        super(client, properties, ttlScheduler, heartbeatProperties);
        this.properties = properties;
        this.consulClient = client;
    }

    @SneakyThrows
    @Override
    public void register(ConsulRegistration reg) {
        //获取服务器的ip
        String address = Inet4Address.getLocalHost().getHostAddress();
        NewService newService = reg.getService();
        newService.setAddress(address);
        newService.setId(reg.getService().getName() + "-" + address.replace(".", "-") + "-" + reg.getService().getPort());
        logger.info("consul注册服务,NewService:{}", newService.toString());
        super.register(reg);
    }

}

注册成功

a8b81fff95c54317931fc423988cea92.png 配置中心

在bootstrap.properties 文件中 加入配置中心信息


#  开启配置中心
spring.cloud.consul.config.enabled=true 
#环境分隔符,默认值 ",例如config/application,dev/data修改后是config/application-dev/data
spring.cloud.consul.config.profile-separator=-
# 配置文件的文件格式
spring.cloud.consul.config.format=properties
# 设置应用的文件夹名称
spring.cloud.consul.config.default-context=${spring.application.name}
# 配置文件的存储的根路径,默认为config
spring.cloud.consul.config.prefix=config
# 配置文件存储key的值,或者理解为文件的名称,默认为data
spring.cloud.consul.config.data-key=data
# 启用配置自动刷新
spring.cloud.consul.config.watch.enabled=true
# 刷新延迟时间,单位:秒
spring.cloud.consul.config.watch.wait-time=1
# 刷新频率,单位:毫秒
spring.cloud.consul.config.watch.delay=10000

consul 配置

88f9253715894286fbaf8f10ee3ce1ef.png

 测试

@RestController
@RequestMapping("/text")
public class TextController {

    @Value("${value}")
    private String value;

    @GetMapping("/skyWalking")
    public String skyWalking(){
        return value;
    }
}

642e701eac5eb1cbeb123aa68aba6218.png

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐