czb1n

不是谁的谁,在乎你是你

0%

学习SpringCloud之服务注册与发现Consul

简介

  • SpringCloudConsulSpringCloudEureka一样是作用于微服务架构中的服务治理。
    由于Eureka已经停止维护,Consul是一个很好的替代品。

  • 除了服务治理以外,Consul还提供一个简易的键/值储存,这可以用于作为动态配置等等。

以下示例均基于SpringCloud的Greenwich.SR1版本,Consul版本为v1.4.4,且需要依赖到之前介绍SpringCloud相关的文章

基础依赖

1
2
3
4
5
6
7
8
9
10
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
</dependencies>

ConsulServer

使用前需先安装、运行Consul的服务端,具体可以参考官网的安装教程
简单说一下流程:

  1. 下载页面下载自己环境适用的版本。
  2. 执行以下命令以开发环境启动Consul的服务端。
    1
    consul agent -dev -bind=127.0.0.1 -client=0.0.0.0

Consul的默认端口是8500,访问http://localhost:8500可以看到Consul的控制面板。

  • Services:显示所有服务的信息、状态。
  • Nodes:显示所有的节点。
  • Key/Value:显示所有的键值对。
    • http://127.0.0.1:8500/v1/kv/?recurse 列出所有的键值对。
    • http://127.0.0.1:8500/v1/kv/{key} 获取单个键的值。
  • ACL:访问控制列表配置。
  • Intentions:服务连接配置。

ConsulClient

配置文件application.yml中,指定ConsulServer的地址。

1
2
3
4
5
6
7
8
9
10
server:
port: 6610

spring:
application:
name: consul-client
cloud:
consul:
host: localhost
port: 8500

这里官方文档中提到需要注意一点。

If you use Spring Cloud Consul Config, the above values will need to be placed in bootstrap.yml instead of application.yml.

像Eureka一样,启动一个简单的SpringBoot应用,并作一个简单的controller去测试。

1
2
3
4
5
6
@SpringBootApplication
class ConsulClientStarter

fun main(args: Array<String>) {
runApplication<ConsulClientStarter>(*args)
}
1
2
3
4
5
6
7
8
9
10
11
12
@RestController
class DemoController {

@Value("\${server.port}")
var port: String? = null

@RequestMapping("/hello")
fun hello(@RequestParam("name") name: String): String {
return "response from $port: hello $name."
}

}

启动两个端口分别为66106611ConsulClient,再新建一个模块,以Ribbon的方式去调用服务,测试一下服务发现。

1
2
3
4
5
6
7
8
9
10
server:
port: 6612

spring:
application:
name: consul-ribbon-client
cloud:
consul:
host: localhost
port: 8500
1
2
3
4
5
6
7
@SpringBootApplication
@EnableDiscoveryClient
class ConsulRibbonClientStarter

fun main(args: Array<String>) {
runApplication<ConsulRibbonClientStarter>(*args)
}
1
2
3
4
5
6
7
8
9
10
11
12
@RestController
class DemoController {

@Autowired
lateinit var restTemplate: RestTemplate

@RequestMapping("/hello")
fun hello(@RequestParam("name") name: String): String? {
return restTemplate.getForObject("http://CONSUL-CLIENT/hello?name=$name", String::class.java)
}

}

启动好各个服务后,再看看Consul的控制面板中的Services可以看到多了两个服务。
其中ConsulClient有两个实例,ConsulRibbonClient有一个实例。
每个服务的信息中,有一个项为Health Checks健康检查。
这个健康检查是Consul定时访问一个各个服务提供的检查接口。
例如其中一个ConsulClient提供的接口为http://localhost:6610/actuator/health,返回{"status":"UP"}
每个服务也可以单独指定健康检查的接口。

多次访问http://localhost:6612/hello?name=czb1n,页面轮流返回response from 6610: hello czb1n.response from 6611: hello czb1n.

其他

示例代码地址: https://github.com/czb1n/learn-spring-cloud-with-kotlin