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怎么向多个节点进行注册,希望有用过的大佬给指点一二,还在学习中,共勉。

  • 相关阅读:
    阿里消息队列中间件 RocketMQ 源码分析 —— Message 拉取与消费(上)
    数据库中间件 ShardingJDBC 源码分析 —— SQL 解析(三)之查询SQL
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 解析(六)之删除SQL
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 解析(五)之更新SQL
    消息队列中间件 RocketMQ 源码分析 —— Message 存储
    源码圈 300 胖友的书单整理
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 路由(一)分库分表配置
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 解析(四)之插入SQL
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 路由(二)之分库分表路由
    C#中Math类的用法
  • 原文地址:https://www.cnblogs.com/soinve/p/9673738.html
Copyright © 2011-2022 走看看