对于任何一个高可用高负载的系统来说,负载均衡是一个必不可少的名称。在大型分布式计算体系中,某个服务在单例的情况下,很难应对各种突发情况。因此,负载均衡是为了让系统在性能出现瓶颈或者其中一些出现状态下可以进行分发业务量的解决方案。在SpringCloud 体系当中,加入了Netflix公司的很多优秀产品,其中一个就是针对于服务端进行负载均衡的Ribbon。

本系列博文目录

【微服务】轻松搞定SpringCloud微服务目录

本系列为连载文章,阅读本文之前强烈建议您先阅读前面几篇。

相关简介

负载均衡简介

负载均衡:英文名称为Load Balance, 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

负载均衡带来的好处很明显:

Ribbon简介

Ribbon是Netflix开源的一款用于客户端软负载均衡的工具软件。Spring Cloud对Ribbon进行了一些封装以更好的使用Spring Boot的自动化配置理念。

Spring Cloud Ribbon 简介

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。它是一个基于HTTP和TCP的客户端负载均衡器。它可以通过在客户端中配置ribbonServerList来设置服务端列表去轮询访问以达到均衡负载的作用。

开始起飞

起飞之前,先说明一下,本项目前几篇文章中已经构建了相关子项目包括:注册中心、配置中心。本文中继续可以使用。

创建两个服务器

需要创建两个一模一样的服务器,让客户端按照不同的机制进行分发,达到负载均衡的效果。我们约定两个子项目名称:

cloud-hyh-service-1 端口号:8071

cloud-hyh-service-2 端口号:8072

对于服务名称设置一样:cloud-service ,其他业务都一样,可以复制。【端口号不一样】

pom.xml文件配置

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-eureka</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-web</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-starter-test</artifactId>
  13. <scope>test</scope>
  14. </dependency>
  15. </dependencies>
  16. <build>
  17. <plugins>
  18. <plugin>
  19. <groupId>org.springframework.boot</groupId>
  20. <artifactId>spring-boot-maven-plugin</artifactId>
  21. </plugin>
  22. </plugins>
  23. </build>

服务器一参数配置

  1. #服务注册中心配置
  2. eureka:
  3. client:
  4. service-url:
  5. defaultZone: http://localhost:8081/eureka/
  6. instance:
  7. appname: cloud-service
  8. lease-renewal-interval-in-seconds: 1
  9. server:
  10. port: 8071
  11. spring:
  12. application:
  13. name: cloud-service

服务器二参数配置

  1. #服务注册中心配置
  2. eureka:
  3. client:
  4. service-url:
  5. defaultZone: http://localhost:8081/eureka/
  6. instance:
  7. appname: cloud-service
  8. server:
  9. port: 8072
  10. spring:
  11. application:
  12. name: cloud-service

说明:与配置一其实基本一样,只不过将端口号配置成 8072

服务器入口配置Application.yml

  1. /**
  2. * @Description :
  3. * @Author hanyahong
  4. * @Date 2017/12/7- 17:35
  5. */
  6. @SpringBootApplication
  7. @EnableDiscoveryClient
  8. public class ServiceTwoApplication {
  9. public static void main(String[] args) {
  10. SpringApplication.run(ServiceTwoApplication.class, args);
  11. }
  12. }

新建测试API类

  1. /**
  2. * @Description :测试RibbonTest API
  3. * @Author hanyahong
  4. * @Date 2017/12/7- 17:40
  5. */
  6. @RestController
  7. @RequestMapping(value = "/ribbon")
  8. public class RibbonTestApi {
  9. /**
  10. * 获取博客名称API
  11. *
  12. * @return 相关信息
  13. */
  14. @RequestMapping(value = "name", method = RequestMethod.GET)
  15. public String getMyBlogNameApi() {
  16. return "千万之路刚开始-www.hanyahong.com-beijing"+"该服务器端口号:8071";
  17. }
  18. }
  19. 备注:两台服务器,除了返回的服务器端口号 8071 8072不同之外,其他都相同,就是为了看到效果。

创建测试客户端

创建一个子项目,cloud-hyh-ribbon-client ,主要用来测试ribbon客户端负载。

pom文件配置

在pom文件中加入以下依赖:

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-eureka</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-web</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-starter-test</artifactId>
  13. <scope>test</scope>
  14. </dependency>
  15. </dependencies>
  16. <build>
  17. <plugins>
  18. <plugin>
  19. <groupId>org.springframework.boot</groupId>
  20. <artifactId>spring-boot-maven-plugin</artifactId>
  21. </plugin>
  22. </plugins>
  23. </build>

配置文件application配置

  1. eureka:
  2. client:
  3. service-url:
  4. defaultZone: http://localhost:8081/eureka/
  5. instance:
  6. appname: ribbon-client
  7. server:
  8. port: 8092
  9. spring:
  10. application:
  11. name: ribbon-client

配置子项目启动类

  1. /**
  2. * @Description :启动类,示范负载均衡服务器
  3. * @Author hanyahong
  4. * @Date 2017/12/7- 17:00
  5. */
  6. @SpringBootApplication
  7. @EnableDiscoveryClient
  8. public class RibbonServiceApplication {
  9. public static void main(String[] args) {
  10. SpringApplication.run(RibbonServiceApplication.class, args);
  11. }
  12. /**
  13. * Spring提供的用于访问Rest服务的客户端
  14. * @return
  15. */
  16. @Bean
  17. @LoadBalanced
  18. RestTemplate restTemplate() {
  19. return new RestTemplate();
  20. }
  21. }

说明:

RestTemplate是Spring提供的用于访问Rest服务的客户端。RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。调用RestTemplate的默认构造函数,RestTemplate对象在底层通过使用java.net包下的实现创建HTTP 请求,可以通过使用ClientHttpRequestFactory指定不同的HTTP请求方式。

ClientHttpRequestFactory接口主要提供了两种实现方式,一种是SimpleClientHttpRequestFactory,使用J2SE提供的方式(既java.net包提供的方式)创建底层的Http请求连接,还有一种方式是使用HttpComponentsClientHttpRequestFactory方式,底层使用HttpClient访问远程的Http服务,使用HttpClient可以配置连接池和证书等信息。

@LoadBalanced 注解加在RestTemplate上面,这个注解会自动构造LoadBalancerClient接口的实现类并注册到Spring容器中。

创建接口API

  1. /**
  2. * @Description : 测试客户端负载均衡的接口API
  3. * @Author hanyahong
  4. * @Date 2017/12/7- 18:01
  5. */
  6. @RestController
  7. @RequestMapping(value = "/test")
  8. public class TestRibbonApi {
  9. /**
  10. * 注入RestTemplate
  11. */
  12. @Autowired
  13. RestTemplate restTemplate;
  14. @RequestMapping(value = "/blog/name" ,method = RequestMethod.GET)
  15. public String testGetNameOfBlog(){
  16. String url="http://CLOUD-SERVICE/ribbon/name";
  17. return restTemplate.getForObject(url,String.class);
  18. }
  19. }

注意:这个代码中 url 设置的是 上面提到的服务器的服务名。

启动项目群进行测试

经过全面的配置,服务器全面配置完毕,包括一个注册中心、一个配置中心、两个相同配置的服务器、一台测试客户端负载均衡的测试服务器。

启动成功以后会在注册中心看到。

通过访问客户端地址:http://localhost:8092/test/name 就可以访问。效果如下:



刷新一次:

至此所有配置成功。测试结果也成功。

本文源码

Github源码:https://github.com/hanyahong/spring-cloud-microservice

【微服务】之四:轻松搞定SpringCloud微服务-负载均衡Ribbon的更多相关文章

  1. 【微服务】之五:轻松搞定SpringCloud微服务-调用远程组件Feign

    上一篇文章讲到了负载均衡在Spring Cloud体系中的体现,其实Spring Cloud是提供了多种客户端调用的组件,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使 ...

  2. 【微服务】之六:轻松搞定SpringCloud微服务-API网关zuul

    通过前面几篇文章的介绍,我们可以轻松搭建起来微服务体系中比较重要的几个基础构建服务.那么,在本篇博文中,我们重点讲解一下,如何将所有微服务的API同意对外暴露,这个就设计API网关的概念. 本系列教程 ...

  3. 【微服务】之七:轻松搞定SpringCloud微服务-API权限控制

    权限控制,是一个系统当中必须的重要功能.张三只能访问输入张三的特定功能,李四不能访问属于赵六的特定菜单.这就要求对整个体系做一个完善的权限控制体系.该体系应该具备针区分用户.权限.角色等各种必须的功能 ...

  4. 【微服务】之二:从零开始,轻松搞定SpringCloud微服务系列--注册中心(一)

    微服务体系,有效解决项目庞大.互相依赖的问题.目前SpringCloud体系有强大的一整套针对微服务的解决方案.本文中,重点对微服务体系中的服务发现注册中心进行详细说明.本篇中的注册中心,采用Netf ...

  5. 【微服务】之三:从零开始,轻松搞定SpringCloud微服务-配置中心

    在整个微服务体系中,除了注册中心具有非常重要的意义之外,还有一个注册中心.注册中心作为管理在整个项目群的配置文件及动态参数的重要载体服务.Spring Cloud体系的子项目中,Spring Clou ...

  6. 从零开始,轻松搞定SpringCloud微服务系列

    本系列博文目录 [微服务]之一:从零开始,轻松搞定SpringCloud微服务系列–开山篇(spring boot 小demo) [微服务]之二:从零开始,轻松搞定SpringCloud微服务系列–注 ...

  7. 【微框架】之一:从零开始,轻松搞定SpringCloud微服务系列--开山篇(spring boot 小demo)

    Spring顶级框架有众多,那么接下的篇幅,我将重点讲解SpringCloud微框架的实现 Spring 顶级项目,包含众多,我们重点学习一下,SpringCloud项目以及SpringBoot项目 ...

  8. 【微框架】之一:从零开始,轻松搞定SpringCloud微框架系列--开山篇(spring boot 小demo)

    Spring顶级框架有众多,那么接下的篇幅,我将重点讲解SpringCloud微框架的实现 Spring 顶级项目,包含众多,我们重点学习一下,SpringCloud项目以及SpringBoot项目 ...

  9. 带你十天轻松搞定 Go 微服务系列(二)

    上篇文章开始,我们通过一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下: 环境搭建 服务拆分(本文) 用户服务 产品服务 订单服务 支付服务 RPC 服务 ...

随机推荐

  1. awake()和start()还有update(),fixedupdate()的差别

    1.首先看一下untiy官方对awake()和start()的定义 awake()和start()函数会在脚本加载后自动调用,awake()会先被调用,即使脚本未被调用.最好用来设置脚本之间的引用和初 ...

  2. ArrayList 源码(基于Java1.8)

    ArrayList 源码 ArrayList 基于数组实现,也就是类对变量 Object[]系列操作,封装为常用的add,remove,indexOf, contains本质是通过 size 计数器对 ...

  3. PHP的重载及魔术方法

    首先你要知道什么是php的魔术方法,它不是变魔术的,如果你想学习变魔术来错地方了哦! 定义:PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法.所以在定义类方法时,除了上述魔术方法,建议不 ...

  4. Lua中metatable和__index的联系

    Lua中metatable和__index的联系 可以参考 http://blog.csdn.net/xenyinzen/article/details/3536708 来源 http://blog. ...

  5. sersync实现数据实时同步

    1.1 第一个里程碑:安装sersync软件 1.1.1 将软件上传到服务器当中并解压 1.上传软件到服务器上 rz -E 为了便于管理上传位置统一设置为 /server/tools 中 2.解压软件 ...

  6. 磁盘管理 之 parted命令添加swap,文件系统

    第1章 磁盘管理 1.1 必须要了解的. 1.1.1 ps aux 命令中 RSS 与VSZ的含义 rss 进程占用的物理内存的大小 单位:kb : vsz 进程占用的虚拟的内存大小(物理内存+swa ...

  7. AngularJS学习篇(六)

    AngularJS 控制器 AngularJS 应用程序被控制器控制. ng-controller 指令定义了应用程序控制器. 控制器是 JavaScript 对象,由标准的 JavaScript 对 ...

  8. 私有成员 ECMAScript6 weakmap

    把变量放到构造函数里进行私有化,每一个实例都会有一个getName方法,这是低效率的.function Person(name) { this.getName = function() { retur ...

  9. JAVA 后台SSM框架接收安卓端的json数据

    最近项目上与安卓端做JSON数据交互,使用的SSM框架,刚开始的时候感觉很简单,想着不就是把安卓端的JSON数据封装为Bean类对象吗? 于是就这样写了 可是这样一直报400,百度原因是因为请求url ...

  10. python链接mysql以及常用语法

    MySQL是一个关系型数据库管理系统 ,其体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库.在使用过程中不总是和它打交道,导致使用时候都得 ...