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怎么向多个节点进行注册,希望有用过的大佬给指点一二,还在学习中,共勉。
SpringCloud与Consul集成实现负载均衡的更多相关文章
- SpringCloud与微服务Ⅶ --- Feign负载均衡
官方文档:https://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign 一.Feign是什么 Feign是一 ...
- spring-cloud: eureka之:ribbon负载均衡自定义配置(二)
spring-cloud: eureka之:ribbon负载均衡自定义配置(二) 有默认配置的话基本上就是轮询接口,现在我们改用自定义配置,同时支持:轮询,随机接口读取 准备工作: 1.eureka服 ...
- spring-cloud: eureka之:ribbon负载均衡配置(一)
spring-cloud: eureka之:ribbon负载均衡配置(一) 比如我有: 一个eureka服务:8761 两个user用户服务: 7900/7901端口 一个movie服务:8010 1 ...
- Centos6.2上做nginx和tomcat的集成及负载均衡(已实践)
Centos6.2上做nginx和tomcat的集成及负载均衡 ---------------------------------------------------------Jdk-------- ...
- SpringCloud实现集群和负载均衡
Spring cloud是一个基于Spring Boot实现的服务治理工具包,在微服务架构中用于管理和协调服务的. 组成部分 spingcloud的五大神兽 服务发现——Netflix Eureka ...
- SpringCloud与微服务Ⅵ --- Ribbon负载均衡
一.Ribbon是什么 Sping Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具. 简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户 ...
- 在Windows环境中使用Nginx, Consul, Consul Template搭建负载均衡和服务发现服务
搭建负载均衡和服务发现服务的目的 随着网站业务的不断提升,单个服务器的性能越来越难满足客户的业务需求,所以很多情况下,需要使用多服务器实例和负载均衡器来满足业务需要. Nginx 什么是Nginx N ...
- SpringCloud系列五:Ribbon 负载均衡(Ribbon 基本使用、Ribbon 负载均衡、自定义 Ribbon 配置、禁用 Eureka 实现 Ribbon 调用)
1.概念:Ribbon 负载均衡 2.具体内容 现在所有的服务已经通过了 Eureka 进行了注册,那么使用 Eureka 注册的目的是希望所有的服务都统一归属到 Eureka 之中进 行处理,但是现 ...
- SpringCloud之实现客户端的负载均衡Ribbon(二)
一 Ribbon简介 Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为.为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务 ...
随机推荐
- 事件响应模型(游戏引擎、JAVA中等应用)
事件,我们在生活中时时在产生事件并且做出响应,如早晨出门时,看见外面下雨了,这时候我们需要带把伞等情况! 在现实生活之中事件分为人为事件和自然事件,那么在计算机操作系统中也不例外,存在两种事件 1.人 ...
- QString字符串中双引号的梗
[1]QString字符串不支持双引号 最近做项目(本地环境:WIN10 + QT5.9.2 + VS2017).有个需求,需要实现形如 "key="123456"&qu ...
- js三目学习
<script> var n=1; n>1?document.write('大于1哦'):document.write('小于或等于1哦') //n=n>1?document. ...
- SQLServer 创建自己的数据库
1)进入数据库服务器,创建自己的数据库 use master go create database Dt_Devtest on primary(name=[Dt_new_data],filename= ...
- 决策树算法——ID3
决策树算法是一种有监督的分类学习算法.利用经验数据建立最优分类树,再用分类树预测未知数据. 例子:利用学生上课与作业状态预测考试成绩. 上述例子包含两个可以观测的属性:上课是否认真,作业是否认真,并以 ...
- 使用Hive读取ElasticSearch中的数据
本文将介绍如何通过Hive来读取ElasticSearch中的数据,然后我们可以像操作其他正常Hive表一样,使用Hive来直接操作ElasticSearch中的数据,将极大的方便开发人员.本文使用的 ...
- JAVA中获取文件MD5值的方法
1 DigestUtils.md5Hex(new FileInputStream(path)); 如果你只需要使用标准的MD5,其实一行代码就够了,JAVA自带的commons-codec包就提供了获 ...
- Lucene 个人领悟 (三)
其实接下来就是贴一下代码,熟悉一下Lucene的正常工作流程,或者说怎么使用这个API,更深层次的东西这篇文章不会讲到. 上一篇文章也说了maven的配置,只要你电脑联网就可以下载下来.我贴一下代码. ...
- 移植并修改成功的模拟iic读写EEPROM at24c02
2010-04-24 12:58:00 注:如果要读24c128或264,地址位为16位的.现在的地址位为8位. protues仿真图 源程序如下: #include <iom16v.h> ...
- hihoCoder #1037 : 数字三角形 (动态规划)
题目链接:https://hihocoder.com/problemset/problem/1037# 问题描述 小Hi和小Ho在经历了螃蟹先生的任务之后被奖励了一次出国旅游的机会,于是他们来到了大洋 ...