前一篇博客我们已经构建了一个微服务项目demo,地址为https://blog.csdn.net/f123147/article/details/115904274,在高访问量和高并发的复杂项目中,不可避免地要考虑到系统的高可用性,这里就要考虑到负载均衡。负载均衡总体分为服务端负载均衡和客户端负载均衡,各有优缺点。接下来我们使用Ribbon来进行客户端负载均衡的测试

1、在order-server01工程中,创建mapper和controller包,并创建持久层和web层处理类

持久层创建的是一个mapper接口

package com.gmf.briup.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gmf.briup.entity.User;/*** 这里使用的是mybatis-plus框架,对mybatis做了进一步封装,许多sql不用再自己去写,* 调用对应方法即可;* 但mybatis的用法在mybatis-plus中也完全可用,是兼容的*///需要基层mybatis-plus的一个基类BaseMapper,并传入我们自己定义的实体类User@Mapper
public interface UserMapper extends BaseMapper<User> {}

controller层:

package com.gmf.briup.controller;import com.gmf.briup.entity.User;
import com.gmf.briup.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;@Controller
@RequestMapping("/orderService/service")
public class UserController {@Value("${server.port}")private String port;@Autowiredprivate UserMapper userMapper;@ResponseBody@RequestMapping("/getPort")public String getPort() {return "order-service01 port:" + port;}
}

order-service02的mapper和controller创建过程和内容同order-service01

2、在front工程中中创建一个WebController类,

package com.gmf.briup.controller;import javax.servlet.http.HttpServletRequest;import com.gmf.briup.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.ModelAndView;import java.util.List;@Controller
@RequestMapping("/front")
public class WebController {@Autowiredprivate RestTemplate restTemplate;//客户端负载均衡(ribbon),调用order-service01和order-service02两个微服务@ResponseBody@RequestMapping("/getServicePort")  // RestTemplate 已经被 Ribbon 代理public String getOrderServicePort(){//restTemplate调用url: 微服务实例名+实际路径String port = restTemplate.getForObject("http://order-service/orderService/service/getPort",String.class);System.out.println(port);return port;}
}

front工程启动类如下
使用RestTemplate调用service端的接口,这里会返回两个order-service服务下两个不同工程节点的端口(8091、8092)。这里先使用Ribbon测试客户端负载均衡

@EnableEurekaClient
@SpringBootApplication
public class FrontApplication {public static void main(String[] args) {SpringApplication.run(FrontApplication.class, args);}//@LoadBalanced注解实现Ribbon负载均衡(默认是轮询)@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}}

3、进行测试,请求先到front工程,再在front工程中进行order-service服务调用的负载均衡,在浏览器中输入127.0.0.1:8090/front/getServicePort,多次请求该地址,在font工程的控制台输出内容如下,此时使用的是Ribbon默认的轮询算法

除此之外,Ribbon的负载均衡算法有多种,我们可以根据需要自己定义这些算法
需要在启动类所在包外建一个自定义类进行配置。新增自己的RibbonRule,但是不能够和启动类同一个包下面。因为启动类中的@SpringBootApplication注解里面,有一个@ComponentScan,自动扫描跟启动类同级的类,这样我们定义多个@RibbonClient的时候,它们就会共用一种负载策略

自定义类内容如下:

package com.gmf.myRibbonRule;import com.netflix.loadbalancer.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MySelfRule {//将负载均衡算法定义为随机@Beanpublic IRule myRule() {/**              *    //随机*   RandomRule r = new RandomRule();* *  //轮询重试(重试采用的默认也是轮询)*   RetryRule r = new RetryRule();**   //响应速度决定权重:响应速度最快的权重越大,权重越大则选中的概率越大*   WeightedResponseTimeRule w = new WeightedResponseTimeRule();**   //最优可用(底层也有RoundRobinRule):判断最优其实用的是并发连接数。选择并发连接数较小的server发送请求*    BestAvailableRule b = new BestAvailableRule();**   //可用性过滤规则,先过滤掉不可用的Server实例,再选择并发连接最小的实例。*    AvailabilityFilteringRule a = new AvailabilityFilteringRule();**  //基于AvailabilityFilteringRule基础上做的,首先判断一个zone的运行性能是否可用,*  剔除不可用的区域zone的所有server,然后再利用AvailabilityPredicate过滤并发连接过多的server。*   ZoneAvoidanceRule z = new  ZoneAvoidanceRule();*/return new RandomRule();}
}

此时对Front工程启动类进行一些修改,在类上添加注解@RibbonClient( ),写明要调用的微服务名称和负载均衡自定义的规则类

package com.gmf.briup;import com.gmf.myRibbonRule.MySelfRule;
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.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;@RibbonClient(name="order-service",configuration = MySelfRule.class)//使用MySelfRule配置的算法
@EnableEurekaClient
@SpringBootApplication
public class FrontApplication {public static void main(String[] args) {SpringApplication.run(FrontApplication.class, args);}/*** @LoadBalanced实现负载均衡(ribbon,默认为轮询算法),若要使用其他负载均衡算法,* 需要在启动类所在包外建一个自定义类进行配置* @return*/@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}}

结果随机显示如下,负载均衡策略成功

Ribbon客户端负载均衡相关推荐

  1. SpringCloud微服务架构,Spring Cloud 服务治理(Eureka,Consul,Nacos),Ribbon 客户端负载均衡,RestTemplate与OpenFeign实现远程调用

    什么是SpringCloud 微服务架构 • "微服务"一词源于 Martin Fowler的名为 Microservices的博文,可以在他的官方博客上找到 http://mar ...

  2. Spring Cloud源码分析——Ribbon客户端负载均衡

    年前聊了Eureka和Zookeeper的区别,然后微服务架构系列就鸽了三个多月,一直沉迷逛B站,无法自拔.最近公司复工,工作状态慢慢恢复(又是元气满满地划水).本文从以下3个方面进行分析(参考了翟永 ...

  3. Ribbon 客户端负载均衡

    文章目录 零.懒汉式改为饿汉式 一.基于配置文件 二.基于Bean配置 三.自定义规则 1 权重优先调用 2 集群优先调用 3 元数据优先调用 零.懒汉式改为饿汉式 [consumer-springb ...

  4. Ribbon客户端负载均衡介绍

  5. ribbon, restTemplate 负载均衡服务调用

    ribbon ribbon concept ribbon核心组件IRule 模仿源码重写轮询 ribbon concept spring cloud ribbon 是基于Netflix ribbon实 ...

  6. 五、springcloud之客户端负载均衡Ribbon

    一.简介 在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式: 一种是ribbon+restTemplate, ...

  7. 客户端负载均衡Ribbon之一:Spring Cloud Netflix负载均衡组件Ribbon介绍

    Netflix:['netfliːks] ribbon:英[ˈrɪbən]美[ˈrɪbən] n. 带; 绶带; (打印机的) 色带; 带状物; v. 把-撕成条带; 用缎带装饰; 形成带状;     ...

  8. 基于Spring cloud Ribbon和Eureka实现客户端负载均衡

    前言 本案例将基于Spring cloud Ribbon和Eureka实现客户端负载均衡,其中Ribbon用于实现客户端负载均衡,Eureka主要是用于服务注册及发现: 传统的服务端负载均衡 常见的服 ...

  9. Spring Cloud【Finchley】-04使用Ribbon实现客户端负载均衡

    文章目录 概述 Ribbon演示 服务提供者微服务改造为使用MySql数据库 新建服务消费者微服务,配置Ribbon 注意事项 源码 概述 Spring Cloud-03将微服务注册到Eureka S ...

最新文章

  1. Java项目:仓库管理系统设计和实现(java+ssm+springboot+layui)
  2. 十种创业病 你得了几个?
  3. 申请邓白氏编码和公司开发者账号需要的东西
  4. oAuth2.0 登录新浪微博 发送新浪微博 代码
  5. python 抓包基于pypcap
  6. CF1042F Leaf Sets (贪心+树上构造)
  7. Daily Scrum02 12.03
  8. 【mysql】MySQL存储IP地址
  9. iot软件测试,IoT研发测试工程师
  10. matlab使用parpool加速蒙特卡洛仿真
  11. hb100 微波雷达arduino_【Arduino】108种传感器系列实验(03)-微波雷达感应开关...-Arduino中文社区 - Powered by Discuz!...
  12. Linux查看网卡ip地址,查看网卡IP地址
  13. 枕头里面加进这些小宝贝能治高血压!快告知你父母~
  14. Hdl_localization全套安装运行问题总结
  15. 写个简单的chrome插件-京东商品历史价格查询
  16. java 默认打印机_JavaScript代码 设置默认打印机!
  17. 2021-08-11 TM32F103 Buffer FatFs 文件系统移植
  18. 【数据库】 如何对数据库进行操作
  19. 出国留学考试指导大全:托福85分是个坎儿
  20. Socialbook告诉你网红营销和ROI的关系~

热门文章

  1. ssis导入xml_使用SSIS包将XML文档导入SQL Server表
  2. sql机器学习服务_机器学习服务–在SQL Server中配置R服务
  3. tornado 重定向404
  4. [Android]解决 Could not read entry xxx from cache taskArtifacts.bin
  5. JavaScript中call,apply,bind方法的总结。
  6. Android之帮助文档
  7. redis系列-redis的持久化
  8. 适用于iOS7 UI的外描边图标素材下载
  9. android笔记--与服务器交互更改简历状态
  10. Erlang打包工具rebar安装使用