美文网首页springcloudRxJavaJava服务器端编程
RestTemplate+loadBalancer实现负载均衡代

RestTemplate+loadBalancer实现负载均衡代

作者: 迦叶_金色的人生_荣耀而又辉煌 | 来源:发表于2021-11-12 07:30 被阅读0次

上一篇 <<<feign和openfeign的区别
下一篇 >>>OpenFeign实现负载均衡代码演示


1.引入依赖包

    <!--  springboot 整合web组件,不需要引入ribbon的jar包-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>0.2.2.RELEASE</version>
    </dependency>

2.Bean初始化

//RestTemplate的bean初始化时增加注解@LoadBalanced
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
    return new RestTemplate();
}

3.代码直接使用

/**
 * 订单调用会员服务,使用时直接使用服务名称即可
 */
@RequestMapping("/orderToLoadBalancerMember")
public String orderToLoadBalancerMember() {
    /**RestTemplate不是SpringCloud写的,是Spring内部的,它本身支持http协议调用。*/
    String result = restTemplate.getForObject("http://member-service/test", String.class);
    return "订单调用会员获取结果:" + result;
}

4.源码分析

4.1 LoadBalanced注解的真实调用

注解里其实是调用了LoadBalancerClient,而这个接口下面有Ribbon负载均衡客户端的实现。


4.2真正调用的方法

根据serviceId获得其中一个具体Server地址

public ServiceInstance choose(String serviceId) {
    Server server = this.getServer(serviceId);
    return server == null ? null : new RibbonLoadBalancerClient.RibbonServer(serviceId, server, this.isSecure(server, serviceId), this.serverIntrospector(serviceId).getMetadata(server));
}
调用下来方法:
protected Server getServer(String serviceId) {
   return getServer(getLoadBalancer(serviceId));
}

//加载服务对应的地址列表信息
@Override
public <C> C getInstance(String name, Class<C> type) {
   C instance = super.getInstance(name, type);
   if (instance != null) {
      return instance;
   }
   IClientConfig config = getInstance(name, IClientConfig.class);
   return instantiateWithConfig(getContext(name), type, config);
}
//根据地址列表和默认负载均衡策略获取具体的具体数据
protected Server getServer(ILoadBalancer loadBalancer) {
   if (loadBalancer == null) {
      return null;
   }
   return loadBalancer.chooseServer("default"); // TODO: better handling of key
}

4.3路由算法


推荐阅读:
<<<本地负载均衡和nginx负载均衡
<<<SpringCloud中负载均衡客户端的使用
<<<如何选择ribbon还是loadbalancer
<<<feign和openfeign的区别
<<<OpenFeign实现负载均衡代码演示
<<<Feign超时配置

相关文章

网友评论

    本文标题:RestTemplate+loadBalancer实现负载均衡代

    本文链接:https://www.haomeiwen.com/subject/nzceoltx.html