上一篇文章,简单概述了服务注册与发现,在微服务架构中,业务都会被拆分成一个独立的服务,服务之间的通讯是基于http restful的,Ribbon可以很好地控制HTTP和TCP客户端的行为,Spring Cloud有两种调用方式,一种是Ribbon+RestTemplate,另一种是Feign(集成Ribbon+Hystrix),本章主要讲解Ribbon

- Ribbon简介

Ribbon 是一个客户端负载均衡器,它可以让你对HTTP和TCP客户机的行为有很大的控制权,如果你正在使用 @FeignClient 那么这一段也适用,因为Feign集成了Ribbon的功能,Ribbon 中的一个中心概念就是指定客户端,每个负载均衡器都是组成组件的一部分,这些组件一起工作以根据需要请求远程服务器。

官方文档:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#spring-cloud-ribbon

- 准备工作

1.创建项目,在上一章已经详细描述了,没看过的可以详细看一下 一起来学SpringCloud之-注册中心(Eureka/Consul)

2.启动Consul,后续所有文章都将以Consul作为服务注册中心

创建Ribbon项目

- pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

- BattcnCloudRibbonApplication.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class BattcnCloudRibbonApplication { @Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
} @GetMapping("/ribbon")
public String findHelloByEmail(String email) {
// VIP模式,不需要填写 IP+端口 Ribbon会去注册中心获取当前可用服务然后做HTTP请求
return "server <<==>> "+restTemplate().getForObject("http://battcn-cloud-hello/hello?email="+email,String.class);
} public static void main(String[] args) {
SpringApplication.run(BattcnCloudRibbonApplication.class, args);
}
}

- bootstrap.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server:
port: 8764 spring:
application:
name: battcn-cloud-ribbon
cloud:
consul:
host: localhost
port: 8500
enabled: true
discovery:
enabled: true
prefer-ip-address: true

- 测试

启动:battcn-cloud-hello(上一章的项目,稍微做了修改,app.java中添加了日志输出)
启动:battcn-cloud-ribbon(本章项目)

访问:http://localhost:8500/ 显示如下代表服务注册成功

查看注册中心

访问:http://localhost:8763/ribbon?email=123456@qq.com

1
server <<==>> My Name's :battcn-cloud-hello Email:123456@qq.com

如果需要测试负载功能,将 battcn-cloud-hello 打包,然后通过 cmd 方式启动,因为我使用的是IDEA总是提示我关闭重启,因此我是打的JAR,如果是Eclipse的朋友可以直接修改yml文件的端口启动多次

1
2
3
battcn-cloud-hello-8762:java -jar battcn-cloud-hello-1.0.0-SNAPSHOT.jar --server.port=8762

battcn-cloud-hello-8763:java -jar battcn-cloud-hello-1.0.0-SNAPSHOT.jar --server.port=8763

结果

- 请求图

架构图

画图工具:https://www.processon.com/

- 新特性

从版本1.2.0开始,Spring Cloud Netflix现在支持使用属性与Ribbon文档兼容来自定义功能区客户端。

允许在不同环境中更改启动时的行为。

支持的属性如下所示,应以.ribbon.:

NFLoadBalancerClassName:应实现 ILoadBalancer

NFLoadBalancerRuleClassName:应实现 IRule

NFLoadBalancerPingClassName:应实现 IPing

NIWSServerListClassName:应实现 ServerList

NIWSServerListFilterClassName 应实现 ServerListFilter

注意:在这些属性中定义的类优先于使用@RibbonClient(configuration=MyRibbonConfig.class) Spring 定义的bean 以及由Spring Cloud Netflix提供的默认值。要设置IRule服务名称,users您可以设置以下内容:

application.yml

1
2
3
users:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule

详细请看官方文档:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#_customizing_the_ribbon_client_using_properties

- 定义自己的RibbonClient

警告:在FooConfiguration 中使用 @Configuration,需要注意是不是在@ComponentScan主应用程序上下文,否则会被所有的共享@RibbonClients。如果您使用@ComponentScan(或@SpringBootApplication)您需要采取措施避免它被包含(例如将其放在一个单独的,不重叠的包中,或者指定要在其中显式扫描的包@ComponentScan)。

简单点说就是:不要让 @ComponentScan 同时扫描到主程序和自定义的带有@Configuration的文件

1
2
3
com.battcn.BattcnCloudRibbonApplication.java

com.config.FooConfiguration.java

- FooConfiguration

1
2
3
4
5
6
7
@Configuration
public class FooConfiguration {
@Bean
public IRule ribbonRule(IClientConfig clientConfig) {
return new RandomRule();
}
}

- BattcnCloudRibbonApplication

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@SpringBootApplication
@EnableDiscoveryClient
@RestController
@RibbonClient(name = "battcn-cloud-hello",configuration = FooConfiguration.class)
public class BattcnCloudRibbonApplication { @Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
} @GetMapping("/ribbon")
public String findHelloByEmail(String email) {
// VIP模式,不需要填写 IP+端口 Ribbon会去注册中心获取当前可用服务然后做HTTP请求
return "server <<==>> "+restTemplate().getForObject("http://battcn-cloud-hello/hello?email="+email,String.class);
} public static void main(String[] args) {
SpringApplication.run(BattcnCloudRibbonApplication.class, args);
}
}

- 测试

随机访问N次:http://localhost:8764/ribbon?email=123456@qq.com 结果如下(人品只要不是好到爆炸就不会五五开)

自定义Rule

服务消费者(Ribbon)的更多相关文章

  1. 创建服务消费者(Ribbon)

    概述 在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于 http restful 的.Spring cloud 有两种服务调用方式,一种是 ribbon + restTempla ...

  2. SpringCloud-创建服务消费者-Ribbon方式(附代码下载)

    场景 SpringCloud-服务注册与实现-Eureka创建服务注册中心(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  3. 7、服务发现&服务消费者Ribbon

    公众号: java乐园 在<服务注册&服务提供者>这一篇可能学习了这么开发一个服务提供者,在生成上服务提供者通常是部署在内网上,即是服务提供者所在的服务器是与互联网完全隔离的.这篇 ...

  4. Spring Cloud (3) 服务消费者-Ribbon

    在上一篇中使用LoadBalancerClient接口实现了获取某个服务的具体实例,并根据实例信息发起服务接口消费请求.但是这样的做法需要我们手工的区编写服务选取.连接拼接等繁琐的工作,对于开发人员来 ...

  5. 「 从0到1学习微服务SpringCloud 」04服务消费者Ribbon+RestTemplate

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...

  6. springcloud-Netflix创建服务消费者

    目录 springcloud-Netflix创建服务消费者 Ribbon 创建服务消费者-Ribbon方式 ribbon的架构 Feign 创建包和基本项目结构 创建Feign访问服务的接口和访问co ...

  7. SpringCloud-使用熔断器防止服务雪崩-Ribbon和Feign方式(附代码下载)

    场景 SpringCloud-服务注册与实现-Eureka创建服务注册中心(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  8. SpringCloud-创建服务消费者-Feign方式(附代码下载)

    场景 SpringCloud-服务注册与实现-Eureka创建服务注册中心(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  9. 「 从0到1学习微服务SpringCloud 」05服务消费者Fegin

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...

  10. springcloud干货之服务消费者(ribbon)

    本章介绍springcloud中的服务消费者 springcloud服务调用方式有两种实现方式: 1,restTemplate+ribbon, 2,feign 本来想一篇讲完,发现篇幅有点长,所以本章 ...

随机推荐

  1. Java实现 LeetCode 470 用 Rand7() 实现 Rand10()

    470. 用 Rand7() 实现 Rand10() 已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数. 不要使用系 ...

  2. Java实现 LeetCode 382 链表随机节点

    382. 链表随机节点 给定一个单链表,随机选择链表的一个节点,并返回相应的节点值.保证每个节点被选的概率一样. 进阶: 如果链表十分大且长度未知,如何解决这个问题?你能否使用常数级空间复杂度实现? ...

  3. Java实现 蓝桥杯VIP 算法提高 3-2求存款

    算法提高 3-2求存款 时间限制:1.0s 内存限制:256.0MB 问题描述 见计算机程序设计基础(乔林)P50第5题. 接受两个数,一个是用户一年期定期存款金额,一个是按照百分比格式表示的利率,计 ...

  4. java实现Floyd算法

    1 问题描述 何为Floyd算法? Floyd算法功能:给定一个加权连通图,求取从每一个顶点到其它所有顶点之间的最短距离.(PS:其实现功能也称完全最短路径问题) Floyd算法思想:将顶点i到j的直 ...

  5. java实现第七届蓝桥杯四平方和

    四平方和 四平方和 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和. 比如: 5 = 0^2 + 0^2 + 1^ ...

  6. Redis学习笔记(十八) 集群(下)

    复制和故障转移 Redis集群中的节点分为主节点(master)和从节点(slave),其中主节点用于处理槽,而从节点则用于复制某个主节点,并在被复制 的主节点下线时,代替下线主节点继续处理命令请求. ...

  7. 在c++MFC下用PCL显示操作点云文件 MFC对话框显示操作PCL点云

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/13115873.html 第一步 下载PCL库  我的版本是1.8.1的 你都要MFC下跑PCL ...

  8. DockerFile构建镜像和Docker仓库

    利用commit理解镜像构成 注意: docker commit 命令除了学习之外,还有一些特殊的应用场合,比如被入侵后保存现 场等.但是,不要使用 docker commit 定制镜像,定制镜像应该 ...

  9. 伪造随机的User-Agent

    写好爬虫的原则只有一条: 就是让你的抓取行为和用户访问网站的真实行为尽量一致 1.伪造UA字符串,每次请求都使用随机生成的UA 为了减少复杂度,随机生成UA的功能通过第三方模块库fake-userag ...

  10. 使用Java代码配置MyBatis Generator

    使用MyBatis Generator生成器时,有时候没办法使用xml型的配置文件,比如将Maven项目设置成pom打包方式(<packaging>pom</packaging> ...