consul是分布式的、高可用、横向扩展的。consul提供的一些关键特性:
服务发现(service discovery):consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。健康检查(health checking):健康检测使consul可以快速的告警在集群中的操作;和服务发现的集成,可以防止服务转发到故障的服务上面。Key/Value存储(key/value storage):一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。多数据中心(multi-datacenter):无需复杂的配置,即可支持任意数量的区域。由于 Spring Cloud 对微服务基本组件做了一层抽象,因此对于对各组件的具体实现来说,我们可以无缝切换的,这也是面向抽象编程带来的好处。
所以我们要将 Eureka 换成 Consul 也是非常容易:
启动 consul切换服务提供者的依赖为 spring cloud consul,并修改其配置官网下载地址:https://www.consul.io/downloads.html
去官网下载相应版本,然后解压缩
进入 consul.exe 所在目录,然后执行如下命令即可:
consul agent -dev启动成功后,访问 consul 可视化页面,如下图所示
http://localhost:8500/
这里我们创建一个子模块,创建步骤同 SpringCloud_01_Discovery_01_Eureka入门示例
子模块信息如下:
group = 'com.ray.study' artifact ='spring-cloud-01-discovery-02-consul-client'在父工程spring-cloud-seeds 的 settings.gradle加入子工程
rootProject.name = 'spring-cloud-seeds' include 'spring-cloud-01-discovery-01-eureka-server' include 'spring-cloud-01-discovery-01-eureka-client' include 'spring-cloud-01-discovery-02-consul-client'这样,子工程spring-cloud-01-discovery-02-consul-client就会自动继承父工程中subprojects 函数里声明的项目信息
将子模块spring-cloud-01-discovery-02-consul-client 的build.gradle修改为如下内容:
dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' // consul client implementation 'org.springframework.cloud:spring-cloud-starter-consul-discovery' // actuator client implementation 'org.springframework.boot:spring-boot-starter-actuator' }按照需要修改 consul-client 相关配置
可选配置项可查看 consul 的配置类:ConsulProperties、ConsulDiscoveryProperties
或者查看 spring-cloud-consul-discoveryjar包中的META-INF\spring-configuration-metadata.json文件
部分默认配置如下:
spring: cloud: consul: host: localhost # Consul agent hostname ,即consul服务端host port: 8500 # Consul agent port enabled: true # Is spring cloud consul enabled :是否启用spring cloud consul discovery: enabled: true # 是否启用服务发现 health-check-path: /actuator/health # 健康检查地址 health-check-interval: 10s # 健康检查间隔 prefer-ip-address: false # 注册时使用ip而不是hostname在启动类上添加@EnableDiscoveryClient注解即可启用服务发现
package com.ray.study.springcloud01discovery02consulclient; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDiscoveryClient @SpringBootApplication public class SpringCloud01Discovery02ConsulClientApplication { public static void main(String[] args) { SpringApplication.run(SpringCloud01Discovery02ConsulClientApplication.class, args); } }这里我们写一个简单的controller,获取一下可用的服务列表
package com.ray.study.springcloud01discovery02consulclient.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * description * * @author shira 2019/05/20 19:57 */ @RestController public class HelloController { @Autowired private DiscoveryClient discoveryClient; @Value("${server.port}") private String port; @GetMapping("/") public List<String> listServices(){ List<String> services = discoveryClient.getServices(); return services; } @GetMapping("/hello") public String sayHello(){ return "the service on prot:"+port+" says hello!"; } }按照 SpringBoot 工程启动方式启动本工程,然后访问 consul 的图形化界面:
http://localhost:8500/
如下图所示,在注册中心的服务列表已经可以看到本服务了
访问 HelloController :
http://localhost:8763/