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

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

话不多说,开始演示。

介绍

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

这里使用 用户模块 进行访问其它两个模块的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. Linux部署项目常用命令(持续更新)

    防火墙配置 # 启动防火墙服务 systemctl start firewalld # 关闭防火墙服务 systemctl stop firewalld # 查看防火墙服务状态 systemctl s ...

  2. 一文浅谈Mockito使用

    一.前期准备- 1.准备工作 <!--mockito依赖-->a <dependency> <groupId>org.mockito</groupId> ...

  3. Python基础——计算机组成原理、操作系统概述、编程语言的由来、编程语言分类、python介绍、 安装Cpython解释器、 第一个python程序

    文章目录 一 引子: 1.1 什么是语言?什么是编程语言?为何要有编程语言? 1.2 什么是编程?为什么要编程? 二 计算机组成原理 2.1.什么是计算机? 2.2.为什么要用计算机? 2.3.计算机 ...

  4. PPT太大发不出去?教你三个PPT压缩方法,200M的PPT变15M

    相信有很多小伙伴在工作的时候,都会制作不少的PPT,而我们也知道很多PPT在制作完成以后,体积就会变得非常大,在发送给别人的时候总是会受到限制,是有点难搞了. 别担心,今天小编将告诉大家三个简单的方法 ...

  5. Welcome to the Android Open Source Project!

    Android is an open-source software stack for a wide range of mobile devices and a corresponding open ...

  6. 错误记录-FileStream访问被拒绝

    简介: 问题:因项目需要,软件需要读取授权文件中的密文与本机验证码做一定的逻辑比对,使用FileStream实现文件的读取,在本机调试没问题,但在其他同事电脑上有一些出现授权一直不通过的情况. --M ...

  7. 如何使用DALL-E 3

    如何使用 DALL-E 3:OpenAI 图像生成指南 DALL-E 3 是 OpenAI 图像生成器的高级版本,它可以理解自然语言提示来创建详细图像. 它克服了以前版本的方形图像限制,现在支持各种宽 ...

  8. AlibabaCloudToolkit的简单使用与部署

    问题 以往的写好的应用程序放到服务器上部署的方式都是在本地打包成jar包,传到服务器上,在服务器用命令行关闭原版本的应用程序,在启动新版本的应用程序,每次写好一个功能要与前端联调都要经历这些繁琐的步骤 ...

  9. Redis项目搭建

    Redis项目搭建 Redis下载 搭建redis首先需要下载Redis,可是Redis官方并没有Windows安装,好在网上从不缺大牛,Github上可以找到Redis的Windows版 下载地址: ...

  10. Python 在PDF中生成水印

    前言 在PDF中插入水印是比较常用的一种功能.一般在生成比较重要的,或者需要注明版权.作者的文档时使用比较多. 这里我将分享一个通过python代码为PDF文档添加水印的办法(包括文本水印和图像水印) ...