您的位置:首页 > 编程语言 > Java开发

使用Spring Cloud Consul实现服务的注册和发现

2017-01-22 14:38 1151 查看

1 搭建consul环境

参考SPING CLOID 官方  http://cloud.spring.io/spring-cloud-consul/  和consul官方文档 https://www.consul.io/intro/getting-started/install.html


2 建立Consul Cluster

要想利用Consul提供的服务实现服务的注册与发现,我们需要建立Consul Cluster。在Consul方案中,每个提供服务的节点上都要部署和运行Consul的agent,所有运行Consul agent节点的集合构成Consul Cluster。Consul agent有两种运行模式:Server和Client。这里的Server和Client只是Consul集群层面的区分,与搭建在Cluster之上 的应用服务无关。以Server模式运行的Consul agent节点用于维护Consul集群的状态,官方建议每个Consul Cluster至少有3个或以上的运行在Server mode的Agent,Client节点不限。


项目规划,2个服务端,1个客户端

(n1 centos7)192.168.0.98 server mode

(n1 windwos10 )192.168.0.211 server mode with Consul Web UI

(n1 centos7)192.168.0.97 client mode

在三台主机上分别下载和安装Consul包,安装包很简单,只是包含一个可执行文件consul。在n2主机上还要下载一份Consul Web UI包,支持图形化展示Consul cluster中的节点状态和服务状态。

Consul Cluster的启动过程如下:

n1主机:

输入命令:
./consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -node=n1 -bind=192.168.0.98 -dc=dc1




n2主机:

输入命令:
consul.exe agent -server -bootstrap-expect 2 -data-dir ./consul_data -node=n2 -bind=192.168.0.211 -ui-dir ./consul_ui  -dc=dc1




从两个server agent的启动日志可以看出,n1、n2启动后并不知道集群其他节点的存在。以n1为例,通过consul members和consul info查看当前agent状态:

consul members

Node Address Status Type Build Protocol DC

n1 192.168.0.98:8301 alive server 0.5.2 2 dc1

$ consul info

… …

consul:

bootstrap = false

known_datacenters = 1

leader = false

server = true

raft:

applied_index = 0

commit_index = 0

fsm_pending = 0

last_contact = never

last_log_index = 0

last_log_term = 0

last_snapshot_index = 0

last_snapshot_term = 0

num_peers = 0

state = Follower

term = 0

… …

可以看出,n1上的agent当前状态是Follower,bootstrap = false;n2同样也是这个情况。整个Cluster并未完成Bootstrap过程。

我们用consul join命令触发Cluster bootstrap过程,我们在n1上执行如下命令:

$ consul join 192.168.0.211

Successfully joined cluster by contacting 1 nodes.

我们通过consul join子命令将当前节点加入包含成员192.168.0.211(也就是n2)的集群中去。命令执行结果通过n1和n2的日志可以观察到

接下来我们启动n3上的client mode agent:

输入命令:
./consul agent  -data-dir ./consul_data  -node=n3 -bind=192.168.0.97  -dc=dc1


在n3上join n1后 ./consul join 192.168.0.98

n3上consul members可以查看到如下内容:



3 服务注册与发现

我们建立Consul Cluster是为了实现服务的注册和发现。Consul支持两种服务注册的方式,一种是通过Consul的服务注册HTTP API,由服务自身在启动后调用API注册自己,另外一种则是通过在配置文件中定义服务的方式进行注册。Consul文档中建议使用后面一种方式来做服务 配置和服务注册。

一:服务端1:

项目依赖

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-consul-dependencies</artifactId>
<version>1.0.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
</dependencies>


注意,增加spring-boot-actuator是为了项目可以访问/health 路径来判断服务是否健康

import org.springframework.boot.SpringApplication;
import org.springframework.boo
4000
t.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class ConsulApp {

@RequestMapping("/home")
public Object home() {
System.out.println("1111111111111");
return "OK11";
}

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


application.properties 配置内容

server.port=9955
spring.application.name=chaoge
spring.cloud.consul.host=192.168.0.98
spring.cloud.consul.port=8500
spring.cloud.consul.enabled=true
spring.cloud.consul.discovery.enabled=true
spring.cloud.consul.discovery.instanceId=tomcat1
spring.cloud.consul.discovery.serviceName=tomcat
spring.cloud.consul.discovery.hostname=192.168.2.95
spring.cloud.consul.discovery.port=${server.port}
spring.cloud.consul.discovery.healthCheckUrl=http://192.168.0.211:9955/health
spring.cloud.consul.discovery.healthCheckInterval=10s
spring.cloud.consul.discovery.tags=dev


由于我们增加了@EnableDiscoveryClient注解,所以,系统启动的时候,就会向consul注册一个服务,服务的名字为tomcat, ID为tomcat1

访问consul的HTTP API /v1/catalog/service/chaoge 输出如下:

{
"Node":"192.168.1.100",
"Address":"192.168.1.100",
"ServiceID":"tomcat1",
"ServiceName":"chaoge",
"ServiceTags":["dev"],
"ServiceAddress":"192.168.2.95",
"ServicePort":9955,
"ServiceEnableTagOverride":false,
"CreateIndex":993,
"ModifyIndex":1057
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring 微服务 架构
相关文章推荐