ribbon, restTemplate 负载均衡服务调用

ribbon

    • ribbon concept
    • ribbon核心组件IRule
    • 模仿源码重写轮询

ribbon concept

spring cloud ribbon 是基于Netflix ribbon实现的一套客户端负载均衡的工具。
简单的说, Ribbon是Netflix发布的开源项目, 主要功能是提供客户端的软件负载均衡算法和服务
完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer (简称LB), 助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。

目前进入维护模式,替代品:spring cloud loadBalance.


restTemplate api

https://docs.spring.io/spring-framework/docs/5.2.2.RELEASE/javadoc-api/org/springframework/web/client/RestTemplate.html

getObject, getEntity
postObject, postEntity

负载均衡

LB负载均衡(Load Balance)是什么
简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA (高可用)。
常见的负载均衡有软件Nginx, LVS,硬件F5等。
Ribbon本地负载均衡客户端VS Nginx服务端负载均衡区别
Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求。即负载均衡是由服务端实现的。
Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。

负载均衡+RestTemplate调用。

ribbon核心组件IRule

ribbon客户端负载均衡接口及实现类
接口以及子类

在这里插入图片描述
算法实现


替换默认的轮询算法, 使用随机

package top.bitqian.rule; // 不要同mainBoot一个目录import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 自定义ribbon 负载均衡规则代替默认轮询规则* @author echo lovely* @date 2020/12/6 17:34*/@Configuration
public class SelfRule {@Beanpublic IRule getIRule() {// 随机return new RandomRule();}}

然后主启动类添加@RibbonClient注解

模仿源码重写轮询

负载均衡算法原理: rest接口的第几次请求数%服务器集群总数量 = 实际服务调用服务器的下标。
每次重启服务后,rest接口从1开始。

接口

package top.bitqian.springcloud.lb;import org.springframework.cloud.client.ServiceInstance;import java.util.List;/*** 负载均衡 接口--> 轮询~*/
public interface LoadBalance {/*** 根据可用的服务实例列表 轮询获取某个实例~* @param serviceInstanceList 可用服务实例列表* @return 轮询后的某个服务实例~*/ServiceInstance getInstance(List<ServiceInstance> serviceInstanceList);}

实现

package top.bitqian.springcloud.lb.impl;import org.springframework.cloud.client.ServiceInstance;
import org.springframework.stereotype.Component;
import top.bitqian.springcloud.lb.LoadBalance;import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;/*** 仿照源码写轮询算法* @author echo lovely* @date 2020/12/8 20:37*/@Component
public class MyLoadBalance implements LoadBalance {// init 0private final AtomicInteger atomicInteger = new AtomicInteger(0);public final int getAndIncrease() {int current;int next;do {current = this.atomicInteger.get();next = current >= 2147483647 ? 0 : current + 1;} while (!this.atomicInteger.compareAndSet(current, next)); // 期望值,修改值System.out.println("the next value -----> " + next);return next;}@Overridepublic ServiceInstance getInstance(List<ServiceInstance> serviceInstanceList) { // 机器列表// 得到服务器的下标位置int index = getAndIncrease() % serviceInstanceList.size();return serviceInstanceList.get(index);}
}

controller
	// 测试手写的轮询算法~@GetMapping("/consumer/payment/lb")public String getPaymentByLb() {// 根据服务名获取服务列表List<ServiceInstance> serviceInstanceList =discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");// 1 2, 1 2, 1 2, 获取服务~ServiceInstance instance = myLb.getInstance(serviceInstanceList);URI uri = instance.getUri();return restTemplate.getForObject(uri + "/payment/lb", String.class);}

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

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

相关文章

网页排版出现空白

网页顶部多了一个空白行&#xff0c;甚至引起了式样的错乱&#xff0c;样式都设置好了&#xff0c;可还是有空白行。很是奇怪&#xff0c;后来搜索了一下&#xff0c;找到原因了。就是因为页面编码时加了BOM&#xff0c;才导致的空白行&#xff0c;怎么也去不掉。 分析原因&…

openfeign 负载均衡调用服务

https://github.com/spring-cloud/spring-cloud-openfeign openFeign, fegin &#x1f446;open feginopenFegin使用日志打印配置类open fegin Feign是一个声明式的web服务客户端&#xff0c;让编写web服务客户端变得非常容易&#xff0c;只需创建一个接口并在接口上添加注解即…

MVC中使用ajax传递json数组

解决方法 去www.json.org下载JSON2.js再调用JSON.stringify(JSONData)将JSON对象转化为JSON串。var people [{ "UserName": "t1", "PassWord": "111111", "Sex": "男" }, { "UserName": "t2"…

hystrix断路器引发的相关概念

1 分布式系统面临的问题 服务雪崩 多个微服务之间调用的时候&#xff0c;假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的"扇出”&#xff0c;如果扇出的链路上某个微服务的调用响应时间过长或者不可用&#xff0c;对微服务A的调用就会…

ABAP 弹出框自建内容POPUP

可以自己设计内容&#xff0c;仅供参考。转载于:https://www.cnblogs.com/matinal/p/4135269.html

前端学习(1287):node.js的组成

var first hello nodejs; console.log(first);function fn() {console.log("fn函数被调用了"); }fn();for (var i 0; i < 5; i) {console.log(i); }if (true) {console.log(123); } 运行结果

gateway路由网关,zuul的替代品

zuul1 low, zuul2 还没长大呢&#xff0c;不敢用。 gateway 基于netty, spring flux, reactor 异步非阻塞, 快呀。 与spring良好整合, spring社区的呢。官方推荐。https://spring.io/projects/spring-cloud-gateway https://cloud.spring.io/spring-cloud-static/spring-cloud-…

ASP.NET MVC 5 入门教程 (3) 路由route

文章来源&#xff1a; Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc-5-get-started-route.html 上一节&#xff1a;ASP.NET MVC 5 入门教程 (2) 控制器Controller 下一节&#xff1a;ASP.NET MVC 5 入门教程 (4) View和ViewBag 源码下载&#xff1a;点我下载 上一节我…

spring cloud config 配置中心

/(ㄒoㄒ)/~~ 还有好多要学鴨 cloud config分布式面临的系统配置问题&#xff0c;如何解决分为服务端配置与客户端配置客户端不能自动更新git上的配置分布式面临的系统配置问题&#xff0c;如何解决 1. 分布式系统面临的配置问题 微服务意味着要将单体应用中的业务拆分成一个个…

前端学习(1289):nodejs模块化的开发规范

demo02.js const add (n1, n2) > n1 n2exports.add add; demo03.js const a require(./demo02.js); console.log(a); 运行结果

spring cloud bus消息总线

解决的痛点: 当git仓库的配置更新后&#xff0c; cloud config 客户端不能获取到配置信息的问题, 需要手动发送请求&#xff0c;刷新配置。 可以参照 spring cloud config cloud busbus消息总线使用rabbitMQ推送消息原理架构实现使用curl命令刷新客户端的配置bus bus配合conf…

前端学习(1290):nodejs模块化的开发导出另一种方式

demo04.js const greeting _name > hello ${_name};module.exports.greeting greeting; demo05.js const a require(./demo04.js); console.log(a); console.log(a.greeting(geyao)); 运行结果 demo04.js const greeting _name > hello ${_name}; const x 100;…

c++ 匿名函数

#include<iostream> #include <cstdlib> using namespace std;int main() {//为了在以后便于区分&#xff0c;我这段main()代码叫做main1autofunc [] { printf("%d\n",1989); };func();system("pause");return 0; } 转载于:https://www.cnblo…

SpringCloud Stream消息驱动

为啥有这个技术&#xff1f;&#xff1f;&#xff1f; 1. 这个stream是操作消息队列的&#xff0c;简化&#xff0c;学习消息队列的成本降低。 2. 可操作rabbitMQ兔子message queue&#xff0c;kafaka&#xff0c;可理解为jdbc可操作oracle, mysql.. 3. spring家的技术学就完了…

前端学习(1291):nodejs的系统模块文件读取操作

//通过模块对模块进行引入 const fs require(fs); //读取文件 fs.readFile(./demo01.js, utf8, (err, doc) > {console.log(err);console.log(doc); }) 运行结果

解决MySQL忘记root密码

网上有很多关于忘记MySQL root密码的一些文章&#xff0c;里面都有写怎么去解决&#xff0c;但有时觉得写得太恶心&#xff0c;要么一字不漏的抄别人的&#xff0c;要么就说得不清不楚&#xff0c;好了&#xff0c;不吐槽了&#xff0c;以下是解决的整个过程。 首先我们要知道忘…

SpringCloud Sleuth分布式请求链路追踪

概念 1. 为什么需要链路追踪&#xff1f; 在微服务框架中&#xff0c;一个由客户端发起的请求在后端系统中 会经过多个不同的的服务节点调用来协同产生最后的请求结果, 每一个前段请求都会形成一复杂的分布式服务调用链路, 链路中的任何一环出现高延时或错误都会引起整个请求最…

前端学习(1292):文件写入操作

const fs require(fs);fs.writeFile(./demo.txt, 即将要写入的内容, err > {if (err ! null) {console.log(err);return;}console.log(文件内容写入成功); }) 运行结果

Android中如何下载文件并显示下载进度

原文地址&#xff1a;http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1125/2057.html 这里主要讨论三种方式&#xff1a;AsyncTask、Service和使用DownloadManager。 一、使用AsyncTask并在进度对话框中显示下载进度 这种方式的优势是你可以在后台执行下载任务的同时…