裂开裂开,搞这么久忘记导入依赖 妈卖批

又不报错 还能让我玩 我以为全部导入了。

话不多说,开始演示。

介绍

给不同的服务 配置 不同的 负载均衡策略

这里使用 用户模块 进行访问其它两个模块的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之不同服务使用不同的策略的更多相关文章

  1. Spring Cloud Eureka 分布式开发之服务注册中心、负载均衡、声明式服务调用实现

    介绍 本示例主要介绍 Spring Cloud 系列中的 Eureka,使你能快速上手负载均衡.声明式服务.服务注册中心等 Eureka Server Eureka 是 Netflix 的子模块,它是 ...

  2. TZ_13_负载均衡-Robbin

    1.但是实际环境中,我们往往会开启很多个user-service的集群.此时我们获取的服务列表中就会有多个,到底该访问哪一个呢? 一般这种情况下我们就需要编写负载均衡算法,在多个实例列表中进行选择. ...

  3. spring cloud --- Ribbon 客户端负载均衡 + RestTemplate + Hystrix 熔断器 [服务保护] ---心得

    spring boot      1.5.9.RELEASE spring cloud    Dalston.SR1 1.前言 当超大并发量并发访问一个服务接口时,服务器会崩溃 ,不仅导致这个接口无法 ...

  4. EG:nginx反向代理两台web服务器,实现负载均衡 所有的web服务共享一台nfs的存储

    step1: 三台web服务器环境配置:iptables -F; setenforce 0 关闭防火墙:关闭setlinux step2:三台web服务器 装软件 step3: 主机修改配置文件:vi ...

  5. 14 微服务电商【黑马乐优商城】:day02-springcloud(理论篇四:配置Robbin负载均衡)

    本项目的笔记和资料的Download,请点击这一句话自行获取. day01-springboot(理论篇) :day01-springboot(实践篇) day02-springcloud(理论篇一) ...

  6. go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer)

    目录 go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer) demo demo server demo client 池 dao service p2c ro ...

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

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

  8. Robbin负载均衡

    Robbin是在Spring Cloud中的一个组件,是由Netfix发布的负载均衡器,有助于控制HTTP和TCP客户端的行为.它给我们提供了默认的轮询.随机等负载均衡算法.同时也可以由我们定义自己的 ...

  9. Ribbon服务调用+负载均衡(入门)

    1.Ribbon Ribbon中文:(用于捆绑或装饰的)带子; 丝带; 带状物; 主要功能是提供客户端的软件负载均衡算法和服务调用 Ribbon已经进入了维护模式了,但是Ribbon仍然被广泛使用中 ...

  10. RPC原来就是Socket——RPC框架到dubbo的服务动态注册,服务路由,负载均衡演化

    序:RPC就是使用socket告诉服务端我要调你的哪一个类的哪一个方法然后获得处理的结果.服务注册和路由就是借助第三方存储介质存储服务信息让服务消费者调用.然我们自己动手从0开始写一个rpc功能以及实 ...

随机推荐

  1. 使用RabbitMQ最终一致性库存解锁

    一.基本介绍 ①延时队列(实现定时任务) 场景:比如未付款订单,超过一定时间后,系统自动取消订单并释放占有物品. 常用解决方案: spring的 schedule定时任务轮询数据库:缺点:消耗系统内存 ...

  2. 「loj - 3022」「cqoi 2017」老 C 的方块

    link. good题,考虑像 国家集训队 - happiness 一样在棋盘上搞染色,我毛张 @shadowice1987 的图给你看啊 你像这样奇数层以 red -> blue -> ...

  3. Solution -「THUPC 2019」Duckchess

    Description Link. 大模拟是不可能给你概括题意的. Solution (据说鸭棋题解用这个标题很吉利)(这里是被点名批评的 长度 19k 的打法)(先说好代码里 Chinglish 满 ...

  4. Django框架项目之git笔记——版本控制器、git介绍、git使用

    文章目录 版本控制器 git 简介 git与svn比较 git的工作流程 版本库间的通信 git分支管理 git使用 流程(核心总结) 安装 基础命令 将已有的文件夹 - 初始化为git仓库 在指定目 ...

  5. Go 语言开发环境搭建

    Go 语言开发环境搭建 目录 Go 语言开发环境搭建 一. GO 环境安装 1.1 下载 1.2 Go 版本的选择 1.3 安装 1.3.1 Windows安装 1.3.2 Linux下安装 1.3. ...

  6. Go 语言的前生今世与介绍

    Go 语言的前生今世与介绍 目录 Go 语言的前生今世与介绍 一. Go 语言的发展 1.1 Go 语言是如何诞生的? 1.2 Go语言的早期团队和演进历程 1.3 Go语言正式发布并开源 1.4 G ...

  7. Markdown · Typora | 基本画图技巧

    如果想画一些简单的状态图,可以使用 typora 自带的 mermaid 工具. (mermaid 不止能画简单的状态图,还能画流程图等,详见参考资料) 定义节点 可以定义不同形状的节点,并为节点添加 ...

  8. 推荐免费的svn空间(SVN代码托管)

    推荐免费的svn空间(SVN代码托管) 最近研究了国内和国外的免费svn空间,SVN代码托管,SVN在线,代码托管中心,有所心得. 1.http://www.svn999.com/ [推荐]国内的,免 ...

  9. Thinking in Java 4th Edition Source Code

    Thinking in Java 4th Edition Source Code Instructions for downloading, installing and testing the so ...

  10. Go 包操作之如何拉取私有的Go Module

    Go 包操作之如何拉取私有的Go Module 在前面,我们已经了解了GO 项目依赖包管理与Go Module常规操作,Go Module 构建模式已经成为了 Go 语言的依赖管理与构建的标准. 在平 ...