SpringCloud与Consul集成实现负载均衡功能

 更新时间:2018年09月19日 14:10:48   作者:soinve  
负载均衡基本概念有:实服务、实服务组、虚服务、调度算法、持续性等,其常用应用场景主要是服务器负载均衡,链路负载均衡。这篇文章主要介绍了SpringCloud与Consul集成实现负载均衡 ,需要的朋友可以参考下

负载均衡(Load Balance,简称LB)是一种服务器或网络设备的集群技术。负载均衡将特定的业务(网络服务、网络流量等)分担给多个服务器或网络设备,从而提高了业务处理能力,保证了业务的高可用性。负载均衡基本概念有:实服务、实服务组、虚服务、调度算法、持续性等,其常用应用场景主要是服务器负载均衡,链路负载均衡。

一、背景

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

以上所述是小编给大家介绍的SpringCloud与Consul集成实现负载均衡功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Java List接口的集合使用详解

    Java List接口的集合使用详解

    这篇文章主要介绍了Java集合操作之List接口及其实现方法,详细分析了Java集合操作中List接口原理、功能、用法及操作注意事项,需要的朋友可以参考下
    2021-08-08
  • 使用IDEA查看jar包及jar包的正确打开方式

    使用IDEA查看jar包及jar包的正确打开方式

    IDEA 是把 jar 包添加为 Libraries,然后展开后即可查看,因为是编译后的 class 文件,所以注释是没有的,今天小编给大家介绍下使用IDEA查看jar包及jar包的正确打开方式,感兴趣的朋友一起看看吧
    2023-07-07
  • 浅谈MySQL中是如何实现事务提交和回滚的

    浅谈MySQL中是如何实现事务提交和回滚的

    本文主要介绍了MySQL中是如何实现事务提交和回滚的,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Java使用Servlet生成验证码图片

    Java使用Servlet生成验证码图片

    这篇文章主要为大家详细介绍了Java使用Servlet生成验证码图片,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • idea 普通文件夹 转换成 module操作

    idea 普通文件夹 转换成 module操作

    这篇文章主要介绍了idea 普通文件夹 转换成 module操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • springboot @ComponentScan注解原理解析

    springboot @ComponentScan注解原理解析

    这篇文章主要介绍了springboot @ComponentScan注解原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Java使用Google Zxing生成二维码的例子

    Java使用Google Zxing生成二维码的例子

    本篇文章主要介绍了Java使用Google Zxing生成二维码的例子。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Java中内核线程理论及实例详解

    Java中内核线程理论及实例详解

    在本篇文章里小编给大家整理了一篇关于Java中内核线程理论及实例详解内容,有兴趣的朋友们可以学习下。
    2021-03-03
  • SpringCloud Feign集成AOP的常见问题与解决

    SpringCloud Feign集成AOP的常见问题与解决

    在使用 Spring Cloud Feign 作为微服务通信的工具时,我们可能会遇到 AOP 不生效的问题,这篇文章将深入探讨这一问题,给出几种常见的场景,分析可能的原因,并提供解决方案,希望对大家有所帮助
    2023-10-10
  • 线程池FutureTask异步执行多任务实现详解

    线程池FutureTask异步执行多任务实现详解

    这篇文章主要为大家介绍了线程池FutureTask异步执行多任务实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11

最新评论