SpringCloud系列七:使用Ribbon实现客户端侧负载均衡

1. 回顾

  在前面,已经实现了微服务的注册与发现。启动各个微服务时,Eureka Client会把自己的网络信息注册到Eureka Server上。

  但是,在生成环境中,各个微服务都会部署多个实例,因此还行继续进行优化。

2. Ribbon简介

  Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP客户端的行为。为Ribbon配置服务提供者地址列表后,Ribbon就可基于某种负载均衡算法,

  自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多的负载均衡算法,例如轮询、随机等。我们也可为Ribbon实现自定义的负载均衡算法。

 

  在Spring Cloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。

3. 为服务消费者整合Ribbon

  > 复制项目 microservice-consumer-movice,修改ArtifactId为 microservice-consumer-movie-ribbon

  > 为项目microservice-consumer-movie添加Ribbon的依赖。但是前文已经为该服务添加spring-cloud-starter-netflix-eureka-client依赖,

    该依赖已经包含了 spring-cloud-starter-netflix-ribbon 依赖,所以无需再次引入。

  > 在启动类中,为RestTemplate添加@LoadBalanced注解。

package com.itmuch.cloud.microserviceconsumermovie;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;@SpringBootApplication
@EnableDiscoveryClient
public class MicroserviceConsumerMovieApplication {public static void main(String[] args) {SpringApplication.run(MicroserviceConsumerMovieApplication.class, args);}@Bean@LoadBalanced // 实现负载均衡public RestTemplate restTemplate() {return new RestTemplate();}
}

  > 修改MovieController类,便于发现是否实现负载均衡

package com.itmuch.cloud.microserviceconsumermovie.controller;import com.itmuch.cloud.microserviceconsumermovie.pojo.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;@RestController
public class MovieController {private static final Logger LOGGER = LoggerFactory.getLogger(MovieController.class);@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate LoadBalancerClient loadBalancerClient;@GetMapping("/user/{id}")public User findById(@PathVariable Long id) {return this.restTemplate.getForObject("http://microservice-provider-user/" + id, User.class);}@GetMapping("/log-instance")public void logUserInstance() {ServiceInstance serviceInstance = this.loadBalancerClient.choose("microservice-provider-user");// 打印当前选择的是哪个节点MovieController.LOGGER.info("{}:{}:{}", serviceInstance.getServiceId(), serviceInstance.getHost(),serviceInstance.getPort());}}

  > 启动 microservice-discovery-eureka

  > 启动两个以上的 microservice-provider-user 实例(启动前检查application.yml,spring.jpa.hibernate.ddl-auto值为update,否则不能自动创建表结构;

    检查eureka.client.service-url.defaultZone的值是否为注册中心的url

  > 启动 microservice-consumer-movie-ribbon

  > 访问 http://localhost:8761

 

  > 多次访问 http://localhost:8010/user/1

    并且,在多个 microservice-provider-user 实例中都会打印如下日志:

    表明:Ribbon成功的将请求负载到不同的实例上了

  > 多次访问 http://localhost:8010/log-instance ,在 microservice-consumer-movie 项目的日志中可发现如下日志:

    表明:Ribbon成功的将请求负载到不同的实例上了

 4. 总结

  本文已经实现了用Ribbon实现客户端的负载均衡。

  下次将讲解自定义Ribbon配置,敬请期待~~~

5. 参考

  周立 --- 《Spring Cloud与Docker微服务架构与实战》

转载于:https://www.cnblogs.com/jinjiyese153/p/8651123.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250698.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python基础:条件循环字符串

while True:a int(input(摄氏度转换为华氏温度请按1\n华氏温度转化为摄氏温度请按2\n))if a 1:celsius float(input(输入摄氏温度:))fahreaheit (celsius 1.8) 32 # f c9/532print({:.2f}摄氏温度转为华氏温度为{:.2f}.format(celsius, fahreaheit))elif a …

从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十二║Vue实战:个人博客第一版(axios+router)...

前言 今天正式开始写代码了,之前铺垫了很多了,包括 6 篇基础文章,一篇正式环境搭建,就是为了今天做准备,想温习的小伙伴可以再看看《Vue 基础入门详细的环境搭建》,内容很多,这里就暂时不复习了…

红帽7 su命令与sudo服务

1、su命令 su命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换到其他用户,比如从root管理员切换至普通用户 [rootlocalhost Desktop]# su - lisi Last login: Wed Sep 12 23:47:44 CST 2018 on pts/0 [lisilocal…

CentOS6找回root密码 - 黑猴子

1)重启Linux,见到下图,在3秒钟之内按下回车 2)三秒之内要按一下回车,出现如下界面 3)按下e键就可以进入下图 4)移动到下一行,再次按e键 5)移动到下一行,进行修…

虚拟机vmware的连接方式以及IP端口,协议等概念

1.NAT虚拟机相当于小弟,宿主机相当于大哥,宿主机虚拟出一个网段供虚拟机上网用 2.Bridge桥接,虚拟机和宿主机相当于局域网中的两台机器 3.Host-Only虚拟机只和宿主机通信,无法上网 32位和64位linux的区别转载于:https://www.cnblo…

__METHOD__

转载于:https://www.cnblogs.com/xiaobiaomei/p/8662846.html

微信小程序 - 五星评分(含半分)

转载自:http://blog.csdn.net/column/details/13721.html演示:下载:小程序-星级评论.zip转载于:https://www.cnblogs.com/cisum/p/9651110.html

分布式版本控制系统Git的安装与使用(作业2)

(本次作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2103) 分布式版本控制系统Git的安装与使用 一、安装Git bash软件和安装notepad(安装时修改自己安装的路径,git bash最后一个步骤需要都勾…

汇编 --- 初体验

假设内存10000H中的值为23,10001H中的值为11,10002H中的值为22,10003H的值为11 在debug中执行以下代码 mov ax,1000H mov ds,ax mov ax,[0] mov bx,[2] mov cx,[1] add bx,[1] add cx,[2]分析:8086CPU中由于段地址寄存器,无法直接赋值,因此需要先将值赋给通用寄存器然后再给ds…

汇编 --- EXE文件 的程序的加载过程

1.asm 使用编译工具写了一个求2的3次方的程序 assume cs:abcabc segmentmov ax,2add ax,axadd ax,axmov ax, 4c00Hint 21H abc endsend编译&连接 得到可执行文件1.exe 使用debug调试1.exe 进入调试模式 debug 1.exe查看数据段地址和代码段地址 -r 描述: 可以看到此时…

浅谈Floyd的三种用法 By cellur925

Floyd大家可能第一时间想到的是他求多源最短路的n算法。其实它还有另外两种算法的嘛qwq。写一发总结好了qwq。 一、多源最短路 放段代码跑&#xff0c;注意枚举顺序&#xff0c;用邻接矩阵存图。本质是一种动规。 复杂度O(n)。 1 for(int k1;k<n;k) 2 for(int i1;i<n…

js获取viewbag

后台代码&#xff1a; List<WMSRptJHJY> wpjh WMSRptJHJYManage.GetModelList("");   ViewBag.WPJH Newtonsoft.Json.JsonConvert.SerializeObject(wpjh); 前台代码&#xff1a; var aa Html.Raw(ViewBag.WPJH);   var PWJH eval("(" aa &…

汇编 --- 栈结构的妙用

在js中双重循环,代码如下: for(let i 0; i < l1;i){for(let j0; j< l2;j){// todo...} }以上代码在汇编中是如何实现的呢. 汇编中用cx和loop来代表一次循环 mov cx, 4 s: mov ax,1loop s但是如果使用如下方法实现双重循环将会出错 assume cs:codesg, ds:datasgdatasg …

Lvs Tun隧道模式配置

######## TUN是IP Tunneling &#xff0c;IP隧道的简称&#xff0c;它将调度器收到的IP数据包封装在一个新的IP数据包中&#xff0c;转交给应用服务器&#xff0c;然后实际服务器的返回数据会直接返回给用户。 工作原理&#xff1a; 用户请求负载均衡服务器&#xff0c;当IP数…

java实验四——找鞍点

package hello;public class 实验四 {public static void main(String[] args) {// TODO Auto-generated method stubint[][] a {{9,8,6},{2,3,1},{8,5,2}};System.out.println("二维数组为&#xff1a;");for(int i0;i<a.length;i){for(int j0;j<a[i].length;…

es6 --- 使用Symbol保护私有变量

定义一个人物类 假设其属性有姓名和性别我们希望,性别在声明后就固定不变 传统方法 var Person (function(){var _gender ;function P(name, gender){this.name name;_gender gender;}P.prototype.getGender function(){return _gender;}return P; })();var p1 new Pe…

组合数

long long factorial(int n) {long long m 1;for(int i1;i<n;i)m*i;return m; } long long C(int n,int m) {return factorial(n)/(factorial(m)*factorial(n-m));//可能会溢出 } 正解&#xff1a; long long C(int n,int m) {if(m<n-m) m n-m;long long ans 1;for(in…

LVM逻辑卷管理

什么是逻辑卷&#xff1f;因为可以将文件系统像卷一样伸长或缩短之故。 LVM做法&#xff0c;将几个物理分区或磁盘&#xff0c;通过软件组合成为一块看起来是独立的大磁盘&#xff08;VG&#xff09;&#xff0c;然后将这块大磁盘再经过分成可使用分区&#xff08;LV&#xff0…

es6 --- 自制迭代器

对象 对象如下 const obj {left: 100,top: 200 }不可迭代 for(let attr of obj){console.log(attr); }迭代规则 可迭代,所具有的属性[Symbol.iterator] 需要自己给obj添加迭代规则 obj[Symbol.iterator] () >{// 获取obj的所有键let keys Object.keys(obj);let len …

[Shell] swoole_timer_tick 与 crontab 实现定时任务和监控

手动完成 "任务" 和 "监控" 主要有下面三步&#xff1a; 1. mission_cron.php&#xff08;定时自动任务脚本&#xff09;&#xff1a; <?php /*** 自动任务 定时器 (5s 执行).** swoole_timer_tick 解决秒级定时&#xff1b;* 如需调整&#xff0c;注意…