一、负载均衡的简介:

负载均衡是高可用架构的一个关键组件,主要用来提高性能和可用性,通过负载均衡将流量分发到多个服务器,多服务器能够消除单个服务器的故障,减轻单个服务器的访问压力。

1、服务端负载均衡:客户端请求到负载均衡服务器,负载均衡服务器根据自身的算法将该请求转给某台真正提供业务的服务器,该服务器将响应数据给负载均衡服务器,负载均衡服务器最后将数据返回给客服端,服务端负载均衡完全由服务器处理,客户端不需要做任何事情。常见例子,例如:nginx

2、客服端负载均衡:基于客户端的负载均衡,简单的说就是在客户端程序里面,维护一组服务器引用,自己设定一个调度算法,在向服务器发起请求的时候,先执行调度算法计算出向哪台服务器发起请求,然后再发起请求给服务器,常见例子,例如:Ribbon

二、Ribbon的简介:

上一篇文章,讲了服务的注册和发现。在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的。Spring cloud提供两种服务调度方式,一种方式是ribbon+restTemplate,另一种方式是feign。这章先讲解下基于ribbon+restful的服务请求方式。

ribbon是一个负载均衡客户端,提供了很多在HTTP和TCP客户端之上的控制。Feign内部也已经使用了Ribbon, 所以只要使用了@FeignClient注解,也能实现本章功能。

三、准备集群服务:

通过标题我们也知道ribbon有负载均衡的功能,所以首先需要准备一个服务器集群,这一篇文章基于上一篇文章的工程,继续进行完善的。

1. 启动eureka-server 工程,eureka注册中心就启动了。

2. 启动springcloud-eureka-client工程,上篇文章我们知道springcloud-eureka-client工程的端口为9300。

3. 将springcloud-eureka-client工程的端口改成9400(修改application.properties文件),然后再启动springcloud-eureka-client。

通过上面三个步骤,我们就相当于在eureka服务上启动了两个springcloud-eureka-client服务,但是端口号不同,输入 http://localhost:8761/  查看页面效果

四、新建Ribbon客户端模块:

重新新建一个spring-boot工程,取名为:springcloud-ribbon-client

<parent>标签就是引入我们第一章节新建的父工程的pom.xml文件,具体可参考:一起来学Spring Cloud | 第一章 :如何搭建一个多模块的springcloud项目

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <parent>
<groupId>com.haly</groupId>
<artifactId>springcloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent> <groupId>com.haly</groupId>
<artifactId>springcloud-ribbon-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springcloud-ribbon-client</name>
<description>新建一个springcloud项目</description> <dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

新增springcloud-ribbon-client的配置文件application.properties

server.port=9500
spring.application.name=springcloud-ribbon-client
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

新增启动类SpringcloudRibbonClientApplication

@EnableDiscoveryClient向服务中心注册,并且注册了一个叫restTemplate的bean。

@ LoadBalanced注解表明,这个restRemplate是需要做负载均衡的。

package com.haly;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate; @SpringBootApplication
@EnableDiscoveryClient
public class SpringcloudRibbonClientApplication { public static void main(String[] args) {
SpringApplication.run(SpringcloudRibbonClientApplication.class, args);
} @Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
}

新建一个service类,用来调用第二章在springcloud-eureka-client模块中的hello方法,springcloud-eureka-client模块的搭建,详情参考:一起来学Spring Cloud | 第二章:服务注册和发现组件 (Eureka)

package com.haly.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate; @Service
public class RibbonService {
@Autowired
RestTemplate restTemplate; public String getHello(String name) {
return restTemplate.getForObject("http://springcloud-eureka-client/hello?name="+name,String.class);
} }

ps: 我们请求时用springcloud-eureka-client服务名代替了ip地址,在ribbon中它会根据服务名来选择具体的服务实例,根据服务实例在请求的时候会用具体的url替换掉服务名。

新建一个controller名为:RibbonController,来接收浏览器访问,RibbonController的getHello方法调用RibbonService的getHello方法

package com.haly.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import com.haly.service.RibbonService; @RestController
public class RibbonController {
@Autowired
RibbonService ribbonService; @GetMapping(value = "/getHello")
public String getHello(@RequestParam String name) {
return ribbonService.getHello(name);
} }

打开浏览器输入http://localhost:9500/getHello?name=young码农   多次访问页面会交替出现如下结果

从上图可以验证,当我们通过调用restTemplate.getForObject("http://springcloud-eureka-client/hello?name="+name,String.class)方法时,已经做了负载均衡,访问了不同的端口的服务实例。

五、实验总结:

本章结束后,项目结构:

1. 一个服务注册中心,eureka server,端口为8761

2. springcloud-eureka-client工程跑了两个实例,端口分别为9300,9400,分别向服务注册中心注册

3. springcloud-ribbon-client端口为9500,向服务注册中心注册

4. 当springcloud-ribbon-client通过restTemplate调用springcloud-eureka-client的hello接口时,因为用ribbon进行了负载均衡,会轮流的9300和9400 两个服务端口的hello接口

一起来学Spring Cloud | 第三章:服务消费者 (负载均衡Ribbon)的更多相关文章

  1. Spring Cloud 入门教程(二): 服务消费者(rest+ribbon)

    在上一篇文章,讲了服务的注册和发现.在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式,一种是ribbon+r ...

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

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

  3. 一起来学Spring Cloud | 第六章:服务网关 ( Zuul)

    本章节,我们讲解springcloud重要组件:微服务网关Zuul.如果有同学从第一章看到本章的,会发现我们已经讲解了大部分微服务常用的基本组件. 已经讲解过的: 一起来学Spring Cloud | ...

  4. 一起来学Spring Cloud | 第五章:熔断器 ( Hystrix)

    在微服务项目中,一个系统可以分割成很多个不同的服务模块,不同模块之间我们通常需要进行相互调用.springcloud中可以使用RestTemplate+Ribbon和Feign来调用(工作中基本都是使 ...

  5. 一起来学Spring Cloud | 第七章:分布式配置中心(Spring Cloud Config)

    上一章节,我们讲解了服务网关zuul,本章节我们从git和本地两种存储配置信息的方式来讲解springcloud的分布式配置中心-Spring Cloud Config. 一.Spring Cloud ...

  6. 《Spring Cloud》学习(二) 负载均衡!

    第二章 负载均衡 负载均衡是对系统的高可用.网络压力的缓解和处理能力扩容的重要手段之一.Spring Cloud Ribbon是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于Netfli ...

  7. 一起来学Spring Cloud | 第四章:服务消费者 ( Feign )

    上一章节,讲解了SpringCloud如何通过RestTemplate+Ribbon去负载均衡消费服务,本章主要讲述如何通过Feign去消费服务. 一.Feign 简介: Feign是一个便利的res ...

  8. spring cloud (四、服务消费者demo_consumer)

    spring cloud (一.服务注册demo_eureka) spring cloud (二.服务注册安全demo_eureka) spring cloud (三.服务提供者demo_provid ...

  9. Spring Cloud官方文档中文版-客户端负载均衡:Ribbon

    官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#_spring_cloud_netflix 文中例子我做了一些测试在:h ...

随机推荐

  1. 【python】string functions

    1.str.replace(word0,word1)  ##用word1替换str中所有的word0 >>> 'tea for too'.replace('too', 'two') ...

  2. JAVA NIO non-blocking模式实现高并发服务器

    JAVA NIO non-blocking模式实现高并发服务器 分类: JAVA NIO2014-04-14 11:12 1912人阅读 评论(0) 收藏 举报 目录(?)[+] Java自1.4以后 ...

  3. Java编程环境IntelliJ IDEA

    1. 下载并安装jdk,进行配置 https://www.cnblogs.com/zhangchao0515/p/6806408.html 2. 下载并安装 IntelliJ IDEA, 并进行破解 ...

  4. git 回退到服务器版本操作

    git fetch git reset orgin master --hard git pull

  5. Lua教程 loadfile与loadstring

    在程序运行中有时需要运行用户输入的代码1.loadfile把文件编译为可执行的函数f=loadfile('\\temp\\a.lua')     ----给f方法赋值print(type(f))  - ...

  6. SQL——基础概念

    服务器登录名:指有权限登录到某服务器的用户:如sa 服务器角色:指一组固定的服务器用户,默认有9组: 登录名一定属于某些角色,默认为public 服务器角色不容许更改 登录后也不一定有权限操作数据库 ...

  7. Lightoj1083【单调栈】

    #include <cstdio> #include <stack> #include <iostream> #include <string.h> # ...

  8. word2vec改进之Negative Sampling

    训练网络时往往会对全部的神经元参数进行微调,从而让训练结果更加准确.但在这个网络中,训练参数很多,每次微调上百万的数据是很浪费计算资源的.那么Negative Sampling方法可以通过每次调整很小 ...

  9. Android Activity生命周期(转)

    转自 http://blog.csdn.net/android_tutor/article/details/5772285

  10. dbutils下载