【笔记】负载均衡Robbin之不同服务使用不同的策略
裂开裂开,搞这么久忘记导入依赖 妈卖批
又不报错 还能让我玩 我以为全部导入了。
话不多说,开始演示。
介绍
给不同的服务 配置 不同的 负载均衡策略
这里使用 用户模块 进行访问其它两个模块的controller数据
但是 在访问时 要配置各自的 负载均衡策略
也就是访问服务时 进入到 各自的 负载均衡策略 配置类里面找到相对应的 IRule
一、创建项目 自己玩。。。。
二、导入依赖
父依赖
子依赖
三、创建OrderController
package top.yangbuyi.controller; import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import top.yangbuyi.utils.ResponseResult; /**
* @description: 杨不易网站:www.yangbuyi.top
* @program: yangbuyispringcloudparent
* @ClassName: OrderController
* @create: 2020-07-31 21:36
* @author: yangbuyi
* @since: JDK1.8
* @OrderController:
**/ @RestController
@Slf4j
@RequestMapping("order")
public class OrderController { @RequestMapping("getOrder")
public HashMap getOrder(){
// 这里等会修改的 HashMap map = new HashMap<>();
map.put("msg","Spring Boot cloud getOrder22222222222222222 Hello World!");
return map;
}
}
四、创建application.yml
server:
port: 9000
eureka:
client:
serviceUrl:
#eureka服务端提供的注册地址 参考服务端配置的这个路径 也就是说 这里的路径为服务端配置的路径 必须一致 表示注册到哪个注册中心
defaultZone: http://eureka1:3000/eureka,http://eureka2:3001/eureka,http://eureka3:3002/eureka
instance:
instance-id: order-2 #此实例注册到eureka服务端的唯一的实例ID
prefer-ip-address: true #是否显示IP地址
#eureka客户需要多长时间发送心跳给eureka服务器,表明它仍然活着,默认为30 秒 (与下面配置的单位都是秒)
leaseRenewalIntervalInSeconds: 10
#Eureka服务器在接收到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除,默认为90秒
leaseExpirationDurationInSeconds: 30
# 实例名称 实例名称 相同为 集群
spring:
application:
name: provide-order #此实例注册到eureka服务端的name
五、我们创建一个 用户模块用于调用 负载均衡
上面相同的操作
创建一个配置文件夹
创建OrderConfigRibbon配置负载均衡策略
package top.yangbuyi.config; import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RoundRobinRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; /**
* @description: 杨不易网站:www.yangbuyi.top
* @program: yangbuyispringcloudparent
* @ClassName: GoodsConfigRibbon
* @create: 2020-08-05 14:58
* @author: yangbuyi
* @since: JDK1.8
* @GoodsConfigRibbon:
**/
@Configuration
public class OrderConfigRibbon { /**
* @Description: 杨不易个人网址:http://yangbuyi.top
* 功能描述:
* @Param:
* @return: 轮询
* @Author: TeouBle
* @Date: 2020/8/5 15:02
*/
public IRule iRule(){
System.out.println("触发了 轮询调度规则--------OrderConfigRibbon");
return new RoundRobinRule();
} }
创建GoodsConfigRibbon配置负载均衡策略
package top.yangbuyi.config; import com.netflix.loadbalancer.IRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import top.yangbuyi.Rule.yangbuyiRule; /**
* @description: 杨不易网站:www.yangbuyi.top
* @program: yangbuyispringcloudparent
* @ClassName: GoodsConfigRibbon
* @create: 2020-08-05 14:58
* @author: yangbuyi
* @since: JDK1.8
* @GoodsConfigRibbon:
**/
@Configuration
public class GoodsConfigRibbon { /**
* @Description: 杨不易个人网址:http://yangbuyi.top
* 功能描述:
* @Param:
* @return: 伪随机
* @Author: TeouBle
* @Date: 2020/8/5 15:46
*/
@Bean
public IRule iRule(){
// 随机算法 伪随机
System.out.println("触发了 伪随机调度规则--------GoodsConfigRibbon");
return new yangbuyiRule();
}
}
创建伪随机算法 用于替换负载均衡策略
package top.yangbuyi.Rule; import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;
import org.springframework.context.annotation.Configuration; import java.util.List;
import java.util.concurrent.ThreadLocalRandom; /**
* @description: 杨不易网站:www.yangbuyi.top
* @program: yangbuyispringcloudparent
* @ClassName: yangbuyi_Rule
* @create: 2020-08-02 23:30
* @author: yangbuyi
* @since: JDK1.8
* @yangbuyi_Rule: 随机 负载均衡
**/
public class yangbuyiRule extends AbstractLoadBalancerRule { /**
* 开始下标
*/
private int nowIndex = -1;
/**
* 最后的下标
*/
private int lastIndex = -1;
/**
* 记录要跳过 的记录数 (上一次的下标等于当前的下标 表示要跳过的下标)
*/
private int skipIndex = -1; /**
* Randomly choose from all living servers
*/
public Server choose(ILoadBalancer lb, Object key) {
if (lb == null) {
return null;
}
Server server = null; while (server == null) {
if (Thread.interrupted()) {
return null;
}
// 获取可用的服务
List upList = lb.getReachableServers();
// 获取全部服务列表
List allList = lb.getAllServers(); // 获取所有的数量
int serverCount = allList.size();
if (serverCount == 0) {
/*
* No servers. End regardless of pass, because subsequent passes
* only get more restrictive.
*/
return null;
} /*
* 伪随机:思路 当重复随机到一台服务两次时判断第三次是否还是它 是的话 我们要进行 再次随机 也就是第三次
* 当一个下标(伪服务)连接被调用两次
* 第三次如果还是它,就让再随机一次
* */ // 随机一次 获取一个在serverCount范围内的随机数
int index = chooseRandomInt(serverCount); // 要不要跳过 表示跳过的条件
if (index == skipIndex) { // 1,1,1
System.out.println("要重新随机");
index = chooseRandomInt(serverCount);
// 清空 跳过记录值
skipIndex = -1;
} // 要进行记录当前的下标
nowIndex = index;
if (lastIndex == nowIndex) {
// 如果 上一次的角标 等于 当前角标 就要 跳过了
skipIndex = nowIndex; // skipIndex = 1
}
// 记录 上一次的下标
lastIndex = nowIndex; // 从可用的微服务列表中,获取随机的微服务出来
server = upList.get(index); if (server == null) {
/*
* The only time this should happen is if the server list were
* somehow trimmed. This is a transient condition. Retry after
* yielding.
*/
Thread.yield();
continue;
} if (server.isAlive()) {
return (server);
} // Shouldn't actually happen.. but must be transient or a bug.
server = null;
Thread.yield();
} return server; } protected int chooseRandomInt(int serverCount) {
return ThreadLocalRandom.current().nextInt(serverCount);
} @Override
public Server choose(Object key) {
return choose(getLoadBalancer(), key);
} @Override
public void initWithNiwsConfig(IClientConfig clientConfig) {
// TODO Auto-generated method stub } }
最重要的一步 记得依赖要configuration
package top.yangbuyi; import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.Server;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.cloud.netflix.ribbon.RibbonClientName;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
import org.springframework.context.annotation.Bean;
import org.springframework.core.annotation.Order;
import org.springframework.web.client.RestTemplate;
import top.yangbuyi.Rule.yangbuyiRule;
import top.yangbuyi.config.GoodsConfigRibbon;
import top.yangbuyi.config.OrderConfigRibbon; /**
* @description: 杨不易网站:www.yangbuyi.top
* @program: yangbuyispringcloudparent
* @ClassName: UserApplication
* @create: 2020-07-31 20:24
* @author: yangbuyi
* @since: JDK1.8
* @UserApplication: 手写springBoot启动
* UserApplication
**/
@SpringBootApplication
@EnableEurekaClient // 注册中心 // 给不同的服务 配置 不同的 负载均衡策略 这里最重要 表示访问服务时 进入到 各自的 负载均衡策略 配置类里面找到相对应的 IRule
@RibbonClients({
@RibbonClient(name="provide-goods",configuration = GoodsConfigRibbon.class),
@RibbonClient(name="provide-order",configuration = OrderConfigRibbon.class),
})
public class UserApplication { public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
} @Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
} }
看到这里 可能 读者会看不懂。。这是我的笔记嗯。。。
完。。。。。。
你的压力来源于无法自律,只是假装努力,现状跟不上内心欲望,所以你焦虑又恐慌。——杨不易
【笔记】负载均衡Robbin之不同服务使用不同的策略的更多相关文章
- Spring Cloud Eureka 分布式开发之服务注册中心、负载均衡、声明式服务调用实现
介绍 本示例主要介绍 Spring Cloud 系列中的 Eureka,使你能快速上手负载均衡.声明式服务.服务注册中心等 Eureka Server Eureka 是 Netflix 的子模块,它是 ...
- TZ_13_负载均衡-Robbin
1.但是实际环境中,我们往往会开启很多个user-service的集群.此时我们获取的服务列表中就会有多个,到底该访问哪一个呢? 一般这种情况下我们就需要编写负载均衡算法,在多个实例列表中进行选择. ...
- spring cloud --- Ribbon 客户端负载均衡 + RestTemplate + Hystrix 熔断器 [服务保护] ---心得
spring boot 1.5.9.RELEASE spring cloud Dalston.SR1 1.前言 当超大并发量并发访问一个服务接口时,服务器会崩溃 ,不仅导致这个接口无法 ...
- EG:nginx反向代理两台web服务器,实现负载均衡 所有的web服务共享一台nfs的存储
step1: 三台web服务器环境配置:iptables -F; setenforce 0 关闭防火墙:关闭setlinux step2:三台web服务器 装软件 step3: 主机修改配置文件:vi ...
- 14 微服务电商【黑马乐优商城】:day02-springcloud(理论篇四:配置Robbin负载均衡)
本项目的笔记和资料的Download,请点击这一句话自行获取. day01-springboot(理论篇) :day01-springboot(实践篇) day02-springcloud(理论篇一) ...
- go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer)
目录 go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer) demo demo server demo client 池 dao service p2c ro ...
- Spring Cloud微服务笔记(四)客户端负载均衡:Spring Cloud Ribbon
客户端负载均衡:Spring Cloud Ribbon 一.负载均衡概念 负载均衡在系统架构中是一个非常重要,并且是不得不去实施的内容.因为负载均衡对系统的高可用性. 网络压力的缓解和处理能力的扩容的 ...
- Robbin负载均衡
Robbin是在Spring Cloud中的一个组件,是由Netfix发布的负载均衡器,有助于控制HTTP和TCP客户端的行为.它给我们提供了默认的轮询.随机等负载均衡算法.同时也可以由我们定义自己的 ...
- Ribbon服务调用+负载均衡(入门)
1.Ribbon Ribbon中文:(用于捆绑或装饰的)带子; 丝带; 带状物; 主要功能是提供客户端的软件负载均衡算法和服务调用 Ribbon已经进入了维护模式了,但是Ribbon仍然被广泛使用中 ...
- RPC原来就是Socket——RPC框架到dubbo的服务动态注册,服务路由,负载均衡演化
序:RPC就是使用socket告诉服务端我要调你的哪一个类的哪一个方法然后获得处理的结果.服务注册和路由就是借助第三方存储介质存储服务信息让服务消费者调用.然我们自己动手从0开始写一个rpc功能以及实 ...
随机推荐
- PowerDotNet平台化软件架构设计与实现系列(16):财务平台
不同行业基本都会有自己独特的业务,甚至同行的不同企业之间的业务逻辑也会相差千里,只有最大程度抽象出通用性.标准性和普适性的系统才能够成为平台系统,平台系统开发的成本和难度可想而知. 个人深度参与或独立 ...
- 判断两个数a,b,输出较大数的平方值。所谓平方值就是两个相同的数相乘的积。
平方值 描述 判断两个数a,b,输出较大数的平方值.所谓平方值就是两个相同的数相乘的积. 输入 两个数a和b 输出 输出较大数的平方值. 输入样例 1 1 2 输出样例 1 4 a,c = map ...
- Top 5 Code Smells Newbies Developers Could Easily Identify & Avoid
Posted by Ajitesh Kumar / In Freshers, Software Quality / February 1, 2014 Following is one very pop ...
- 创建vue项目并搭建JSONSERVER
1.该前提是你已经搭建好vue-cli脚手架,开始创建一个新项目,输入 vue init webpack demo(demo是自定义项目名). 2.cd demo 进入项目安装依赖 3.在已经创建的项 ...
- TOBO
然而并不会做. 最后就照着题解码了一遍/kk 真的好长啊.看时间就知道写了多久... upd in 2022: 我现在已经找不到原题面是什么了( 不过感觉把这样一篇不算题解的东西放进"题解& ...
- Linux常用命令(包含学习资源)
目录 (0)学习资源 (一)查看系统信息 (二)文件和目录 (三)文件搜索 (四)挂载一个文件系统 (五)磁盘空间 (六)用户和群组 (七)文件的权限 - 使用 "+" 设置权限, ...
- HTML DOM之二:事件
对事件作出反应 当事件发生时,可以执行 JavaScript,比如当用户点击一个 HTML 元素时. 如需在用户点击某个元素时执行代码,请把 JavaScript 代码添加到 HTML 事件属性中: ...
- go 中的循环依赖
什么是循环依赖 Go 中的循环依赖是指两个或多个包之间相互引用,形成了一个循环依赖关系.这种情况下,包 A 依赖包 B,同时包 B 也依赖包 A,导致两个包之间无法明确地确定编译顺序,从而可能引发编译 ...
- 聊聊 GPU 产品选型那些事
随着人工智能的飞速崛起,随之而来的是算力需求的指数级增加,CPU 已经不足以满足深度学习.大模型计算等场景的海量数据处理需求.GPU 作为一种强大的计算工具,无论是高性能计算.图形渲染还是机器学习领域 ...
- What is Conjugate complex number(共轭复数)?
word explain Conjugate 共轭是一个古代汉语词,在农业领域常用, 共轭复数的定义 两个实部相等,虚部互为相反数的复数互为共轭复数. 若Z=a+bi(a,b∈R),则Z*=a-bi( ...