社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
参考SPING CLOID 官方 http://cloud.spring.io/spring-cloud-consul/ 和consul官方文档 https://www.consul.io/intro/getting-started/install.html
要想利用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的启动过程如下:
输入命令:./consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -node=n1 -bind=192.168.0.98 -dc=dc1
输入命令: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可以查看到如下内容:
我们建立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.boot.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
}
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!