前言

本案例将基于Spring cloud Ribbon和Eureka实现客户端负载均衡,其中Ribbon用于实现客户端负载均衡,Eureka主要是用于服务注册及发现;

传统的服务端负载均衡

常见的服务端负载均衡有基于nginx实现的,Nginx收到请求后,通过轮询,IP哈希等算法来决定转发该请求到哪个服务来处理,这种方式缺点还是比较多的;

客户端负载均衡

在微服务架构中,会有很多服务,每个服务有可能会有多个实例,为了治理这些服务,我们可以通过eureka、consoul、 zookeeper来实现,解决完服务管理后,但是还有问题,如果当某个服务希望调用其它服务,通常会通过eureka去查询服务列表,然后eureka返回该服务的所有实例,and 然后调用方应该用哪个服务呢?

这时候,就需要客户端负载均衡来处理这个问题了,客户端负载均衡是和应用程序绑定在一起的,我们不需要单独部署一个额外的服务,本文将使用Spring cloud Ribbon,可以帮助客户端去决定选择哪个服务实例来调用,并可以设定负载均衡算法;

Netflix ribbon介绍

一个客户端的负载均衡实现,Netflix ribbon提供了以下功能:

1、负载均衡

2、故障容错

3、支持多种协议(HTTP, TCP, UDP)

4、缓存

在maven项目中,可以使用以下方式引入:

<dependency><groupId>com.netflix.ribbon</groupId><artifactId>ribbon</artifactId><version>2.2.2</version>
</dependency>

Netflix ribbon例子

一种快速创建工程的方法是去https://start.spring.io/网站,添加对应的依赖,然后直接下载引入到IDE即可;

1、创建Eureka服务管理工程

很简单,主要是要在Spring boot工程里加上@EnableEurekaServer注解,并添加以下application.properties中的配置;

RibbonEurekaServerApplication
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@SpringBootApplication
@EnableEurekaServer
public class RibbonEurekaServerApplication {public static void main(String[] args) {SpringApplication.run(RibbonEurekaServerApplication.class, args);}
}

application.properties

spring.application.name= ${springboot.app.name:eureka-serviceregistry}
server.port = ${server-port:8761}
eureka.instance.hostname= ${springboot.app.name:eureka-serviceregistry}
eureka.client.registerWithEureka= false
eureka.client.fetchRegistry= false
eureka.client.serviceUrl.defaultZone: http://${registry.host:localhost}:${server.port}/eureka/

然后启动,界面如下:

2、创建服务端工程

首先,建一个controller

@RestController
public class MyRestController {@AutowiredEnvironment environment;@GetMapping("/")public String health() {return "I am Ok";}@GetMapping("/backend")public String backend() {System.out.println("Inside MyRestController::backend...");String serverPort = environment.getProperty("local.server.port");System.out.println("Port : " + serverPort);return "Hello form Backend!!! " + " Host : localhost " + " :: Port : " + serverPort;}
}

然后新建启动类,并加上@EnableDiscoveryClient注解

@SpringBootApplication
@EnableDiscoveryClient
public class RibbonServerApplication {public static void main(String[] args) {SpringApplication.run(RibbonServerApplication.class, args);}
}

最后,加上配置文件application.properties

spring.application.name=server
server.port = 9090eureka.client.serviceUrl.defaultZone= http://${registry.host:localhost}:${registry.port:8761}/eureka/
eureka.client.healthcheck.enabled= true
eureka.instance.leaseRenewalIntervalInSeconds= 1
eureka.instance.leaseExpirationDurationInSeconds= 2

3、创建客户端工程

注意客户端工程需要添加spring-cloud-starter-netflix-ribbon依赖;

首先,我们新建启动类,并加上@RibbonClient@EnableDiscoveryClient注解

@EnableDiscoveryClient
@SpringBootApplication
@RibbonClient(name = "server", configuration = RibbonConfiguration.class)
public class RibbonClientApplication {public static void main(String[] args) {SpringApplication.run(RibbonClientApplication.class, args);}
}

注意这里的RibbonConfiguration,是我们的自定义配置类,这里面的方法可以自己根据情况重写,本例子只是一个简单的测试,用的是Ribbon提供的默认方式,代码如下:

public class RibbonConfiguration {@AutowiredIClientConfig config;@Beanpublic IPing ribbonPing(IClientConfig config) {return new PingUrl();}@Beanpublic IRule ribbonRule(IClientConfig config) {return new AvailabilityFilteringRule();}
}

最后,添加application.properties配置文件,如下:

spring.application.name=client
server.port=8888eureka.client.serviceUrl.defaultZone= http://${registry.host:localhost}:${registry.port:8761}/eureka/
eureka.client.healthcheck.enabled= true
eureka.instance.leaseRenewalIntervalInSeconds= 1
eureka.instance.leaseExpirationDurationInSeconds= 2server.ribbon.eureka.enabled=true
#server.ribbon.listOfServers=localhost:9090,localhost:9091,localhost:9092
server.ribbon.ServerListRefreshInterval=1000
#logging.level.root=TRACE

例子测试验证

首先,打包,然后启动所有的以上服务,使用java -jar -Dserver.port=XXXX YYYYY.jar命令启动即可;

启动后,可以在eureka中看到我们启动的服务:

由于我们要演示客户端负载均衡功能,所以再启动几个服务端服务,端口为9091 and 9092,启动后如下:

OK,准备工作搞好了,可以开测了,点击http://localhost:8888/client/frontend几次,结果如下,,

1、Server Response :: Hello form Backend!!! Host : localhost :: Port : 9090

2、Server Response :: Hello form Backend!!! Host : localhost :: Port : 9092

3、Server Response :: Hello form Backend!!! Host : localhost :: Port : 9091

然后可以再启动或删除几个后端服务,如启动一个9093端口,在测试一下,9093端口对应的服务也可以访问到,效果同样OK。。。

那么,如果只想写死,从几个服务中选择,而不是自动变动呢,可以在客户端用以下配置,那么就会一直从这三个服务中选取了。

server.ribbon.listOfServers=localhost:9090,localhost:9091,localhost:9092

转载于:https://www.cnblogs.com/chenpi/p/10514093.html

基于Spring cloud Ribbon和Eureka实现客户端负载均衡相关推荐

  1. Spring Cloud入门教程(二):客户端负载均衡(Ribbon)

    对于大型应用系统负载均衡(LB:Load Balancing)是首要被解决一个问题.在微服务之前LB方案主要是集中式负载均衡方案,在服务消费者和服务提供者之间又一个独立的LB,LB通常是专门的硬件,如 ...

  2. Spring Cloud Ribbon 中的 7 种负载均衡策略

    负载均衡通器常有两种实现手段,一种是服务端负载均衡器,另一种是客户端负载均衡器,而我们今天的主角 Ribbon 就属于后者--客户端负载均衡器. 服务端负载均衡器的问题是,它提供了更强的流量控制权,但 ...

  3. Spring Cloud Alibaba - 06 RestTemplate 实现自定义负载均衡算法

    文章目录 负载均衡分类 分析 工程 调用 测试 源码 负载均衡分类 服务端负载均衡 ,比如我们常见的ng 客户端负载均衡 ,比如微服务体系中的ribbon spring cloud ribbon是 基 ...

  4. 基于Spring cloud ribbon实现多版本控制

    在我们使用spring mvc单体架构时, 我们可以通过uri,或者请求头做多版本路由,虽然同一个功能需要维护多个版本的接口,但是对于系统而言,不会因为新增一个接口版本而影响到老用户.当我们使用spr ...

  5. SpringCloud微服务架构,Spring Cloud 服务治理(Eureka,Consul,Nacos),Ribbon 客户端负载均衡,RestTemplate与OpenFeign实现远程调用

    什么是SpringCloud 微服务架构 • "微服务"一词源于 Martin Fowler的名为 Microservices的博文,可以在他的官方博客上找到 http://mar ...

  6. Spring Cloud【Finchley】-04使用Ribbon实现客户端负载均衡

    文章目录 概述 Ribbon演示 服务提供者微服务改造为使用MySql数据库 新建服务消费者微服务,配置Ribbon 注意事项 源码 概述 Spring Cloud-03将微服务注册到Eureka S ...

  7. Spring Cloud微服务笔记(四)客户端负载均衡:Spring Cloud Ribbon

    客户端负载均衡:Spring Cloud Ribbon 一.负载均衡概念 负载均衡在系统架构中是一个非常重要,并且是不得不去实施的内容.因为负载均衡对系统的高可用性. 网络压力的缓解和处理能力的扩容的 ...

  8. Spring Cloud Ribbon 负载均衡客户端调用示例

    承接 Spring Cloud 最简入门示例 这一篇, 本篇演示如何使用负载均衡客户端 Ribbon 调用在Eureka注册的服务. Ribbon 是什么? Ribbon是Netflix 的开源项目, ...

  9. 破甲两千六 Spring Cloud 教程(三):添加Spring Cloud 的 Netflix Eureka 插件,实现服务端、客户端的发现与注册

    写在前面: Spring Cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选.分布式会话等等. 5大常用组件: 服务发现 ...

最新文章

  1. python求向量函数的雅可比矩阵_在python Numpy中求向量和矩阵的范数实例
  2. 爬虫——基本库的使用
  3. C语言的关键字 extern
  4. web应用程序并发测试_测试并发应用
  5. 如何以及何时使用枚举和注释
  6. 倦怠和枯燥_如何不断学习(不倦怠)
  7. [原创]关于设置linux中vim 显示行号
  8. 实战演练:MySQL手动注册binlog文件造成主从同步异常
  9. github上传时出现error: src refspec master does not match any解决办法
  10. 转载:KOF97键盘连招
  11. 怎么卸载php xshell,xftp5如何卸载?xshell5卸载不了怎么办?
  12. 明翰英语教学系列之PTE与多邻国篇V1.1
  13. Matlab绘制直方图、概率密度函数、累积分布函数
  14. (openCV 十二)图像增强(对数变换/伽马变换/分段线性变换)
  15. 计算机体系架构未来趋势(深度)
  16. 如何批量修改照片后缀名
  17. 如何获取有价值的用户反馈?
  18. 源码角度分析Rebuild和Rebatch
  19. OCR--苹果ios安卓android身份证拍照扫描识别sdk
  20. 水晶苍蝇拍-其他系列之一

热门文章

  1. youtube根据channelId抓取栏目
  2. spring18-3: 工厂bean代理-半自动
  3. 《深入理解计算机系统》读书笔记六:整数表示
  4. 前端一HTML:十一:其他选择器
  5. oracle,导入,导出数据
  6. 公有/私有/保护继承、overload/overwrite/override之间的区别
  7. MeshLab中进行点云配准
  8. HDFS副本放置策略和机架感知
  9. Linux上机实验1
  10. allure 测试报告本地打开_Allure--自动化测试报告生成