Spring Cloud 入门 ---- Consul 服务注册中心【随笔】

Spring Cloud 入门 ---- Consul 服务注册中心
介绍

Consul 是一套开源的分布式微服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发。提供了微服务中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用构建全方位的服务网络,总之 Consul 提供了一种完整的服务网络解决方案。它具有很多优点,包括:基于 raft 协议,比较简洁;支持健康检查,同时支持 HTTP 和 DNS 协议,支持跨数据中心的 WAN 集群,提供图形化界面、跨平台,支持 Linux、Mac、Windwos。

官网:https://www.consul.io/
中文文档:https://www.springcloud.cc/spring-cloud-consul.html

下载地址:https://www.consul.io/downloads

使用docker 安装 consul

拉取镜像

docker pull consul:1.8.0

启动 consul

docker run --name consul1.8.0 -d -p 8500:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8600:8600 镜像ID 

浏览器打开:http://192.168.0.106:8500/ui/dc1/services 即可看到我们安装的 consul 了【注意若开启了防火墙,需要关闭防火墙】

1603974811038

端口详情:

  • 8500 : http 端口,用于 http 接口和 web ui访问;
  • 8300 : server rpc 端口,同一数据中心 consul server 之间通过该端口通信;
  • 8301 : serf lan 端口,同一数据中心 consul client 通过该端口通信; 用于处理当前datacenter中LAN的gossip通信;
  • 8302 : serf wan 端口,不同数据中心 consul server 通过该端口通信; agent Server使用,处理与其他datacenter的gossip通信;
  • 8600 : dns 端口,用于已注册的服务发现;

各项参数:

  • –net=host docker参数, 使得docker容器越过了net namespace的隔离,免去手动指定端口映射的步骤
  • -server consul支持以server或client的模式运行, server是服务发现模块的核心, client主要用于转发请求
  • -advertise 将本机私有IP传递到consul
  • -retry-join 指定要加入的consul节点地址,失败后会重试, 可多次指定不同的地址
  • -client 指定consul绑定在哪个client地址上,这个地址可提供HTTP、DNS、RPC等服务,默认是>127.0.0.1
  • -bind 绑定服务器的ip地址;该地址用来在集群内部的通讯,集群内的所有节点到地址必须是可达的,>默认是0.0.0.0
    allow_stale 设置为true则表明可从consul集群的任一server节点获取dns信息, false则表明每次请求都会>经过consul的server leader
  • -bootstrap-expect 数据中心中预期的服务器数。指定后,Consul将等待指定数量的服务器可用,然后>启动群集。允许自动选举leader,但不能与传统-bootstrap标志一起使用, 需要在server模式下运行。
  • -data-dir 数据存放的位置,用于持久化保存集群状态
  • -node 群集中此节点的名称,这在群集中必须是唯一的,默认情况下是节点的主机名。
  • -config-dir 指定配置文件,当这个目录下有 .json 结尾的文件就会被加载,详细可参考https://www.consul.io/docs/agent/options.html#configuration_files
  • -enable-script-checks 检查服务是否处于活动状态,类似开启心跳
  • -datacenter 数据中心名称
  • -ui 开启ui界面
  • -join 指定ip, 加入到已有的集群中
Consul 集群
docker run --name consul1.8.0 -d -p 8500:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8600:8600 941109e2896d agent -server -bootstrap-expect 2 -ui -bind=0.0.0.0 -client=0.0.0.0

查看consul1的ip地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' consul1

开启第二个节点(端口8501),并加入到 consul1
docker run --name consul2 -d -p 8501:8500 consul agent -server -ui -bind=0.0.0.0 -client=0.0.0.0 -join 172.17.0.4

开启第三个节点(端口8502),并加入到consul1’
docker run --name consul3 -d -p 8502:8500 consul agent -server -ui -bind=0.0.0.0 -client=0.0.0.0 -join 172.17.0.4

查看consul集群信息
docker exec -it consul1 consul members

以下的服务都基于单机搭建

Consul 服务提供者模块
创建服务提供者

引入 pom 依赖

<!--consul依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>

创建 application.yml 配置文件

server:
  port: 8007

spring:
  application:
    name: consul-payment-provider
  cloud:
    consul:
      host: 192.168.0.106
      port: 8500
      discovery:
        service-name: ${spring.application.name}
        heartbeat:
          enabled: true

主启动

@SpringBootApplication
@EnableDiscoveryClient
public class ConsulPaymentApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsulPaymentApplication.class, args);
    }
}

业务类

@RestController
@Slf4j
public class ConsulPaymentController {

    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/payment/consul")
    public String paymentConsul(){
        return "spring cloud with consul port: "+serverPort+"\t"+ UUID.randomUUID().toString();
    }
}
测试服务提供者

浏览器打开 consul 查看注册中心的服务,可以看到 consul-payment-provider 已经注册成功。

1603987029407

点击进去可以看到服务的实例详情信息,如下图:

1603987309780

访问: http://localhost:8007/payment/consul 发现提供者的业务可以正常访问

1603987144574

服务提供者集群

修改 原有服务提供者 application.yml 配置名为 application-one.yml 并复制一份修改名称为 application-two.yml【两者除了端口号其它一样】,具体配置如下:

application-one.yml

server:
  port: 8007

spring:
  application:
    name: consul-payment-provider
  cloud:
    consul:
      # consul所在服务器ip
      host: 192.168.0.106
      port: 8500
      discovery:
        # 当前服务的别名
        service-name: ${spring.application.name}
        # 开启心跳,默认关闭的
        heartbeat:
          enabled: true

application-two.yml

server:
  port: 8008

spring:
  application:
    name: consul-payment-provider
  cloud:
    consul:
      host: 192.168.0.106
      port: 8500
      discovery:
        service-name: ${spring.application.name}
        heartbeat:
          enabled: true

修改原有的服务,并指定运行的配置文件

1603987451923

copy 修改后的服务,并修改名称 与 运行的配置文件

1603987504642

启动这两个服务提供者,在 consul 注册中心中即可看到 consul-payment-provider 服务存在两个节点。

1603987751295

访问:http://localhost:8007/payment/consul 与 http://localhost:8008/payment/consul 可以发现两个服务都是能够正常访问的。

Consul 服务消费者模块
创建服务消费者

引入 pom 依赖

<!--consul依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>

创建 application.yml 配置文件

server:
  port: 80

spring:
  application:
    name: consul-order-concumer
  cloud:
    consul:
      host: 192.168.0.106
      port: 8500
      discovery:
        service-name: ${spring.application.name}
        heartbeat:
          enabled: true

主启动

@SpringBootApplication
@EnableDiscoveryClient
public class ConsulOrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsulOrderApplication.class, args);
    }
}

配置类:注入RestTemplate组件并设置默认的负载均衡规则 (轮询)

@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

业务类

@RestController
@Slf4j
public class ConsulOrderController {
	 /**
     * 服务别名
     */
    private static final String INVOKE_URL = "http://consul-payment-provider";

    @Resource
    private RestTemplate restTemplate;

    @GetMapping(value = "/consumer/payment/consul")
    public String paymentInfo(){
        String msg = restTemplate.getForObject(INVOKE_URL+"/payment/consul", String.class);
        return msg;
    }
}
测试服务消费者

启动服务,在 consul 中可以看到服务已经注册进入了注册中心,如下图:

1603988161361

访问:http://localhost/consumer/payment/consul ,可以看到服务消费者使用 轮询 的负载均衡策略,轮询调用 8007 与 8008 服务提供者【关于负载均衡会在后续章节介绍】。

1603988209616

1603988260656


三个注册中心的对比

1603988549639

CAP
  • C:Consistemcu(强一致性)
  • A:Availability(可用性)
  • P:Partition tolerance(分区容错性)

CAP理论关注粒度是数据,而不是整体系统设计的策略;CAP理论,最多只能同时较好的满足两个

CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错这三个需求,因此,根据CAP 原理将 NoSQL 数据库分成了 满足CA 原则、满足CP原则 和 满足AP原则 三大类:

  • CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
  • CP - 满足一致性,分区容错性的系统,通常性能不是特别高。
  • AP - 满足可用性,分区容错性的系统,通常可能对一致性要求低一些。

AP:Eureka CP:Zookeeper/ Consul

AP架构:

当网络分区出现后,为了保证可用性,系统B可以返回旧值,保证系统的可用性。

结论:违背一致性C的要求,只满足可用性和分区容错,即AP

1603989116585

CP架构:

当网络分区出现后,为了保证一致性,就必须拒接请求,否则无法保证一致性

结论:违背了可用性A的要求,只满足一致性和分区容错,即CP

1603989273315

至此,通用的三个注册中心【Eureka、ZooKeeper、Consul】已经介绍完毕,Nacos 则会在 SpringCloudAlibaba 中介绍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值