一起来学Spring Cloud | 第三章:服务消费者 (负载均衡Ribbon)
一、负载均衡的简介:
负载均衡是高可用架构的一个关键组件,主要用来提高性能和可用性,通过负载均衡将流量分发到多个服务器,多服务器能够消除单个服务器的故障,减轻单个服务器的访问压力。
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)的更多相关文章
- Spring Cloud 入门教程(二): 服务消费者(rest+ribbon)
在上一篇文章,讲了服务的注册和发现.在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式,一种是ribbon+r ...
- Spring Cloud入门教程(二):客户端负载均衡(Ribbon)
对于大型应用系统负载均衡(LB:Load Balancing)是首要被解决一个问题.在微服务之前LB方案主要是集中式负载均衡方案,在服务消费者和服务提供者之间又一个独立的LB,LB通常是专门的硬件,如 ...
- 一起来学Spring Cloud | 第六章:服务网关 ( Zuul)
本章节,我们讲解springcloud重要组件:微服务网关Zuul.如果有同学从第一章看到本章的,会发现我们已经讲解了大部分微服务常用的基本组件. 已经讲解过的: 一起来学Spring Cloud | ...
- 一起来学Spring Cloud | 第五章:熔断器 ( Hystrix)
在微服务项目中,一个系统可以分割成很多个不同的服务模块,不同模块之间我们通常需要进行相互调用.springcloud中可以使用RestTemplate+Ribbon和Feign来调用(工作中基本都是使 ...
- 一起来学Spring Cloud | 第七章:分布式配置中心(Spring Cloud Config)
上一章节,我们讲解了服务网关zuul,本章节我们从git和本地两种存储配置信息的方式来讲解springcloud的分布式配置中心-Spring Cloud Config. 一.Spring Cloud ...
- 《Spring Cloud》学习(二) 负载均衡!
第二章 负载均衡 负载均衡是对系统的高可用.网络压力的缓解和处理能力扩容的重要手段之一.Spring Cloud Ribbon是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于Netfli ...
- 一起来学Spring Cloud | 第四章:服务消费者 ( Feign )
上一章节,讲解了SpringCloud如何通过RestTemplate+Ribbon去负载均衡消费服务,本章主要讲述如何通过Feign去消费服务. 一.Feign 简介: Feign是一个便利的res ...
- spring cloud (四、服务消费者demo_consumer)
spring cloud (一.服务注册demo_eureka) spring cloud (二.服务注册安全demo_eureka) spring cloud (三.服务提供者demo_provid ...
- Spring Cloud官方文档中文版-客户端负载均衡:Ribbon
官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#_spring_cloud_netflix 文中例子我做了一些测试在:h ...
随机推荐
- HihoCoder 1502 : 最大子矩阵 (双指针)
描述 给定一个NxM的矩阵A和一个整数K,小Hi希望你能求出其中最大(元素数目最多)的子矩阵,并且该子矩阵中所有元素的和不超过K. 输入 第一行包含三个整数N.M和K. 以下N行每行包含M个整数,表示 ...
- [国家集训队]Crash的数字表格 / JZPTAB
传送门 题目要求,求: \[\sum_{i=1}^n\sum_{j=1}^mlcm(i,j)\] 先转化为gcd的形式,然后枚举gcd. \[\sum_{i=1}^n\sum_{j=1}^m\sum_ ...
- AtCoder Grand Contest 012 C:Tautonym Puzzle
题目传送门:https://agc012.contest.atcoder.jp/tasks/agc012_c 题目翻译 如果一个字符串是好的,那么这个字符串的前半部分和后半部分肯定一模一样.比如\(a ...
- java 02 内部类
- socket学习目录
深入探析c# Socket http://www.cnblogs.com/tianzhiliang/archive/2010/09/08/1821623.html Http和Socket连接区别 ht ...
- SQL repeat()函数
转自:https://www.yiibai.com/sql/sql-repeat-function.html REPEAT(str,count) 返回一个字符串组成的字符串STR重复的次数.如果计数小 ...
- SSE2介绍及其简单用法举例
http://blog.csdn.net/fengbingchun/article/details/18515241
- UVa 10723 Cyborg Genes (LCS, DP)
题意:给定两行字符串,让你找出一个最短的序列,使得这两个字符串是它的子串,并且求出有多少种. 析:这个题和LCS很像,我们就可以利用这个思想,首先是求最短的长度,不就是两个字符串长度之和再减去公共的么 ...
- cocos2dx 新手引导
static CCClippingNode* create(); //使用一个节点作为模版创建裁剪节点 static CCClippingNode* create(CCNode *pStencil); ...
- 使用js在html文档的任意位置输出内容
<script type="text/javascript">document.write('这里是内容');</script>