什么是consul

consul 概述

Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其它分布式服务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其它工具(比如 ZooKeeper 等)。使用起来也较 为简单。Consul 使用 Go 语言编写,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与 Docker 等轻量级容器可无缝配合。
Consul 的优势:
1.使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接. 相比较而言, zookeeper 采用的是
Paxos, 而 etcd 使用的则是 Raft。
2.支持多数据中心,内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心
的单点故障,而其部署则需要考虑网络延迟, 分片等情况等。 zookeeper 和 etcd 均不提供多数据中心功能的支持。
3.支持健康检查。 etcd 不提供此功能。
4.支持 http 和 dns 协议接口。 zookeeper 的集成较为复杂, etcd 只支持 http 协议。
5.官方提供 web 管理界面, etcd 无此功能。
6.综合比较, Consul 作为服务注册和配置管理的新星, 比较值得关注和研究

特性:

服务发现
健康检查
Key/Value 存储
多数据中心
consul与Eureka的区别
(1)一致性
Consul强一致性(CP)
Eureka保证高可用和最终一致性(AP)
(2)开发语言和使用
eureka就是个servlet程序,跑在servlet容器中
Consul则是go编写而成,安装启动即可

consul的下载与安装

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
consul的基本使用
Consul 支持健康检查,并提供了 HTTP 和 DNS 调用的API接口完成服务注册,服务发现,以及K/V存储这些功能。接下来通过发送HTTP请求的形式来了解一下Consul

服务注册与发现

注册服务

通过postman发送put请求到http://127.0.0.1:8500/v1/catalog/register地址可以完成服务注册

{ 
"Datacenter": "dc1", 
"Node": "node01", 
"Address": "192.168.74.102", 
"Service": { 
"ID":"mysql-01", 
"Service": "mysql", 
"tags": ["master","v1"], 
"Address": "192.168.74.102", 
"Port": 3306 
} 
}

在这里插入图片描述
在这里插入图片描述

服务查询

通过postman发送get请求到http://127.0.0.1:8500/v1/catalog/services查看所有的服务列表
通过postman发送get请求到http://127.0.0.1:8500/v1/catalog/service/服务名查看具体的服务详情
(3)服务删除
通过postman发送put请求到http://127.0.0.1:8500/v1/catalog/deregister删除服务

{ 
 "Datacenter": "dc1", 
 "Node": "node01", 
 "ServiceID": "mysql-01" 
}

删除之后
在这里插入图片描述

基于consul的服务注册

案例准备

修改微服务的相关pom文件
将eureka的依赖和配置去掉
修改每个微服务的pom文件,添加SpringCloud提供的基于Consul的依赖

<!--SpringCloud提供的基于Consul的服务发现-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!--actuator用于心跳检查-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

其中 spring-cloud-starter-consul-discovery 是SpringCloud提供的对consul支持的相关依赖。spring-boot-starter-actuator 适用于完成心跳检测响应的相关依赖。
配置服务注册
修改每个微服务的application.yml配置文件,添加consul服务发现的相关配置信息

server:
  port: 9001
spring:
  application:
    name: user-server-consumer #唯一
  cloud:
    consul:
      host: 127.0.0.1
      port: 8500
      discovery:
        register: true
        instance-id: ${spring.application.name}-${server.port}
        service-name: ${spring.application.name}
        port: ${server.port}
        ip-address: ${spring.cloud.client.ip-address}
        prefer-ip-address: true

其中 spring.cloud.consul 中添加consul的相关配置
host:表示Consul的Server的请求地址
port:表示Consul的Server的端口
discovery:服务注册与发现的相关配置
instance-id : 实例的唯一id(推荐必填),spring cloud官网文档的推荐,为了保证生成一
个唯一的id ,也可以换成
s p r i n g . a p p l i c a t i o n . n a m e : {spring.application.name}: spring.application.name:{spring.cloud.client.ipAddress}
prefer-ip-address:开启ip地址注册
ip-address:当前微服务的请求ip

在控制台中查看服务列表

打开ConsulServer的管理控制台,可以发现微服务已经全部注册到Consul中了。
在这里插入图片描述

客户端调用服务端的三种实现方式

//第一种实现是不需要任何注册中心(直接拼接url)

@Override
 public List<Order> currentUserOrderInfo(Integer uid) {
     String url = "http://localhost:8001/findOrderByUid/" + uid;
     //http请求调用远程方法
     List<Order> list = restTemplate.getForObject(url, List.class);
     return list;
 }
第二种方式在启动类上添加@EnableDiscoveryClient
 @Override
 public List<Order> currentUserOrderInfo(Integer uid) {
     System.out.println("discoveryClient调用");
     List<ServiceInstance> instances = discoveryClient.getInstances("order-server-provider");
     ServiceInstance serviceInstance = instances.get(0);
     String url = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/findOrderByUid/" + uid;
     System.out.println(url);
     //http请求调用远程方法
     List<Order> list = restTemplate.getForObject(url, List.class);
     return list;
 }

//第三种方式采用ribbon负责均衡,必须在RestTemplate上添加@LoadBalanced

@Override
 public List<Order> currentUserOrderInfo(Integer uid) {
//这种方式采用ribbon的负载均衡使用时,必须要求在RestTemplate上添加@LoadBalanced
     String url = "http://order-server-provider/findOrderByUid/" + uid;
     //http请求调用远程方法
     List<Order> list = restTemplate.getForObject(url, List.class);
     return list;
 }

在这里插入图片描述

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐