一、背景

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集成实现负载均衡的更多相关文章

  1. SpringCloud与微服务Ⅶ --- Feign负载均衡

    官方文档:https://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign 一.Feign是什么 Feign是一 ...

  2. spring-cloud: eureka之:ribbon负载均衡自定义配置(二)

    spring-cloud: eureka之:ribbon负载均衡自定义配置(二) 有默认配置的话基本上就是轮询接口,现在我们改用自定义配置,同时支持:轮询,随机接口读取 准备工作: 1.eureka服 ...

  3. spring-cloud: eureka之:ribbon负载均衡配置(一)

    spring-cloud: eureka之:ribbon负载均衡配置(一) 比如我有: 一个eureka服务:8761 两个user用户服务: 7900/7901端口 一个movie服务:8010 1 ...

  4. Centos6.2上做nginx和tomcat的集成及负载均衡(已实践)

    Centos6.2上做nginx和tomcat的集成及负载均衡 ---------------------------------------------------------Jdk-------- ...

  5. SpringCloud实现集群和负载均衡

    Spring cloud是一个基于Spring Boot实现的服务治理工具包,在微服务架构中用于管理和协调服务的. 组成部分 spingcloud的五大神兽 服务发现——Netflix Eureka ...

  6. SpringCloud与微服务Ⅵ --- Ribbon负载均衡

    一.Ribbon是什么 Sping Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具. 简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户 ...

  7. 在Windows环境中使用Nginx, Consul, Consul Template搭建负载均衡和服务发现服务

    搭建负载均衡和服务发现服务的目的 随着网站业务的不断提升,单个服务器的性能越来越难满足客户的业务需求,所以很多情况下,需要使用多服务器实例和负载均衡器来满足业务需要. Nginx 什么是Nginx N ...

  8. SpringCloud系列五:Ribbon 负载均衡(Ribbon 基本使用、Ribbon 负载均衡、自定义 Ribbon 配置、禁用 Eureka 实现 Ribbon 调用)

    1.概念:Ribbon 负载均衡 2.具体内容 现在所有的服务已经通过了 Eureka 进行了注册,那么使用 Eureka 注册的目的是希望所有的服务都统一归属到 Eureka 之中进 行处理,但是现 ...

  9. SpringCloud之实现客户端的负载均衡Ribbon(二)

    一 Ribbon简介 Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为.为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务 ...

随机推荐

  1. Unity shader学习之Alpha Test的阴影

    Alpha Test的阴影, shader如下: // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClip ...

  2. python中的lxml模块

    Python中自带了XML的模块,但是性能不太好,相比之下,LXML增加了很多实用的功能. lxml中主要有两部分, 1) etree,主要可以用来解析XML字符串, 内部有两个对象,etree._E ...

  3. QT自定义消息

    1.派生QAbstractNativeEventFilter,重写nativeEventFilter()函数 #ifndef CMYMESSAGEHANDLER_H #define CMYMESSAG ...

  4. html5-css边框全

    /*div{    width: 500px;    height: 300px;    background: rgb(122,30,60);    border: 10px solid black ...

  5. 深度解读 AlphaGo 算法原理

    http://blog.csdn.net/songrotek/article/details/51065143 http://blog.csdn.net/dinosoft/article/detail ...

  6. hdu5293 lca+dp+树状数组+时间戳

    题意是给了 n 个点的树,会有m条链条 链接两个点,计算出他们没有公共点的最大价值,  公共点时这样计算的只要在他们 lca 这条链上有公共点的就说明他们相交 dp[i]为这个点包含的子树所能得到的最 ...

  7. 反射(I)

    反射获取属性和属性值 let item = DoctorGroup() guard let dic = InterfaceTests.obtainValues(subObject: item) els ...

  8. weblogic 乱码

    1.找到weblogic安装目录,当前项目配置的domain 2.找到bin下的setDomainEnv.cmd文件 3.打开文件,从文件最后搜索第一个set JAVA_OPTIONS=%JAVA_O ...

  9. scrapy框架 + selenium 爬取豆瓣电影top250......

    废话不说,直接上代码..... 目录结构 items.py import scrapy class DoubanCrawlerItem(scrapy.Item): # 电影名称 movieName = ...

  10. ClassOne__HomeWork

    1,static类型 static类型定义有两类,一类是静态数据,另一类是静态函数. 静态数据跟成员变量不同,它可以通过类名直接访问,而不需要通过定义对象来访问.它的的生成也和成员变量不一样,它只生成 ...