Spring Cloud【Finchley】-04使用Ribbon实现客户端负载均衡
文章目录
- 概述
- Ribbon演示
- 服务提供者微服务改造为使用MySql数据库
- 新建服务消费者微服务,配置Ribbon
- 注意事项
- 源码
概述
Spring Cloud-03将微服务注册到Eureka Server上 + 为Eureka Server添加用户认证中遗留的问题还记得吧 ,对,服务消费者调用服务提供者是硬编码的方式,虽然把地址配置到了application.yml中,但是一旦服务端的地址发生改变,那肯定是要修改配置文件的。
如何解决呢? Spring Cloud整合了Ribbon.
Ribbon是Nextflix发布的负载均衡器,为Ribbon配置服务提供者地址后,Ribbon就可以基于某种负载均衡的算法,自动帮助服务消费者请求。
Ribbon支持轮询、随机等负载均衡算法,当然也支持实现自定义的负载均衡算法。
在Spring Cloud中,当Ribbon和Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者的地址列表,并基于某种负载均衡算法,请求其中一个服务提供者实例。
Ribbon演示
服务提供者微服务改造为使用MySql数据库
当然了,这一步不是必须的。
Step1 修改pom.xml增加mysql的依赖
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>
Step2: applicaiton.yml中关于数据库的部分调整为
spring:datasource:url: jdbc:mysql://localhost:3306/artisan?useUnicode=true&characterEncoding=utf-8&useSSL=trueusername: rootpassword: rootdriver-class-name: com.mysql.jdbc.Driver
新建服务消费者微服务,配置Ribbon
Step1: 在maven父工程上右键新建maven module ,名称为:micorservice-consumer-movie-ribbon
Step2: pom.xml引入ribbon依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
Step3: 为RestTemplate添加@LoadBalanced注解
只需要为RestTemplate添加@LoadBalanced注解,就可以为RestTemlate整合Ribbon,使其具备负载均衡的能力
Step4: 修改Controller层代码,将地址调整为注册在Eureka上的虚拟主机名
package com.artisan.microservice.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import com.artisan.microservice.model.User;import lombok.extern.slf4j.Slf4j;@RestController
@Slf4j
public class MovieController {@Autowiredprivate RestTemplate restTemplate;@AutowiredLoadBalancerClient loadBalancerClient;@GetMapping("/movie/{id}")public User findById(@PathVariable Long id) {// 调用注册在Eureka上的服务端的地址return this.restTemplate.getForObject("http://microservice-provider-user/user/" + id, User.class);}@GetMapping("/callProvider")public String callUserInstance() {ServiceInstance serviceInstance = this.loadBalancerClient.choose("microservice-provider-user");// 打印当前选择的哪个节点log.info("serviceId: {} , host: {} ,port: {} ,uri: {}" ,serviceInstance.getServiceId() , serviceInstance.getHost(), serviceInstance.getPort(),serviceInstance.getUri());return serviceInstance.getUri().toString();}
}
我们把地址修改为了http://microservice-provider-user/user , 其中
microservice-provider-user用户微服务的虚拟主机名,是注册在Eureka Server上的名字,也是服务提供者微服务的配置文件中配置的spring.application.name
当Ribbon和Eureka同时使用时,会自动将虚拟主机名映射为微服务的网络地址。
同时为了更加直观的获取当前选择的用户微服务节点,我们新增加了个方法callProvider,待会测试就可以看到效果了。
Step5: 验证Ribbon提供的能力
1.启动Eureka Server
2.启动两个 microservice-provider-user实例 。(在STS中启动一个后,修改下application.yml的端口,再次run as spring boot app 即可启动第二个实例,以此类推)
3.启动microservice-provider-movie-ribbon
4.访问Eureka Server的页面,查看是否注册成功
http://localhost:8761/login
登录后,可以看到2个服务提供者,1个服务消费者都成功的注册到了Eureka Server上。
我们在服务消费者微服务,调用的地址为
,对应两个服务提供者的地址。
同时我们在服务消费者微服务工程中,为RestTemplate标注了@LoadBalanced注解,所以会使用Ribbon的负载均衡算法来分发到不同的服务提供者地址
多次访问 http://localhost:7902/movie/1 ,观察控制台每个节点的日志输出情况。
同时访问http://localhost:7902/callProvider
注意事项
默认情况下,虚拟主机名和服务名称是一致的,也可以通过eureka.instance.virtual-host-name或者eureka.instance.secure-virtual-host-name指定虚拟主机名
不能将restTemplate.getForObject()和loadBalancerClient写在同一个方法中,两者会冲突,因为RestTemplate实际上是一个Ribbon客户端,本身已经包含了choose的行为
虚拟主机名不能包含"_"之类的字符,否则Ribbon再调用的时候会抛出异常
源码
https://github.com/yangshangwei/SpringCloudMaster
Spring Cloud【Finchley】-04使用Ribbon实现客户端负载均衡相关推荐
- Eclipse(STS) 初次搭建Spring Cloud项目之声明式REST调用+负载均衡实现Feign(四)
一.什么是Feign Feign是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求,而不用像Java中通过封装HTTP请求报文的方式直接调用.Feign通过处理注解,将请 ...
- Spring Cloud入门教程(二):客户端负载均衡(Ribbon)
对于大型应用系统负载均衡(LB:Load Balancing)是首要被解决一个问题.在微服务之前LB方案主要是集中式负载均衡方案,在服务消费者和服务提供者之间又一个独立的LB,LB通常是专门的硬件,如 ...
- 五、springcloud之客户端负载均衡Ribbon
一.简介 在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式: 一种是ribbon+restTemplate, ...
- Ribbon客户端负载均衡
前一篇博客我们已经构建了一个微服务项目demo,地址为https://blog.csdn.net/f123147/article/details/115904274,在高访问量和高并发的复杂项目中,不 ...
- 基于Spring cloud Ribbon和Eureka实现客户端负载均衡
前言 本案例将基于Spring cloud Ribbon和Eureka实现客户端负载均衡,其中Ribbon用于实现客户端负载均衡,Eureka主要是用于服务注册及发现: 传统的服务端负载均衡 常见的服 ...
- SpringCloud微服务架构,Spring Cloud 服务治理(Eureka,Consul,Nacos),Ribbon 客户端负载均衡,RestTemplate与OpenFeign实现远程调用
什么是SpringCloud 微服务架构 • "微服务"一词源于 Martin Fowler的名为 Microservices的博文,可以在他的官方博客上找到 http://mar ...
- Spring Cloud微服务笔记(四)客户端负载均衡:Spring Cloud Ribbon
客户端负载均衡:Spring Cloud Ribbon 一.负载均衡概念 负载均衡在系统架构中是一个非常重要,并且是不得不去实施的内容.因为负载均衡对系统的高可用性. 网络压力的缓解和处理能力的扩容的 ...
- 客户端负载均衡Ribbon之一:Spring Cloud Netflix负载均衡组件Ribbon介绍
Netflix:['netfliːks] ribbon:英[ˈrɪbən]美[ˈrɪbən] n. 带; 绶带; (打印机的) 色带; 带状物; v. 把-撕成条带; 用缎带装饰; 形成带状; ...
- Spring Cloud Finchley OpenFeign的重试配置相关的坑
如题,本文基于Spring Cloud Finchley.SR2 OpenFeign的重试 OpenFeign配置重试后,逻辑分析 对比Daltson和Finchley的基本组件,发现Ribbon还有 ...
最新文章
- C语言获取当前工作路径
- 8个成语接龙首尾相连_七七八八成语接龙_八开头的成语大全,八结尾的成语接龙...
- pandas 如何删掉第一行_Python:Pandas – 按组删除第一行
- 告别刷抖音!30秒一个Python小例子,总有一款适合你
- HTML5 SVG
- C++primer拾遗(第八章:IO库)
- brew php imagemagick,关于node使用gm和imageMagic在mac的坑
- 领英“顶尖公司”榜单出炉:华为、字节跳动位居前二
- CodeForces Round #280 (Div.2)
- 【图像处理】基于matlab GUI视频处理系统【含Matlab源码 756期】
- java 反解析cron_Cron表达式解析
- 尚硅谷大数据hadoop教程
- js如何获取当前页面url网址信息
- html分组标签tfoot,网页布局中 tbody标签与thead和tfoot标签使用
- Ubuntu 21.10 编写 eBPF tc 程序
- ROS学习笔记(2)——ROS通信机制
- 通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(三)
- Vue3 中定义ts 对象
- php工作日,计算工作日的天数
- Switch开关,两边字隐藏