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,一经查实,立即删除!

相关文章

node --- 使用koa-router,让后端模块化

使用Koa-router进行路由管理 npm install --save koa-router const Router require(koa-router); let router new Router(); router.get(/, async (ctx)>{ctx.body 用户操作首页 })路由模块化 在appApi下面创建需要模块化的文件如:home.js、user.js const Router re…

PHP 实现桶排序

PHP 实现桶排序 <?phpfunction Bucket_sort($array){//初始化桶大小$min min($array);$max max($array);$book array_fill($min, $max-$min1, 0);//将要进行的数据进行计数foreach ($array as $key) {$book[$key];// echo $book[$key];}//返回数据$resArr array();for…

springboot ajax返回html

因为拦截器 或者是 shiro 拦截登陆接口 转载于:https://www.cnblogs.com/xdcr/p/9638569.html

【小试牛刀】短信验证码(随机数)的生成实现

短信验证码&#xff0c;相信在生活中大家是几乎天天能够遇到。但你知道它是怎样生成的吗&#xff1f;其实它就是若干位数的随机数组合而成。下面附上一小段程序&#xff0c;供大家一起学习交流。package com.fhcq.util;import org.apache.commons.lang3.RandomStringUtils;publ…

node --- 后端使用body-parse解析Post请求,前端使用axios发送Post请求

使用body-parser解析post请求 安装service/index.js npm install --save koa-bodyparser导入 const Koa require(koa); const app new Koa(); const bodyParser require(koa-bodyparser); app.use(bodyParser)准备请求的url全局配置src/serviceAPI.config.js const LOCA…

PHP 实现二分查找

PHP 实现二分查找 原理&#xff1a; 首先&#xff0c;假设数组中元素是按升序排列&#xff0c;将表中间位置记录的关键字与查找关键字比较&#xff0c;如果两者相等&#xff0c;则查找成功&#xff1b;否则利用中间位置记录将数组分成前、后两个子数组&#xff0c;如果中间位…

python基础:条件循环字符串

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

项目难点总结

一 滑动窗口 &#xff11;&#xff09;滑动窗口设置 &#xff12;&#xff09;窗口对齐 &#xff13;&#xff09;窗口的调优&#xff0c;能否正常触发 数据丢失问题    &#xff52;&#xff45;&#xff54;&#xff52;&#xff59; 事件延时&#xff08;late arrival …

7-n!末尾有几个0

如何确定一个N&#xff01;末尾有多少个零 转载 2015年08月30日 15:02:49622题目&#xff1a;1*2*3*……*100 求结果末尾有多少个零 分析&#xff1a;一般类似的题目都会蕴含某种规律或简便方法的,阶乘末尾一个零表示一个进位&#xff0c;则相当于乘以10而10 是由2*5所得&#…

PHP中header的用法

PHP中header的用法 摘要&#xff1a; header()的作用&#xff1a;给客户端发送头信息 头信息的作用 跳转 Header("Refresh:2; URLhttp://localhost//session.php");//2秒后跳转 //若等待时间为0&#xff0c;则与header("location:")效果一致 Header(&q…

node --- koa、Mongoose、vue联系知识梳理

前端、后端联系知识梳理 以打开浏览器,访问login为栗打开浏览器,访问localhost:8080/#/loginsrc/router/index.js 会根据 /login 找到对应的Login(src/components/pages/Login.vue)组件, 然后渲染到浏览器当输入用户名和密码,点击登录按钮后根据Login组件中配置的axios请求向后…

倒计时

//1获取24小时$fixation_time strtotime("1 day")-time();//2.获取已经过去的时间$different time()-strtotime($question->created_at);//3.获取时间差$time $fixation_time - $different;//4.获取时$hour floor($time/3600);if($hour<10){$hour 0.$hour;…

Git命令一览

Git命令一览 分支名称 master 稳定分支 develop 不稳定分支&#xff08;开发分支&#xff09; issue 或 fixbug BUG 分支 feature 新功能分支 release 预发布分支 本地操作 git init 初始化 git add 增加到暂存区 git commit -m 提交到分支 git status 查看状态 gi…

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

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

node --- 使用mongoose连接mongoDB,并初始化所有的Schema

写了一个init.js函数 使用了glob来对协助完成(https://github.com/isaacs/node-glob)连接的数据库的名称(smile-vue)连接数据库操作:connect 断线重开连接失败连接成功 初始化所有的Schemas暴露给其他页面使用的接口 const mongoose require(mongoose); const db mongodb:/…

ajax跨域问题(php)

ajax出现请求跨域错误问题,主要原因就是因为浏览器的“同源策略”。 解决方法(我只用过下面这3种)&#xff1a; 1. 架设服务器代理&#xff1a;即浏览器请求同源服务器&#xff0c;再由后者请求外部服务&#xff08;之前博主一直用这种方法&#xff0c;其实感觉这种算不上跨域请…

PHP 实现随机字符串,可作为随机密码

PHP 实现随机字符串&#xff0c;可作为随机密码 //传入需要的字符串长度 function generate_rand($length){ $chars "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; srand((double)microtime()*1000000); $randStr ""; for($i0;…

红帽7 su命令与sudo服务

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

vue --- 按钮的防重复点击事件

按钮的防重复点击事件 :loading属性当loading true时:按钮会显示一个旋转的圆圈.此时的按钮是无法点击的当loading false时:按钮重新变为可点击的状态可以通过使用一个变量来控制按钮的可点击性,当提交时,按钮不可点击,提交完毕后,按钮可以点击 <van-button :loading&qu…

PHP 实现列出目录的内容

PHP 实现列出目录的内容 <?phpfunction list_files($dir) { if(is_dir($dir)) { if($handle opendir($dir)) { while(($file readdir($handle)) ! false) { if($file ! "." && $file ! ".." && $file ! "Thumbs.db") { …