首页 > 其他分享 >微服务Spring Cloud17_负载均衡Ribbon6

微服务Spring Cloud17_负载均衡Ribbon6

时间:2024-05-08 12:33:06浏览次数:22  
标签:负载 service Spring Cloud17 user 均衡 Ribbon6 consumer id

一、概述

 在刚才的案例中,我们启动了一个 user-service ,然后通过DiscoveryClient来获取服务实例信息,然后获取ip和端口来访问。

 但是实际环境中,往往会开启很多个 user-service 的集群。此时获取的服务列表中就会有多个,到底该访问哪一个呢?

 一般这种情况下就需要编写负载均衡算法,在多个实例列表中进行选择。

 不过Eureka中已经集成了负载均衡组件:Ribbon,简单修改代码即可使用。

 什么是Ribbon:

  

  接下来,我们就来使用Ribbon实现负载均衡。  

二、启动两个服务实例

 首先我们配置启动两个 user-service 实例,一个9091,一个9092。 

  

 Eureka监控面板:  

  

二、开启负载均衡

 因为Eureka中已经集成了Ribbon,所以我们无需引入新的依赖。

 直接修改 consumer-demo\src\main\java\com\itheima\consumer\ConsumerApplication.java

 在RestTemplate的配置方法上添加 @LoadBalanced 注解:

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
    return new RestTemplate();
}

 修改 consumer-demo\src\main\java\com\itheima\consumer\controller\ConsumerController.java 调用方式,不再手动获取ip和端口,而是直接通过服务名称调用; 

@GetMapping("{id}")
public User queryById(@PathVariable("id") Long id){
    String url = "http://user-service/user/" + id;
    User user = restTemplate.getForObject(url, User.class);
    return user;
}

访问页面,查看结果;并可以在9091和9092的控制台查看执行情况:

了解:Ribbon默认的负载均衡策略是轮询。SpringBoot也帮提供了修改负载均衡规则的配置入口在consumerdemo的配置文件中添加如下,就变成随机的了: 

user-service:
 ribbon:
   NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

格式是: {服务名称}.ribbon.NFLoadBalancerRuleClassName

三、源码跟踪

 为什么只输入了service名称就可以访问了呢?之前还要获取ip和端口。

 显然是有组件根据service名称,获取到了服务实例的ip和端口。因为 consumer-demo 使用的是RestTemplate, spring的负载均衡自动配置类LoadBalancerAutoConfiguration.LoadBalancerInterceptorConfig 会自动配置负载均衡拦截器(在spring-cloud-commons-**.jar包中的spring.factories中定义的自动配置类),它就是 LoadBalancerInterceptor ,这个类会在对RestTemplate的请求进行拦截,然后从Eureka根据服务id获取服务列 表,随后利用负载均衡算法得到真实的服务地址信息,替换服务id。

 我们进行源码跟踪:

  

  继续跟入execute方法:发现获取了9092端口的服务

  

  再跟下一次,发现获取的是9091、9092之间切换: 

  

  多次访问 consumer-demo 的请求地址;然后跟进代码,发现其果然实现了负载均衡。

 

标签:负载,service,Spring,Cloud17,user,均衡,Ribbon6,consumer,id
From: https://www.cnblogs.com/ajing2018/p/18179419

相关文章

  • Jenkins发版时报错Failed to instantiate [io.seata.spring.annotation.GlobalTransac
    Failedtoinstantiate[io.seata.spring.annotation.GlobalTransactionScanner]:Factorymethod'globalTransactionScanner'threwexception;nestedexceptionisjava.lang.ExceptionInInitializerError一开始以为是seata配置有问题,但最近也没有动过,直接执行发版脚本就没事......
  • 「Java开发指南」如何用MyEclipse搭建GWT 2.1和Spring?(一)
    本教程将指导您如何生成一个可运行的GoogleWebToolkit(GWT)2.1和Spring应用程序,该应用程序为域模型实现了CRUD应用程序模式。在本教程中,您将学习如何:安装GoogleEclipse插件为GWT配置一个项目搭建从数据库表到一个现有的项目GWT编译部署应用程序注意:自定义Spring代码......
  • 谈springboot两种实现结构
    概述最近由于入职华海智汇,所以文章也少了,并不是自己懈怠了,而是华海的保密措施不允许我上班写文章了,更何况还有无尽的加班。。。。。。。。。唉,所幸现在习惯了好多,现在觉着该记录一下知识了。目前市场上,要实现Java项目主要有Maven和Gradle两种框架,其中Gradle是新兴势力,Maven是老牌......
  • 27-Spring源码分析(二)
    AOP源码分析1.AOP概述AOP(AspectOrientProgramming)利用代理模式,通过代理对象对被代理的对象增加功能。所以,关键在于AOP框架自动创建AOP代理对象,代理模式分为静态代理和动态代理。AspectJ使用静态代理,编译时增强,在编译期生成代理对象;SpringAOP使用动态代理,运行时......
  • Spring SpringMVC概述
    SpringMVC框架主要用于跟客户端交互,包括请求和响应。  前端控制器的作用就是把一些功能封装,我们在开发时就不用再写一些繁杂的代码了SpringMVC使用DispatcherServlet作为前端控制器,DispatcherServlet本质其实是一个Servlet 原先我们在访问时,客户端发起请求直接找Servlet......
  • SpringBoot+Thymeleaf渲染下拉框异常解决
    常规方式<selectclass="form-control"name="operationType"th:field="${itemTemp.operationType}"style="width:80%"th:disabled="${readonly}"><optionvalue="">选......
  • Springboot+Netty实现http和ws统一端口处理
    http:/localhost:8080/apiws:/localhost:8080/ws核心就是两个channel处理器,http和wswebsocketpackagecom.example.netty;importio.netty.channel.ChannelHandlerContext;importio.netty.channel.SimpleChannelInboundHandler;importio.netty.handler.codec.http.HttpH......
  • SpringBoot集成WebSocket
    SpringBoot集成WebSocket1.引jar包<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency><dependency&......
  • springboot在2.4以后版本使用application.yml替换bootstrap.yml
    首先确认你的springboot版本是高于2.4的版本的,然后移除以下依赖<!--<dependency>--><!--<groupId>org.springframework.cloud</groupId>--><!--<artifactId>spring-cloud-starter-bootstrap</artifactId>--><!--</d......
  • Spring bean 相关
    beanId:bean的唯一标识beanName:applicationContext.getBean("userService")参数传递的其实是beanName。如果设置<bean>时没有设置beanName,会将beanId转化为beanName,没有beanId会将全类名设置为beanName,即com.xx.xx.UserServiceImplbean也可以设置多个别名bean设置作用范......