前言
一、简介
1、Consul概述
Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发。
Consul 提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,总之 Consul 提供了一种完整的服务网格解决方案。
它具有很多优点,包括:基于 raft 协议,比较简洁;支持健康检查,同时支持 HTTP 和 DNS协议、支持跨数据中心的 WAN 集群,提供图形界面,跨平台,支持Linux、Mac、Windows
2、特性
服务发现:
Consul 的客户端可以提供一个服务,比如 api 或者 mysql,另外一些客户端可以使用 Consul 去发现一个指定服务的提供者,通过 DNS 或者 HTTP 应用程序可以很容易的找到他所依赖的服务。
健康监测:
Consul客户端可以提供任意数量的健康检查,指定一个服务(比如:webserver 是否返回了 200 OK 状态码)或者使用本地节点(比如:内存使用是否大于90%) 这个信息可由 operator 用来监视集群的健康,被服务发现组件用来避免将流量发送到不健康的主机。
Key/Value存储:
应用程序可以根据自己的需要使用 Consul 的层级的 Key/Value 存储,比如动态配置,功能标记,协调,领袖选举等等,简单的HTTP API让他更易于使用。
多数据中心:
Consul 支持开箱即用的多数据中心,这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域。
3、下载地址
1、下载地址:https://www.consul.io/downloads.html
2、文档地址:https://www.springcloud.cc/spring-cloud-consul.html
4、安装
# 1、将安装包通过xfyp上传到服务器
# 2、安装unzip
yum install -y unzip
# 3、解压到usr/local/bin下
unzip consul_1.8.4_linux_amd64.zip -d /usr/local/bin
# 4、配置环境变量
vim /etc/profile
export CONSUL_HOME=/usr/local/bin/consul
export PATH=$PATH:CONSUL_HOME
# 5、使环境变量配置生效
source /etc/profile
# 6、验证 Consul 是否安装成功
consul -v
5、配置参数
参数名称 | 用途 |
---|---|
-server | 用于控制代理是运行于服务器/客户端模式,每个 Consul 集群至少有一个服务器,正常情况下不超过5个,使用此标记的服务器参与 Raft 一致性算法、选举等事务性工作。 |
-client | 表示 Consul 绑定客户端接口的 IP 地址,默认值为:127.0.0.1,当你有多块网卡的时候,最好指定IP地址,不要使用默认值 |
-bootstrap-expect | 预期的服务器集群的数量,整数,如 -bootstrap-expect=3,表示集群服务器数量为3台,设置该参数后,Consul将等待指定数量的服务器全部加入集群可用后,才开始引导集群正式开始工作,此参数必须与 -server 一起使用 |
-data-dir | 存储数据的目录,该目录在 Consul 程序重启后数据不会丢失,指定此目录时,应确保运行 Consul 程序的用户对该目录具有读写权限 |
-node | 当前服务器在集群中的名称,该值在整个 Consul 集群中必须唯一,默认值为当前主机名称 |
-bind | Consul 在当前服务器侦听的地址,如果您有多块网卡,请务必指定一个IP地址(IPv4/IPv6),默认值为:0.0.0.0,也可用使用[::] |
-datacenter | 代理服务器运行的数据中心的名称,同一个数据中心中的 Consul 节点必须位于同一个 LAN 网络上 |
-ui | 启用当前服务器内部的 WebUI 服务器和控制台界面 |
-join | 该参数指定当前服务器启动时,加入另外一个代理服务器的地址,在默认情况下,如果不指定该参数,则当前代理服务器不会加入任何节点。可以多次指定该参数,以加入多个代理服务器 |
-retry-join | 用途和 -join 一致,当第一次加入失败后进行重试,每次加入失败后等待时间为 30秒 |
-syslog | 指定此标志意味着将记录 syslog,该参数在 Windows 平台不支持 |
6、启动Consul
# 后台启动
consul agent -dev -ui -data-dir=/data/consul -client 0.0.0.0 &
访问:http://192.168.241.135:8500
二、Consul使用步骤
1、服务提供者
1、新建一个Module
项目名:cloud-providerconsul-payment8004
2、配置pom.xml
<dependencies>
<dependency>
<groupId>com.itan</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
3、配置application.yml
server:
port: 8004
spring:
application:
name: consul-provider-payment
cloud:
consul:
host: 47.115.85.67
port: 8500
discovery:
# 注册到 consul 中的服务名
service-name: ${spring.application.name}
prefer-ip-address: true
# 开启检查心跳协议(默认是关闭的)如果不开启,服务就无法调用
heartbeat:
enabled: true
4、Controller类
package com.itan.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping("payment8004")
public class PaymentController {
@Value("${server.port}")
private String port;
@GetMapping("consul")
public String get(){
return "springcloud with consul:" + port;
}
}
5、启动测试
访问:http://192.168.241.135:8500
2、服务消费者
1、新建一个Module
项目名:cloud-consumerconsul-order80
2、配置pom.xml
<dependencies>
<dependency>
<groupId>com.itan</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
3、配置application.yml
server:
port: 80
spring:
application:
name: consul-consumer-order
cloud:
consul:
host: 47.115.85.67
port: 8500
discovery:
# 设置不注册到 consul 中,默认是注册
register: false
service-name: ${spring.application.name}
4、config配置类
package com.itan.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
5、主启动类同上
6、Controller类
package com.itan.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@RestController
@RequestMapping("consumer")
public class OrderController {
public static final String INVOME_URL = "http://consul-provider-payment/";
@Resource
private RestTemplate restTemplate;
@GetMapping("/get")
public String get(){
String result = restTemplate.getForObject(INVOME_URL + "payment8004/consul",String.class);
return result;
}
}
7、测试
1、先启动服务提供者
2、启动服务消费者
3、postman中调用
三、三个注册中心异同
1、CAP原则
CAP 原则又称 CAP 定理,指的是在一个分布式系统中,
Consistency(一致性)
、Availability(可用性)
、Partitiontolerance(分区容错性)
,三者不可兼得。
CA:单点集群,满足一致性、可用性的系统,通常在可扩展性上不太强大。
CP:满足一致性、分区容错性的系统,通常性能不是特别的高。
AP:满足可用性、分区容错性的系统,通常可能对一致性要求会低一些。
CAP理论关注粒度是数据,而不是整体系统设计的策略
2、异同点
Eureka保证了AP:
AP架构:
当网络分区出现后,为了保证可用性,系统B
可以返回旧值
,保证系统的可用性。
结论:违背了一致性C的要求,只满足可用性和分区容错性
Zookeeper和Consul保证了CP:
CP架构:
当网络分区出现后,为了保证一致性,就必须拒绝请求,否则无法保证一致性。
结论:违背了可用性A的要求,只满足一致性和分区容错性