zoukankan      html  css  js  c++  java
  • SpringCloud与Consul集成实现负载均衡

    一、背景

    SpringCloud微服务目前比较流行,其中大都在使用的服务注册与发现是Eureka,最近研究了Consul的集群搭建,现使用Consul实现服务的负载均衡。其主要拓扑结构如下:

    二、Consul集群环境搭建

    本次搭建采用了三台虚拟机,Linux系统,从Consul官网下载安装包,解压即可使用。在每台机器下建一个目录/data/consul/data,这个目录主要存放器群启动后生成的一些数据。需要开启的端口,8300, 8301, 8500, 8600。

    分别在以下三个机器上执行一下启动命令。

    机器1:10.0.0.45

    ./consul agent -server -bootstrap-expect 2 -data-dir=/data/consul/data -node=consul-server-1 -bind=10.0.0.45 -client=0.0.0.0 &

    机器2:10.0.0.100

    ./consul agent -server -bootstrap-expect 2 -data-dir=/data/consul/data -node=consul-server-2 -bind=10.0.0.100 -client=0.0.0.0 &

    机器3:10.0.0.191

    ./consul agent -server -bootstrap-expect 2 -data-dir=/data/consul/data -node=consul-server-3 -bind=10.0.0.191 -client=0.0.0.0 -ui &

    参数说明:

    •  server: 以server身份启动。默认是client
    •  bootstrap-expect:集群要求的最少server数量,当低于这个数量,集群即失效。
    •  data-dir:data存放的目录,更多信息请参阅consul数据同步机制
    •  node:节点id,在同一集群不能重复。
    •  bind:监听的ip地址。默认绑定0.0.0.0,可以不指定
    •  client: 客户端的ip地址,0.0.0.0是指谁都可以访问
    •  ui: 可以访问UI界面

    三台机器上的服务启动完成后,将两台机器添加到其中一台机器上,组建成集群。

    分别在机器2和机器3上执行:./consul join 10.0.0.45,构成集群,同样也可以再增加别的节点。

    启动成功后访问任意一台机器  http://10.0.0.45:8500,会看到如下界面,有3个健康的节点:

    三、SpringCloud服务注册

    注册中心已经搭建完毕,接下来就是准备两个服务,一个是生产者consul-producer,一个是消费者consul-consumer。

    3.1 生产者代码,代码很简单,就是RestAPI请求并返回一个字符串

    @RestController
    public class ProducerController {
    
        @GetMapping("/producer")
        public String producer(){
            System.out.println("I'm producer");
            return "Hello, I'm producer";
        }
    }

    以下是生产者consul-producer的启动配置文件application.yml:

    spring:
      application:
        name: consul-producer  #程序名称
      cloud:
        consul:
          host: 10.0.0.100 #consul节点IP
          port: 8500       #consul节点端口
          discovery:
            instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port} #实例ID
            health-check-path: /actuator/health                                                      #健康检查
            health-check-interval: 10s
    
    server:
      port: 9091  #消费者服务端口

    3.2 消费者代码,代码也很简单,使用大家熟悉分Feign,Controller接受请求,用过service调用消费者提供的服务

    /**
     * 消费者
     */
    @RestController
    public class ConsumerController {
    
        @Autowired
        private ConsumerService consumerService;
    
        @GetMapping("/consumer")
        public String getProducer(){
    
            return consumerService.consumer();
        }
    }

    以下是feign调用的接口声明:

    /**
     * 调用生产者服务
     */
    @FeignClient("consul-producer")
    public interface ProducerRemote {
    
        @GetMapping("/producer")
        String producer();
    }

    以下是生产者consul-consumer的启动配置文件application.yml:

    spring:
      application:
        name: consul-consumer  #消费者名称
      cloud:
        consul:
          host: 10.0.0.45    #consul注册节点IP
          port: 8500         #consul注册节点端口
          discovery:
            instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}  #实例ID
            health-check-path: /actuator/health                                                       #健康检查
            health-check-interval: 10s
    server:
      port: 9092   #消费者服务端口

    两部分的源码可在Github上查看https://github.com/liuzwei/consul-demo.git

    生产者和消费者存在了,就启动可以了,接下来是启动两个生产者,一个消费者,为了直观的区分两个生产者,在调用生产者返回的string稍微做了区分,一个是返回“Hello, I'm producer”,而另一个则返回“Hello, I'm producer2”,为了实现负载均衡便于测试。

    其中在本机上10.0.0.93分别启动了程序consul-consumer和consul-producer,在另一台机器10.0.0.191上启动另一个生产者实例consul-producer

    启动之后在consul的界面上看到如下样子:

    四、测试负载功能

    通过浏览器,Get请求消费者的controller,会看到“Hello, I'm producer”和“Hello, I'm producer2”在交替显示,这也是fegin调用的特性,轮询机制实现负载均衡。

    五、总结

    目前微服务框架比较流行,最近项目也是上线了一些Spring Cloud微服务架构的产品,同时也在探索其他可替代组件,因此对consul进行了相关学习,便整理成该文章,在consul的使用过程中也是存在一些不明白的地方,其中Eureka的注册时可以配置多地址的,没有发现consul怎么向多个节点进行注册,希望有用过的大佬给指点一二,还在学习中,共勉。

  • 相关阅读:
    【Python】数据写入Excel(封装后)
    【Charles】设置代理后 手机无法上网
    【Python】随机数/随机值
    【Python】操作JSON
    【Python】补零 不足位数补零
    【python】+操作yaml文件
    【Python】格式化输出JSON
    【Python】+系列教程(1、封装)
    【Python】+系列教程(总)
    【数据分析】+【Python】+股票数据分析
  • 原文地址:https://www.cnblogs.com/soinve/p/9673738.html
Copyright © 2011-2022 走看看