上次我们了解了eureka(参见Greenwich.SR2版本的Spring Cloud Eureka实例),里面的服务消费方(服务实例a-beautiful-client)我们其实已经用到了ribbon。在pom里我们引入了

     <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

  在主类中我们通过RestTemplate的@LoadBalanced注解启动了ribbon

@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}

  因此,ribbon实例我们上次其实已经实现了,只要我们启动两个服务提供方实例(a-bootiful-client,如何启动多个实例参见IDEA同一项目启动多个实例),不停的刷新浏览器中消费方的请求链接(http://localhost:8763/sayHello?name=world),你会发现端口号是顺序变化的:

   

  这是因为ribbon默认的负载均衡策略就是轮询。

  Spring Cloud Ribbon是一个客户端负载均衡工具,与传统的服务端负载均衡(如Nginx)不同。首先服务端负载均衡需要一个独立的服务器来路由客户端请求到服务端去,另外客户端负载均衡需要客户端自己去维护服务实例的列表。或者可以这么理解,客户端里集成了一个服务端的负载均衡就成了客户端负载均衡了。那么客户端如何查询并维护(心跳)这份服务列表呢?它只能去找注册中心Eureka求助了。Spring Cloud微服务之间的调用不是rpc而是http,我们的客户端调服务端(或者说服务的消费方调提供方)是通过REST模板请求来进行的,因此我们的客户端负载均衡也离不开REST。

  那么ribbon的客户端负载均衡是如何通过REST实现的呢?首先从服务列表中根据负载均衡策略选出一个指定的服务实例,再根据服务实例进行http调用。我们看下ribbon给我提供的负载均衡策略都有哪些:

策略名 策略描述
BestAvailableRule 选择一个最小的并发请求的服务实例
AvailabilityFilteringRule 过滤掉那些因为一直连接失败的被标记为熔断的服务实例,并过滤掉那些高并发超过一定阈值的服务实例
WeightedResponseTimeRule 根据响应时间分配一个权重区间,响应时间越长,权重区间越窄,被选中的可能性越低
RetryRule 对选定的负载均衡策略机上重试机制
RoundRobinRule 方式轮询选择服务实例
RandomRule 随机选择一个服务实例
ZoneAvoidanceRule 复合判断服务实例所在区域的性能和可用性进行服务实例选择

  如果你想定制自己的负载均衡策略也是可以的,只需在application里新增一个配置即可:

#配置调用服务实例a-bootiful-client的负载均衡策略
a-bootiful-client.ribbon.NFLoadBalanceRuleClassName=com.netflix.loadbalancer.RandomRule

  我们这里配置了随机,两个实例随机的比例无法看出,我们再加两个实例8773、8774:

  这时我们再不停的刷浏览器的,可以看到端口号不再是顺序出现的,而是随机的。

  接下来我们看下,ribbon如果脱离注册中心和REST如何实现负载均衡。

  1、application新增如下配置:

#负载均衡时关闭到eureka的连接
ribbon.eureka.enabled=false #配置服务实例a-bootiful-client的服务列表
a-bootiful-client.ribbon.listOfServers=localhost:8762,localhost:8772 #配置服务实例a-bootiful-client的负载均衡策略
a-bootiful-client.ribbon.NFLoadBalanceRuleClassName=com.netflix.loadbalancer.RandomRule

  2、去掉主类的REST的@LoadBalance注解

//    @LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}

  3、获取负载均衡处理后选中的服务实例,并解析服务实例ip和port进行调用

    @Autowired
private LoadBalancerClient loadBalancerClient; @Override
public String call(String name) {
// 获取负载均衡策略选择后的实例
ServiceInstance instance = loadBalancerClient.choose("a-bootiful-client"); // 不再根据服务实例名调用,而是通过ip和端口调用
ResponseEntity resultResponseEntity = restTemplate.postForEntity("http://" + instance.getHost() + ":" + instance.getPort() + "/hello?name=" + name, null, String.class);
if (resultResponseEntity != null && resultResponseEntity.getBody() != null) {
return name + " says: " + resultResponseEntity.getBody().toString();
}
return null;
}

  从上面可以看出,缺少了注册中心eureka后,我们只能自己配置服务列表ribbon.listOfServers(想一想,如果只配置一个服务实例,不是就实现直连了吗?),而且也没法通过服务实例调用REST了,我们得解析出负载均衡选出的服务实例的url才能调用成功。如果服务列表中某个实例挂掉了,客户端是无法感知的,这时就有可能会出现调用失败的情况了。所以一般我们不推荐这种配置。如果服务提供方挂掉,消费方如何实现服务保护呢?详见Greenwich.SR2版本的Spring Cloud Hystrix实例

  

Greenwich.SR2版本的Spring Cloud Ribbon实例的更多相关文章

  1. Greenwich.SR2版本的Spring Cloud Eureka实例

    作为微服务架构中最为核心和基础的服务治理,注册中心提供了微服务实例的自动化注册与发现.而作为一个服务注册中心,eureka的作用与传统的zk.etcd的作用是一样的,同样也支持高可用(集群).不同之处 ...

  2. Greenwich.SR2版本的Spring Cloud Feign实例

    前面我们了解了Spring Cloud Ribbon和Hystrix,在使用上它们基本上会成队出现,那么是不是可以把它们组合起来使用?而且我们发现,在服务消费方a-beautiful-client里通 ...

  3. Greenwich.SR2版本的Spring Cloud Zuul实例

    网关作为对外服务,在微服务架构中是一个很重要的组件,主要体现在动态路由和接入鉴权这两个功能上.现在我们通过Spring Cloud Zuul来实现对之前a-feign-client(参见Greenwi ...

  4. Greenwich.SR2版本的Spring Cloud Hystrix实例

    之前我们在eureka(参见Greenwich.SR2版本的Spring Cloud Eureka实例)中,服务消费方a-beautiful-client调用服务提供方a-bootiful-clien ...

  5. Greenwich.SR2版本的Spring Cloud Zipkin实例

    调用链跟踪是微服务架构中的基础能力,Spring Cloud Zipkin+Sleuth为我们提供了该能力.首先我们先建立Zipkin服务端,它需要集成Eureka,用于发现服务提供方和消费方,进行数 ...

  6. Greenwich.SR2版本的Spring Cloud Config+BUS实例

    Spring Cloud Config统一的配置中心同注册中心Eureka一样,也分服务端和客户端.服务端用来保存配置信息,客户端用来读取.它的优势是基于Git仓库,支持多环境.多分支配置.动态刷新. ...

  7. Spring Cloud Ribbon配置详解

    概述 有时候需要自定义Ribbon的配置和客户端超时配置. 自动化配置 /* 使用属性自定义功能区客户端 从版本1.2.0开始,Spring Cloud Netflix现在支持使用属性与Ribbon文 ...

  8. 为Spring Cloud Ribbon配置请求重试(Camden.SR2+)

    当我们使用Spring Cloud Ribbon实现客户端负载均衡的时候,通常都会利用@LoadBalanced来让RestTemplate具备客户端负载功能,从而实现面向服务名的接口访问. 下面的例 ...

  9. 0.9.0.RELEASE版本的spring cloud alibaba nacos+gateway网关实例

    gateway就是用来替换zuul的,功能都差不多,我们看下它怎么来跟nacos一起玩.老套路,三板斧: 1.pom: <?xml version="1.0" encodin ...

随机推荐

  1. kubernetes Node节点部署(四)

    一.部署kubelet 1.1.二进制包准备 将软件包从linux-node1复制到linux-node2中去 [root@linux-node1 ~]# cd /usr/local/src/kube ...

  2. idea上 实现了Serializable接口,要自动生成serialVersionUID的方法

    需要点进setting ->搜索Inspections-->右侧选择java 下拉 进入Serialization issue--->勾选Serializable class wit ...

  3. LESS简介与使用方法

    less 是一门 CSS 预处理语言,它扩展了 CSS 语言,增加了变量.Mixin.函数等特性,使 CSS 更易维护和扩展. 一.传统写法与 less 写法对比 1. 传统 css 写法: .con ...

  4. python中函数的定义、返回值以及参数的简要介绍

    一. 1.函数 定义:def关键字开头,空格之后接函数名称和圆括号(),后面紧跟‘:”. 函数是对功能的封装 语法: def 函数名(形参列表): 函数体(代码块,return) 调用: 函数名(实参 ...

  5. JS 使用RSA加密解密

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>使 ...

  6. 《AlwaysRun团队》第三次作业:团队项目的原型设计

    <AlwaysRun团队>第三次作业:团队项目的原型设计 项目 内容 这个作业属于哪个课程 [任课教师博客主页链接](https://home.cnblogs.com/u/nwnu-dai ...

  7. WCF之MSMQ消息队列

    一.MSMQ简介 MSMQ(微软消息队列)是Windows操作系统中消息应用程序的基础,是用于创建分布式.松散连接的消息通讯应用程序的开发工具. MSMQ与XML Web Services和.Net ...

  8. Oracle数据库 — DDL:数据定义语言

    1.数据定义语言:用于定义数据库的结构,比如创建.修改或删除数据库对象: 包括: CREATE TABLE:创建数据库表:创建表的命名规则: 2.以字母开头:在 1–30 个字符之间:只能包含 A–Z ...

  9. BZOJ1209 最佳包裹 (三维凸包 增量法)

    题意 求三维凸包的表面积. N≤100N\le100N≤100 题解 暴力往当前的凸包里加点.O(n2)O(n^2)O(n2).题解详见大佬博客 扰动函数shakeshakeshake是为了避免四点共 ...

  10. BZOJ3331 压力 (圆方树+树上差分)

    题意 略 题解 求路径上的割点. 然后就直接圆方树上差分 CODE #include <bits/stdc++.h> using namespace std; inline void rd ...