文章目录

  • 概述
  • 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



注意事项

  1. 默认情况下,虚拟主机名和服务名称是一致的,也可以通过eureka.instance.virtual-host-name或者eureka.instance.secure-virtual-host-name指定虚拟主机名

  2. 不能将restTemplate.getForObject()和loadBalancerClient写在同一个方法中,两者会冲突,因为RestTemplate实际上是一个Ribbon客户端,本身已经包含了choose的行为

  3. 虚拟主机名不能包含"_"之类的字符,否则Ribbon再调用的时候会抛出异常


源码

https://github.com/yangshangwei/SpringCloudMaster

Spring Cloud【Finchley】-04使用Ribbon实现客户端负载均衡相关推荐

  1. Eclipse(STS) 初次搭建Spring Cloud项目之声明式REST调用+负载均衡实现Feign(四)

    一.什么是Feign Feign是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求,而不用像Java中通过封装HTTP请求报文的方式直接调用.Feign通过处理注解,将请 ...

  2. Spring Cloud入门教程(二):客户端负载均衡(Ribbon)

    对于大型应用系统负载均衡(LB:Load Balancing)是首要被解决一个问题.在微服务之前LB方案主要是集中式负载均衡方案,在服务消费者和服务提供者之间又一个独立的LB,LB通常是专门的硬件,如 ...

  3. 五、springcloud之客户端负载均衡Ribbon

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

  4. Ribbon客户端负载均衡

    前一篇博客我们已经构建了一个微服务项目demo,地址为https://blog.csdn.net/f123147/article/details/115904274,在高访问量和高并发的复杂项目中,不 ...

  5. 基于Spring cloud Ribbon和Eureka实现客户端负载均衡

    前言 本案例将基于Spring cloud Ribbon和Eureka实现客户端负载均衡,其中Ribbon用于实现客户端负载均衡,Eureka主要是用于服务注册及发现: 传统的服务端负载均衡 常见的服 ...

  6. SpringCloud微服务架构,Spring Cloud 服务治理(Eureka,Consul,Nacos),Ribbon 客户端负载均衡,RestTemplate与OpenFeign实现远程调用

    什么是SpringCloud 微服务架构 • "微服务"一词源于 Martin Fowler的名为 Microservices的博文,可以在他的官方博客上找到 http://mar ...

  7. Spring Cloud微服务笔记(四)客户端负载均衡:Spring Cloud Ribbon

    客户端负载均衡:Spring Cloud Ribbon 一.负载均衡概念 负载均衡在系统架构中是一个非常重要,并且是不得不去实施的内容.因为负载均衡对系统的高可用性. 网络压力的缓解和处理能力的扩容的 ...

  8. 客户端负载均衡Ribbon之一:Spring Cloud Netflix负载均衡组件Ribbon介绍

    Netflix:['netfliːks] ribbon:英[ˈrɪbən]美[ˈrɪbən] n. 带; 绶带; (打印机的) 色带; 带状物; v. 把-撕成条带; 用缎带装饰; 形成带状;     ...

  9. Spring Cloud Finchley OpenFeign的重试配置相关的坑

    如题,本文基于Spring Cloud Finchley.SR2 OpenFeign的重试 OpenFeign配置重试后,逻辑分析 对比Daltson和Finchley的基本组件,发现Ribbon还有 ...

最新文章

  1. C语言获取当前工作路径
  2. 8个成语接龙首尾相连_七七八八成语接龙_八开头的成语大全,八结尾的成语接龙...
  3. pandas 如何删掉第一行_Python:Pandas – 按组删除第一行
  4. 告别刷抖音!30秒一个Python小例子,总有一款适合你
  5. HTML5 SVG
  6. C++primer拾遗(第八章:IO库)
  7. brew php imagemagick,关于node使用gm和imageMagic在mac的坑
  8. 领英“顶尖公司”榜单出炉:华为、字节跳动位居前二
  9. CodeForces Round #280 (Div.2)
  10. 【图像处理】基于matlab GUI视频处理系统【含Matlab源码 756期】
  11. java 反解析cron_Cron表达式解析
  12. 尚硅谷大数据hadoop教程
  13. js如何获取当前页面url网址信息
  14. html分组标签tfoot,网页布局中 tbody标签与thead和tfoot标签使用
  15. Ubuntu 21.10 编写 eBPF tc 程序
  16. ROS学习笔记(2)——ROS通信机制
  17. 通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(三)
  18. Vue3 中定义ts 对象
  19. php工作日,计算工作日的天数
  20. Switch开关,两边字隐藏

热门文章

  1. 《基于张量网络的机器学习入门》学习笔记2
  2. python访问数据库oracle_python连接oracle数据库
  3. 415. Add Strings
  4. 基于双向匹配的陌生人社交策略及算法思考
  5. 搜索功能:洞悉产品的绝佳入口
  6. 强化学习(十三) 策略梯度(Policy Gradient)
  7. pycharm使用github
  8. python socket 说明
  9. hdfs复制文件夹_一文理解HDFS
  10. LeetCode-剑指 Offer 28. 对称的二叉树