使用Spring Cloud Consul实现服务的注册和发现 - Go语言中文社区

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


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.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  
}
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_25353539/article/details/54668432
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-05-17 03:52:49
  • 阅读 ( 517 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢