【微服务】之四:轻松搞定SpringCloud微服务-负载均衡Ribbon

对于任何一个高可用高负载的系统来说,负载均衡是一个必不可少的名称。在大型分布式计算体系中,某个服务在单例的情况下,很难应对各种突发情况。因此,负载均衡是为了让系统在性能出现瓶颈或者其中一些出现状态下可以进行分发业务量的解决方案。在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文件配置

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

服务器一参数配置

#服务注册中心配置
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8081/eureka/
  instance:
    appname: cloud-service
    lease-renewal-interval-in-seconds: 1

server:
  port: 8071

spring:
  application:
    name: cloud-service

服务器二参数配置

#服务注册中心配置
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8081/eureka/
  instance:
    appname: cloud-service

server:
  port: 8072

spring:
  application:
    name: cloud-service

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

服务器入口配置Application.yml

/**
 * @Description :
 * @Author hanyahong
 * @Date 2017/12/7- 17:35
 */
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceTwoApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceTwoApplication.class, args);
    }
}

新建测试API类

/**
 * @Description :测试RibbonTest API
 * @Author hanyahong
 * @Date 2017/12/7- 17:40
 */
@RestController
@RequestMapping(value = "/ribbon")
public class RibbonTestApi {

    /**
     * 获取博客名称API
     *
     * @return 相关信息
     */
    @RequestMapping(value = "name", method = RequestMethod.GET)
    public String getMyBlogNameApi() {
        return "千万之路刚开始-www.hanyahong.com-beijing"+"该服务器端口号:8071";
    }
}

备注:两台服务器,除了返回的服务器端口号 8071 8072不同之外,其他都相同,就是为了看到效果。

创建测试客户端

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

pom文件配置

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

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
<build>
     <plugins>
         <plugin>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
     </plugins>
 </build>

配置文件application配置

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8081/eureka/
  instance:
    appname: ribbon-client

server:
  port: 8092

spring:
  application:
    name: ribbon-client

配置子项目启动类

/**
 * @Description :启动类,示范负载均衡服务器
 * @Author hanyahong
 * @Date 2017/12/7- 17:00
 */
@SpringBootApplication
@EnableDiscoveryClient
public class RibbonServiceApplication {

    public static void main(String[] args) {

        SpringApplication.run(RibbonServiceApplication.class, args);
    }

    /**
     * Spring提供的用于访问Rest服务的客户端
     * @return
     */
    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

说明:

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

/**
 * @Description : 测试客户端负载均衡的接口API
 * @Author hanyahong
 * @Date 2017/12/7- 18:01
 */
@RestController
@RequestMapping(value = "/test")
public class TestRibbonApi {
    /**
     * 注入RestTemplate
     */
    @Autowired
    RestTemplate restTemplate;

    @RequestMapping(value = "/blog/name" ,method = RequestMethod.GET)
    public String testGetNameOfBlog(){
        String url="http://CLOUD-SERVICE/ribbon/name";
        return restTemplate.getForObject(url,String.class);
    }
}

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

启动项目群进行测试

经过全面的配置,服务器全面配置完毕,包括一个注册中心、一个配置中心、两个相同配置的服务器、一台测试客户端负载均衡的测试服务器。
启动成功以后会在注册中心看到。

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

刷新一次:

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

本文源码

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

时间: 2024-08-29 11:12:18

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

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

上一篇文章讲到了负载均衡在Spring Cloud体系中的体现,其实Spring Cloud是提供了多种客户端调用的组件,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLConnection.Apache的Http Client.Netty的异步HTTP Client, Spring的RestTemplate.但是,用起来最方便.最优雅的还是要属Feign了.今天这一篇文章是系列教程中第五篇,也是对负载均衡的第二篇,主

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

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

干货分享微服务spring-cloud(4.负载均衡ribbon与熔断器hystrix)

Ribbon是一个基于http和tcp的客户端负载均衡工具 Hystrix具备服务降级.服务熔断.线程和信号隔离.请求缓存.请求合并以及服务监控 为了方便消费者负载均衡效果,复制demo-springcloud-client1并重名为demo-springcloud-client2,修改配置文件和启动类,服务提供者1和2服务名均为spring.application.name=demo-springcloud-client 修改YhqContoller实现,为了方便负载均衡观察效果,demo-s

六步轻松搞定,自建APP不求人

随着互联网浪潮的席卷,越来越多的传统企业开始涉足互联网领域.无论是出于企业转型升级考虑,还是受市场整体环境的驱动,很多企业凭借某一领域的绝对优势,浩浩荡荡进军移动互联网领域,通过自建APP的方式,推出属于自己的移动端应用产品. 不少企业在探寻如何自建APP的过程中,遇到的第一个决策性难题就是:自建APP开发团队还是外包APP建设?其实对于大多数企业而言,由于企业内部组织架构设置问题,尚没有配备完善的自建APP开发团队,同时财政预算有限,难以承担整体自建APP工作.对于这类中小型企业而言,如何能够

12步轻松搞定python装饰器

12步轻松搞定python装饰器 呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂.搞定装饰器需要你了解一些函数式编程的概念,当然还有理解在python中定义和调用函数相关语法的一些特点. 我没法让装饰器变得简单,但是通过一步步的剖析,我也许能够让你在理解装饰器的时候更自信一点.因为装饰器很复杂,这篇文章将会很长(自己都说很长,还敢这么多废话blablabla...前戏就不继续翻译直接省略了) 1. 函数 在python中,函数通

深入浅出 Python 装饰器:16 步轻松搞定 Python 装饰器

Python的装饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西.虽然好像,他们要干的事都很相似--都是想要对一个已有的模块做一些"修饰工作",所谓修饰工作就是想给现有的模块加上一些小装饰(一些小功能,这些小功能可能好多模块都会用到),但又不让这个小装饰(小功能)侵入到原有的模块中的代码里去.但是OO的Decorator简直就是一场恶梦,不信你就去看看wikipedia上的词条

【转】轻松搞定FTP之FlashFxp全攻略

转载网址:http://www.newhua.com/2008/0603/39163.shtml 轻松搞定FTP之FlashFxp全攻略 导读: FlashFXP是一款功能强大的FXP/FTP软件,融合了一些其他优秀FTP软件的优点.如像CuteFTP一样可以比较文件夹,支持彩色文字显示:像BpFTP支持多文件夹选择文件,能够缓存文件夹:像LeapFTP一样的外观界面,甚至设计思路也比较相似,支持文件夹 (带子文件夹)的文件传送.删除:支持上传.下载及第三方文件续传:可以跳过指定的文件类型,只传

在线讲堂:轻松搞定基于嵌入式、桌面、内网和云的软件授权

我们诚挚地邀请您参加 6 月19 日举办的圣天诺第2季 "在线讲堂".软件交付的规划过程是一个连续组合规划过程 - 开发.授权.部署和支持.反馈.不懈努力研发客户期盼的产品,同时让服务供应商获利. 本期讲堂帮助您了解: 追踪软件部署如何改善客户体验和提高客户满意度 授权实施选项 – 从桌面.嵌入式.内网,到移动和云 探讨内网环境的软件授权 -   在内网环境下,强制执行和授权面临哪些挑战? -   内网环境下成功部署的解决方案是什么? 用一套方案管理所有授权部署的重要性 主讲:王福涛

使用BleLib的轻松搞定Android低功耗蓝牙Ble 4.0开发具体解释

转载请注明来源: http://blog.csdn.net/kjunchen/article/details/50909410 使用BleLib的轻松搞定Android低功耗蓝牙Ble 4.0开发具体解释 演示样例源代码: https://github.com/junkchen/BleLib/tree/master/sample Android ble4.0开发基础篇:http://blog.csdn.net/kjunchen/article/details/50339549 BleLib是An