时间:2021-05-19
前面我们学习了 SpringCloud整合Consul ,在此基础上我们手写本地客户端实现类似Ribbon负载均衡的效果。
注: order 模块调用者 记得关闭 @LoadBalanced 注解。
我们这里只演示 注册中心 consul,至于 zookeeper 也是一模一样。
member模块
member 服务需要集群,所以我们copy application-consul.yml 文件命名为 application-consul2.yml
服务别名一致,只需要修改端口号即可。
application-consul2.yml 配置文件:
##服务端口号server: port: 8503spring: application: ##服务别名--服务注册到consul名称 name: consul-member ##注册中心consul地址 cloud: consul: host: localhost port: 8500 discovery: ## consul ip地址 hostname: 192.168.3.91启动 member 集群服务:
idea 运行 AppMember.java 启动 8501 端口
再打开 jar 包路径
shift + 右键 启动 PowerShell 窗口,运行命令:
java -jar E:\ideaworkspaceback\springcloud-zookeeper\springcloud-zookeeper-member\target\springcloud-zookeeper-member-1.0-SNAPSHOT.jar --spring.profiles.active=consul2启动 8503 端口
打开 http://localhost:8500/ui/dc1/services 可以发现上面 注册了 member 集群服务:
order模块
OrderApiController.java 控制页面使用原子类来 AtomicInteger 保证操作的原子性。
package com.baba.wlb.controller;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cloud.client.ServiceInstance;import org.springframework.cloud.client.discovery.DiscoveryClient;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;import java.util.List;import java.util.concurrent.atomic.AtomicInteger;/** * @Author wulongbo * @Date 2021/1/9 15:32 * @Version 1.0 */@RestControllerpublic class OrderApiController { @Autowired private RestTemplate restTemplate; @Autowired private DiscoveryClient discoveryClient; //使用原子类AtomicInteger private AtomicInteger atomicInteger = new AtomicInteger(1); public int add() { return atomicInteger.getAndIncrement(); //先获取再自增,对应a++ //若使用++a 则对应方法是a.incrementAndGet(); 先自增再获取 , //多说一句 a-- 就是 a.getAndDecrement(); //若a = a + 10;————对应API a.getAndAdd(10); } /** * springCloud中,两种方式调用(rest/feign) * * @return */ // 订单服务调用会员服务 @RequestMapping("/getOrder") public String getOrder() { // 有两种调用方式,一种是采用服务别名方式调用,另一种是使用别名去注册中心上获取对应服务调用地址 // 第一种方式 String url = "http://dy-202006281547:8000/getMember"; // 第二种方式 url = "http://zk-member/getMember"; String result = restTemplate.getForObject(url, String.class); return "订单服务调用会员服务:" + result; } /** * springCloud中,两种方式调用(rest/feign) * * @return */ // 订单服务调用会员服务 @RequestMapping("/getRibbonOrder") public String getRibbonOrder() { // 第一种方式 String url = getUri() + "/getMember"; String result = restTemplate.getForObject(url, String.class); return "纯手写Ribbon本地负载均衡:" + result; } public String getUri() { List<ServiceInstance> serviceInstances = discoveryClient.getInstances("consul-member"); if (serviceInstances == null || serviceInstances.isEmpty()) { return null; } int serverSize = serviceInstances.size(); int count = add(); int indexServer = count % serverSize; return serviceInstances.get(indexServer).getUri().toString(); }}AppOrder.java 启动类,关闭 @LoadBalanced 注解即可:
由于我们是在 springcloud集成zookeeper 项目上改造的,所以 order 模块 yml 配置也做相应的调整,注册中心修改为consul,并且在该模块中引入 consul 的 maven依赖
<!--springcloud 整合consul--><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId></dependency>启动 AppOrder.java ,并刷新 http://localhost:8500/ui/dc1/services 可以发现上面 注册了 order 服务:
这里有一个巨坑,导致 order 模块调用不到 member 模块,我们需要在yml 配置文件中注释掉:
## consul ip地址##hostname: 192.168.3.91消费者调用生产者:访问 http://localhost:8508/getRibbonOrder
OK!我们便达到了负载均衡!
到此这篇关于SpringCloud手写Ribbon实现负载均衡的文章就介绍到这了,更多相关SpringCloud Ribbon负载均衡内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
概述SpringCloud中,客户端的负载均衡使用的是Ribbon,Ribbon的超时时间默认很短,需要进行调整。SpringCloud版本Edgware.SR
一.简介SpringCloud是基于Restful的远程调用框架,引入Ribbon负载均衡组件后还需要客户端使用RestTemplate调用远程接口,操作起来还
在前两章已经给大家讲解了Ribbon负载均衡的规则以及如何搭建Ribbon并调用服务,那么在这一章呢将会给大家说一说如何在SpringCloud中去使用Ribb
前言Ribbon是一个客户端负载均衡器,它提供了对HTTP和TCP客户端的行为的大量控制。我们在上篇(猛戳:SpringCloud系列——Feign服务调用)已
这篇文章主要介绍了SpringCloud如何切换Ribbon负载均衡模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友