Spring Cloud系列(三):服务消费与负载均衡
上一篇介绍了服务提供者,有了注册中心和服务提供者,我们就可以进行服务消费了。Spring Cloud可以通过RestTemplate+Ribbon和Feign这两种方式消费服务。
我们仍然在上一篇的项目中添加功能,btw,源码是分章节的,而且后一份代码其实包含了前一份代码,也就是chapter2包含了chapter1的代码,每个chapter的源码其实都是完整可以独立运行的。
一、启动注册中心和服务提供者
先启动之前的注册中心和服务提供者,这里为了方便启动单节点的注册中心就够了,如果想测试注册中心集群的请自行测试,方法在前面的章节已经介绍过,这里就不再赘述。
启动成功后访问http://localhost:8761/,可以看到现在注册的服务只有一个服务提供者
二、RestTemplate+Ribbon
2.1、新建一个module
新建一个Spring Initializr的module,名称为service-consumer-ribbon,选择Spring Web、Eureka Discovery Client和Ribbon三个依赖,完成后主要依赖如下
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
2.2、创建RestTemplate
为了方便直接在启动类添加好了,另外需要加上注解@EnableEurekaClient,把自身注册到注册中心
@SpringBootApplication
@EnableEurekaClient
public class ServiceConsumerRibbonApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceConsumerRibbonApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
2.3、创建Service和Controller
创建一个RibbonConsumerService类和一个RibbonConsumerController类
@Service
public class RibbonConsumerService {
@Autowired
private RestTemplate restTemplate;
public String index(String uid) {
return restTemplate.getForObject("http://SERVICE-PROVIDER/callServiceProvider?uid=" + uid, String.class);
}
}
@RestController
public class RibbonConsumerController {
@Autowired
private RibbonConsumerService ribbonConsumerService;
@RequestMapping("/index")
public String index(@RequestParam("uid") String uid) {
return ribbonConsumerService.index(uid);
}
}
稍微解释一下这两个类:这两个类的写法其实就和springboot项目中的写法没有什么区别,就是在Controller中调用Service,唯一需要说明的就是Service类中,通过RestTemplate对象来调用服务提供者提供的接口,其中域名SERVICE-PROVIDER(这里姑且认为是域名吧)就是服务提供者的应用名称(在配置文件中指定)。
2.4、添加配置信息
在application.properties文件中添加以下配置
server.port=8080
spring.application.name=consumer-ribbon
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
这时访问http://localhost:8761/可以看到注册的服务多了一个消费者CONSUMER-RIBBON
2.5、测试
在浏览器访问http://localhost:8080/index?uid=ribbon将会返回以下信息
三、Feign
使用Ribbon的方式有一个比较麻烦的地方就是调用提供者的http服务需要手动去构建,而Feign就简单很多。
3.1、新建一个module
新建一个module,名称为service-consumer-feign,选择Spring Web、Eureka Discovery Client和OpenFeign三个依赖,如下
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
3.2、创建Service和Controller
先在启动类上加上@EnableEurekaClient和@EnableFeignClients,再创建一个FeignConsumerService接口和一个FeignConsumerController类,FeignConsumerService接口定义如下:
@FeignClient(value = "service-provider")
public interface FeignConsumerService {
@RequestMapping("/callServiceProvider")
String index(@RequestParam("uid") String uid);
}
主要就是通过注解的方式声明一个提供者的服务,@FeignClient注解的值就是服务提供者的应用名称。
FeignConsumerController类的写法和RibbonConsumerController的写法无异,都是在controller中调用service,这里不多说。
3.3、添加配置信息
在application.properties文件中添加以下配置
server.port=8080
spring.application.name=consumer-feign
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
3.4、启动&测试
启动注册中心、服务提供者和feign消费者项目(如果ribbon消费者项目还在运行先停掉,不然端口会冲突),访问http://localhost:8080/index?uid=feign
四、负载均衡
到目前为止我们的服务提供者是单节点的,如果这个节点挂了,那么所有调用了这个服务提供的接口的服务都无法正常工作,为了保证服务的高可用,我们需要有多个服务提供者的节点,然后在消费服务时,一方面假如某个甚至几个服务提供者挂掉之后,还可以有正常的服务在工作,另一方面,加入请求量很大的时候,多个服务提供者的节点也可以分摊流量,减轻单个节点的处理压力,这一点和Nginx+多个Tomcat的架构是一致的,只不过在这里我们做负载均衡的组件不是Nginx,而是Ribbon,(Feign的底层也是依赖Ribbon来做负载均衡的)。
4.1、Ribbon负载均衡策略
Ribbon的负载均衡策略源于com.netflix.loadbalancer.IRule接口,有一个抽象类AbstractLoadBalancerRule实现了该接口,而其它官方提供的策略类都是直接或者间接继承了这个抽象类。下面介绍几种官方提供的策略
4.1.1、AvailabilityFilteringRule
可用过滤策略:过滤掉一直连接失败并被标记为 circuit tripped 的 Server,过滤掉那些高并发连接的 Server(active connections 超过配置的网值)。
4.1.2、BestAvailableRule
最低并发策略:逐个考察 Server,如果 Server 断路器打开,则忽略,再选择其中并发连接最低的 Server。
4.1.3、RandomRule
随机策略:随机选择Server。
4.1.4、RetryRule
重试策略:在一个配置时间段内当选择 Server 不成功,则一直尝试选择一个可用的 Server。
4.1.5、RoundRobinRule
轮询策略:按顺序循环选择Server。
4.1.6、WeightedResponseTimeRule
响应时间权重策略:这是一个基于响应时间来分配的策略,响应时间越短的节点,被选中的概率越大。在旧的版本这个策略的类叫ResponseTimeWeightedRule,新版本建议使用WeightedResponseTimeRule。
4.1.7、ZoneAvoidanceRule
区域权衡策略:综合判断Server所在区域的性能和Server的可用性轮询选择Server,并且判定一个AWS Zone的运行性能是否可用,剔除不可用的Zone中的所有Server。
4.1.8、CustomRule
自定义策略:好吧,官方当然没有这么一个策略类,这里写出来的意思是我们可以自己自定义一种策略。
4.2、启动多个服务提供者
既然要做负载均衡,那么服务提供者自然不能是单节点,单节点也无法测试各种策略。先在service-provider module中添加三个配置文件application-provider1.properties、application-provider2.properties、application-provider3.properties,然后把application.properties中的内容复制到三个配置文件中,把其中的端口号改掉,创建三个启动配置项
为了等会知道调用了那个服务提供者,稍微修改一下启动类,在其中加上端口的信息
@SpringBootApplication
@EnableEurekaClient
@RestController
public class ServiceProviderApplication {
@Value("${server.port}")
private int port;
public static void main(String[] args) {
SpringApplication.run(ServiceProviderApplication.class, args);
}
@RequestMapping("/callServiceProvider")
public String callServiceProvider(@RequestParam("uid") String uid) {
// return "用户" + uid + "调用了此服务";
return "服务" + port + "的消息:用户" + uid + "调用了此服务";
}
}
可以先把所有正在运行的服务都停止,然后分别启动注册中心和这三个服务提供者和Ribbon消费者,然后访问http://localhost:8080/index?uid=ribbon,当不断访问返回的结果是不同的,但是总会按照某个顺序返回,比如我的就是8771-8773-8772-8771……这样的顺序返回
服务8771的消息:用户ribbon调用了此服务
服务8773的消息:用户ribbon调用了此服务
服务8772的消息:用户ribbon调用了此服务
目前我们并没有配置任何的负载均衡策略,但是从结果看已经实现了负载均衡,默认就是RoundRobinRule这种顺序轮询的策略,如果希望按照其它策略分发,只需要在service-consumer-ribbon中的配置文件加上以下配置
SERVICE-PROVIDER.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
service-provider是服务提供者的名称,值是策略类,比如上面配置的是随机分发策略。重启service-consumer-ribbon,再次不断地访问http://localhost:8080/index?uid=ribbon,可以发现每次返回的结果都是随机的了。
Feign消费者中的做法是完全一致的,这里不再赘述。
指定负载均衡策略的另一种方式
我们还可以在启动类加上一个策略类的Bean,spring在启动的时候就会加载这个bean来覆盖默认的策略了
@Bean
public RandomRule randomRule() {
return new RandomRule();
}
更多的负载均衡的策略可以自行尝试,这里就不再过多介绍了。
五、总结
到此,服务消费和负载均衡介绍完毕,下一篇介绍断路器。
源码已经上传到github:https://github.com/spareyaya/spring-cloud-demo/tree/master/chapter3
Spring Cloud系列(三):服务消费与负载均衡的更多相关文章
- Spring Cloud ---- 服务消费与负载均衡(Rest + Ribbon )
上一篇主要写了基于Eurake的服务的注册,主要就是创建注册中心,创建服务者,将服务者注册到注册中心,完成服务的暴露.这一篇主要写服务的消费与服务消费的负载均衡. 服务的调用方式有两种,Rest + ...
- 基于Spring cloud Ribbon和Eureka实现客户端负载均衡
前言 本案例将基于Spring cloud Ribbon和Eureka实现客户端负载均衡,其中Ribbon用于实现客户端负载均衡,Eureka主要是用于服务注册及发现: 传统的服务端负载均衡 常见的服 ...
- 《Spring Cloud》学习(二) 负载均衡!
第二章 负载均衡 负载均衡是对系统的高可用.网络压力的缓解和处理能力扩容的重要手段之一.Spring Cloud Ribbon是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于Netfli ...
- spring cloud(服务消费者(利用feign实现服务消费及负载均衡)——初学三)
Feign是一个声明式的Web Service客户端,我们只需要使用Feign来创建一个接口并用注解来配置它既可完成. 它具备可插拔的注解支持,包括Feign注解和JAX-RS注解.Feign也支持可 ...
- spring cloud(服务消费者(利用ribbon实现服务消费及负载均衡)——初学二)
Ribbon是一个基于HTTP和TCP客户端的负载均衡器,利用ribbon实现服务消费,并实现客户端的负载均衡. 一.准备工作(利用上一节的内容) 启动服务注册中心 启动computer-servic ...
- Spring Cloud ---- 服务消费与负载均衡(feign)
feign是一个声明式的伪客户端,只需要创建一个接口并且注解,它具有可插拔的特性.feign集合了Ribbon,再与Eurake结合实现服务的注册发现与负载均衡.结合Hystrix,具有熔断功能. 1 ...
- SpringCloud(三):服务消费以及负载均衡(RestTemplate+Ribbon)
一.什么是Ribbon: Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法. 将Netflix的中间层服务连接在一起.Ribbon客户端组件提供一系列完善的配置项如连 ...
- Spring Cloud入门教程(二):客户端负载均衡(Ribbon)
对于大型应用系统负载均衡(LB:Load Balancing)是首要被解决一个问题.在微服务之前LB方案主要是集中式负载均衡方案,在服务消费者和服务提供者之间又一个独立的LB,LB通常是专门的硬件,如 ...
- Spring Cloud Ribbon 中的 7 种负载均衡策略
负载均衡通器常有两种实现手段,一种是服务端负载均衡器,另一种是客户端负载均衡器,而我们今天的主角 Ribbon 就属于后者--客户端负载均衡器. 服务端负载均衡器的问题是,它提供了更强的流量控制权,但 ...
随机推荐
- DexHunter在Dalvik虚拟机模式下的脱壳原理分析
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78494671 在前面的博客<DexHunter的原理分析和使用说明(一)&g ...
- SPOJ 2713 线段树(sqrt)
题意: 给你n个数(n <= 100000),然后两种操作,0 x y :把x-y的数全都sqrt ,1 x y:输出 x-y的和. 思路: 直接线段树更新就行了,对于当 ...
- Windows PE导出表编程4(重构导出表实现私有函数导出)
本次是尝试调用DLL里面的私有函数. 一: 之前先探索一下,首先可以考虑用偏移量来调用,就是如果知道了某个私有函数和某个导出的公共函数的相对便宜的话,直接加载dll获取公共函数地址,然后自己手动去偏移 ...
- <JVM下篇:性能监控与调优篇>补充:浅堆深堆与内存泄露
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- VMware 15 虚拟机黑屏问题
方法一:关闭加速3D图形 点击虚拟机,右键设置,取消勾选后,再进行重启 方法二:用管理员运行cmd 输入如下命令,要使用管理员运行,然后重启电脑 netsh winsock reset 方法三:换成V ...
- Github + Picgo + Typora 让笔记远走高飞
Github设置 登录 2.新建仓库 设置token 打开设置 然后点击,按钮生成Generate token Picgo设置 下载PicGo 参考视频 PicGo设置 设置Server 图床设置 上 ...
- Action: Consider the following: If you want an embedded database (H2, HSQL or Derby), please put it on the classpath. If you have database settings to be loaded from a particular profile you may ne
更多精彩关注微信公众号 错误原因 在pom中引入了mybatis-spring-boot-starter ,Spring boot默认会加载org.springframework.boot.autoc ...
- 想要测试Dubbo接口?测试的关键点在哪里?
Dubbo接口如何测试? 这个dubbo如何测试,dubbo接口测试什么玩意儿? RPC的有一个类型,叫Dubbo接口. 那这个接口如何测试?测试的关键点在哪里? 这个面试问题,我觉得大家可能就有 ...
- 跟我一起学Go系列:gRPC 入门必备
RPC 的定义这里就不再说,看文章的同学都是成熟的开发.gRPC 是 Google 开源的高性能跨语言的 RPC 方案,该框架的作者 Louis Ryan 阐述了设计这款框架的动机,有兴趣的同学可以看 ...
- 【Web前端HTML5&CSS3】03-字符实体与语义标签
笔记来源:尚硅谷Web前端HTML5&CSS3初学者零基础入门全套完整版 目录 字符实体与语义标签 1. 字符实体 2. meta标签 3. 语义标签 4. 块元素与行内元素 块元素(bloc ...