Consul详细教程(SpringBoot案例)

Consul的简单介绍和基本使用

Consul简单介绍

consul是google开源的一个使用go语言开发的服务发现、配置管理中心服务。内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。服务部署简单,只有一个可运行的二进制的包。每个节点都需要运行agent,他有两种运行模式server和client。每个数据中心官方建议需要3或5个server节点以保证数据安全,同时保证server-leader的选举能够正确的进行。

👀️ https://www.consul.io/intro/index.html

Consul的功能

  • client
    CLIENT表示consul的client模式,就是客户端模式。是consul节点的一种模式,这种模式下,所有注册到当前节点的服务会被转发到SERVER,本身是不持久化这些信息。
  • server
  • SERVER表示consul的server模式,表明这个consul是个server,这种模式下,功能和CLIENT都一样,唯一不同的是,它会把所有的信息持久化的本地,这样遇到故障,信息是可以被保留的。
  • server-leader
    中间那个SERVER下面有LEADER的字眼,表明这个SERVER是它们的老大,它和其它SERVER不一样的一点是,它需要负责同步注册的信息给其它的SERVER,同时也要负责各个节点的健康监测。
  • raft
    server节点之间的数据一致性保证,一致性协议使用的是raft,而zookeeper用的paxos,etcd采用的也是raft。
  • 服务发现协议
    consul采用http和dns协议,etcd只支持http
  • 服务注册
    consul支持两种方式实现服务注册,一种是通过consul的服务注册http API,由服务自己调用API实现注册,另一种方式是通过json个是的配置文件实现注册,将需要注册的服务以json格式的配置文件给出。consul官方建议使用第二种方式。
  • 服务发现
    consul支持两种方式实现服务发现,一种是通过http API来查询有哪些服务,另外一种是通过consul agent 自带的DNS(8600端口),域名是以NAME.service.consul的形式给出,NAME即在定义的服务配置文件中,服务的名称。DNS方式可以通过check的方式检查服务。
  • 服务间的通信协议
    Consul使用gossip协议管理成员关系、广播消息到整个集群,他有两个gossip pool(LAN pool和WAN pool),LAN pool是同一个数据中心内部通信的,WAN pool是多个数据中心通信的,LAN pool有多个,WAN pool只有一个。

Consul的下载安装

打开Consul官网

https://www.consul.io/downloads

  1. 选择系统进行安装 (这里我们演示使用windows)

在这里插入图片描述

  1. 下载完/解压/会得到一个consul.exe的一个文件

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6993e17cf60e4f47be9281f99e4a06d6.png

  1. 在consul.exe的命令打开cmd窗口
    3.1. 查看版本 consul --version

    D:\Develop\consul>consul --version
    Consul v1.13.1
    Revision c6d0f9ec
    Build Date 2022-08-11T19:07:00Z
    Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use    protocol >2 when speaking to compatible agents)
    D:\Develop\consul>
    
  2. 使用开发者模式启动 consul agent -dev

    D:\Develop\consul>consul agent -dev
    ==> Starting Consul agent...
               Version: '1.13.1'
            Build Date: '2022-08-11 19:07:00 +0000 UTC'
               Node ID: '51d45d1a-b90f-8fae-d6cc-b4a2244fdc49'
             Node name: 'LAPTOP-66KVCCQR'
            Datacenter: 'dc1' (Segment: '<all>')
                Server: true (Bootstrap: false)
           Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: 8502, DNS: 8600)
          Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
               Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false
    
    ==> Log data will now stream in as it occurs:
    
    2022-09-16T11:37:16.799+0800 [INFO]  agent.server.raft: initial configuration: index=1 servers="[{Suffrage:Voter ID:51d45d1a-b90f-8fae-d6cc-b4a2244fdc49 Address:127.0.0.1:8300}]"
    2022-09-16T11:37:16.799+0800 [INFO]  agent.server.raft: entering follower state: follower="Node at 127.0.0.1:8300 [Follower]" leader-address= leader-id=
    2022-09-16T11:37:16.802+0800 [INFO]  agent.server.serf.wan: serf: EventMemberJoin: LAPTOP-66KVCCQR.dc1 127.0.0.1
    2022-09-16T11:37:16.803+0800 [INFO]  agent.server.serf.lan: serf: EventMemberJoin: LAPTOP-66KVCCQR 127.0.0.1
    2022-09-16T11:37:16.803+0800 [INFO]  agent.router: Initializing LAN area manager
    ....
    
  3. 启动后通过访问以下地址,可以访问到Consul的首页 http://localhost:8500
    在这里插入图片描述

Consul注册与发现

创建Spring Boot 工程 test-goods

pom.xml文件加入以下依赖项

<!--SpringCloud consul-server -->
<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        <!-- SpringBoot整合Web组件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
  </dependencies>
  <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR10</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <!--在本地仓库找不到就到官网去找-->
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/libs-milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

properties配置文件加入以下配置信息

###consul服务端口号
server.port=8080
spring.application.name=test-goods
####consul注册中心地址
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.service-name=${spring.application.name}

项目启动类增加 @EnableDiscoveryClient 注解

编写一个controller测试


@RestController
@RequestMapping("/test")
public class Test {

    @GetMapping(value = "/test")
    public String test1() {
        return "我是 test-goods 模块的test方法";
    }
}

启动项目

查看 consul的管理页面 , 发现test-goods已经注册上来了

在这里插入图片描述

访问 接口 , 查看是否可以访问成功

在这里插入图片描述

到此,单个项目注册到Consul上的教程就到此为止了

Consul模块之间的互相调用

这类似于Spring Cloud 里面的openFing , 远程调用

下面我们来创建一个工程,使用这个工程调用 test-goods 工程里面的test方法

创建test-user工程

pom.xml文件加入以下依赖项

<dependencies>
        <!--SpringCloud consul-server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        <!-- SpringBoot整合Web组件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
</dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR10</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <!--在本地仓库找不到就到官网去找-->
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/libs-milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

配置文件加入以下信息

###consul服务端口号
server.port=8081
spring.application.name=test-user
####consul注册中心地址
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.service-name=${spring.application.name}

启动类加入 @EnableDiscoveryClient 注解

配置bean /配置类初始化远程调用的对象

@Configuration
public class ApplicationContextConfig
{
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate()
    {
        return new RestTemplate();
    }
}

创建一个controller 调用test-goods的test方法

@RestController
@RequestMapping("/user")
public class User {

    public static final String INVOKE_URL = "http://test-goods";

    @Resource
    private RestTemplate restTemplate;

    @GetMapping(value = "/test")
    public String paymentInfo() {
        String result = restTemplate.getForObject(INVOKE_URL + "/test/test", String.class);
        return result;
    }
}

启动项目/实现远程调用

在这里插入图片描述

调研 test-user的test方法 , 查看是否可以访问到test-goods模块

在这里插入图片描述

至此 , consul的远程调用 , 就到这里

  • 27
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欢乐少年1904

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值