Ribbon客户端负载均衡
前一篇博客我们已经构建了一个微服务项目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客户端负载均衡相关推荐
- SpringCloud微服务架构,Spring Cloud 服务治理(Eureka,Consul,Nacos),Ribbon 客户端负载均衡,RestTemplate与OpenFeign实现远程调用
什么是SpringCloud 微服务架构 • "微服务"一词源于 Martin Fowler的名为 Microservices的博文,可以在他的官方博客上找到 http://mar ...
- Spring Cloud源码分析——Ribbon客户端负载均衡
年前聊了Eureka和Zookeeper的区别,然后微服务架构系列就鸽了三个多月,一直沉迷逛B站,无法自拔.最近公司复工,工作状态慢慢恢复(又是元气满满地划水).本文从以下3个方面进行分析(参考了翟永 ...
- Ribbon 客户端负载均衡
文章目录 零.懒汉式改为饿汉式 一.基于配置文件 二.基于Bean配置 三.自定义规则 1 权重优先调用 2 集群优先调用 3 元数据优先调用 零.懒汉式改为饿汉式 [consumer-springb ...
- Ribbon客户端负载均衡介绍
- ribbon, restTemplate 负载均衡服务调用
ribbon ribbon concept ribbon核心组件IRule 模仿源码重写轮询 ribbon concept spring cloud ribbon 是基于Netflix ribbon实 ...
- 五、springcloud之客户端负载均衡Ribbon
一.简介 在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式: 一种是ribbon+restTemplate, ...
- 客户端负载均衡Ribbon之一:Spring Cloud Netflix负载均衡组件Ribbon介绍
Netflix:['netfliːks] ribbon:英[ˈrɪbən]美[ˈrɪbən] n. 带; 绶带; (打印机的) 色带; 带状物; v. 把-撕成条带; 用缎带装饰; 形成带状; ...
- 基于Spring cloud Ribbon和Eureka实现客户端负载均衡
前言 本案例将基于Spring cloud Ribbon和Eureka实现客户端负载均衡,其中Ribbon用于实现客户端负载均衡,Eureka主要是用于服务注册及发现: 传统的服务端负载均衡 常见的服 ...
- Spring Cloud【Finchley】-04使用Ribbon实现客户端负载均衡
文章目录 概述 Ribbon演示 服务提供者微服务改造为使用MySql数据库 新建服务消费者微服务,配置Ribbon 注意事项 源码 概述 Spring Cloud-03将微服务注册到Eureka S ...
最新文章
- Java项目:仓库管理系统设计和实现(java+ssm+springboot+layui)
- 十种创业病 你得了几个?
- 申请邓白氏编码和公司开发者账号需要的东西
- oAuth2.0 登录新浪微博 发送新浪微博 代码
- python 抓包基于pypcap
- CF1042F Leaf Sets (贪心+树上构造)
- Daily Scrum02 12.03
- 【mysql】MySQL存储IP地址
- iot软件测试,IoT研发测试工程师
- matlab使用parpool加速蒙特卡洛仿真
- hb100 微波雷达arduino_【Arduino】108种传感器系列实验(03)-微波雷达感应开关...-Arduino中文社区 - Powered by Discuz!...
- Linux查看网卡ip地址,查看网卡IP地址
- 枕头里面加进这些小宝贝能治高血压!快告知你父母~
- Hdl_localization全套安装运行问题总结
- 写个简单的chrome插件-京东商品历史价格查询
- java 默认打印机_JavaScript代码 设置默认打印机!
- 2021-08-11 TM32F103 Buffer FatFs 文件系统移植
- 【数据库】 如何对数据库进行操作
- 出国留学考试指导大全:托福85分是个坎儿
- Socialbook告诉你网红营销和ROI的关系~
热门文章
- ssis导入xml_使用SSIS包将XML文档导入SQL Server表
- sql机器学习服务_机器学习服务–在SQL Server中配置R服务
- tornado 重定向404
- [Android]解决 Could not read entry xxx from cache taskArtifacts.bin
- JavaScript中call,apply,bind方法的总结。
- Android之帮助文档
- redis系列-redis的持久化
- 适用于iOS7 UI的外描边图标素材下载
- android笔记--与服务器交互更改简历状态
- Erlang打包工具rebar安装使用