• 【Spring Cloud】openfeign负载均衡方案(和lb发展历史)



    本文描述了Spring Cloud微服务中,各个服务间调用的负载均衡方案的升级历史,目前市场通用的是openfeign方案。

    版本1:原始loadBalancerClient方案

    1、引入负载均衡组件

    
    
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-loadbalancerartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2、使用负载均衡组件

    @RestController
    public class NacosController{
    
        @Autowired
        private LoadBalancerClient loadBalancerClient;
        @Autowired
        private RestTemplate restTemplate;
    
        @Value("${spring.application.name}")
        private String appName;
    
        @GetMapping("/echo/app-name")
        public String echoAppName(){
            // <1>
            ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-provider");
            String path = String.format("http://%s:%s/echo/%s",serviceInstance.getHost(),serviceInstance.getPort(),appName);
            System.out.println("request path:" +path);
            // <2>
            return restTemplate.getForObject(path,String.class);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在代码<1>处,首先用复杂均衡组件提供的LoadBalancerClient选择出具体是哪一个微服务instance提供服务;然后在代码<2>处请求具体的instance获取结果。

    注意:

    1、此时的RestTemplate就是原始的RestTemplate,而没有加@LoadBalance注解,因为负载均衡功能已经由loadBalancerClient完成了。

    @Bean
    public RestTemplate restTemplate(){
    
        return new RestTemplate();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    版本2:ribbon-loadbalancer方案

    1、引入组件

    <dependency>
        <groupId>com.netflix.ribbongroupId>
        <artifactId>ribbon-loadbalancerartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    2、如何使用

    1. 添加了负载均衡的RestTemplate
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
    
        return new RestTemplate();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 正常调用
    @RestController
     public class TestController {
    
        @Autowired
        private RestTemplate restTemplate;
    
        @GetMapping(value = "/echo-rest/{str}")
        public String rest(@PathVariable String str) {
            // 会负载均衡服务名称nacos-provider
            return restTemplate.getForObject("http://nacos-provider/echo/" + str, String.class);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    版本3:openfeign方案(即方案2+openfeign版本

    该方案是目前市场流行度较高的方案,用接口+@FeignClient注解方式。

    1、引入组件

    openfeign 会间接引入@LoadBalance注解及负载均衡功能。

    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-openfeignartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    2、如何使用

    1. 远程接口
    @FeignClient(name = "nacos-provider")
    public interface EchoService {
        @GetMapping(value = "/echo/{str}")
        String echo(@PathVariable("str") String str);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 添加了负载均衡的RestTemplate
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
    
        return new RestTemplate();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 接口实现
    @RestController
     public class TestController {
    
        @Autowired
        private RestTemplate restTemplate;
    
        @GetMapping(value = "/echo-rest/{str}")
        public String rest(@PathVariable String str) {
            // 会负载均衡服务名称nacos-provider
            return restTemplate.getForObject("http://nacos-provider/echo/" + str, String.class);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    1. 验证结果是成功的。

    参考代码:https://gitee.com/firefish985/FireFish/FireFish-Learning/nacos-discovery-consumer

  • 相关阅读:
    使用xlwings获取excel表的行和列以及指定单元格的值
    从FAST TCP到POWERTCP
    Selenium的安装以及简单使用
    IPV6(IPV6,RIPng的配置以及手工配置IPV4隧道)
    Git使用经验总结2-配置用户名邮箱
    Springboot和Vue+MYSQL项目(基本介绍+前后端结合初步项目)+maven+mybatis
    [附源码]计算机毕业设计JAVA疫情状态下病房管理平台
    android 10车载桌面ActivityView触摸事件源码详解分析
    treeview形式的checkbox(wpf、c#)
    【MyBatis源码分析】五、MyBatis的缓存
  • 原文地址:https://blog.csdn.net/yuchangyuan5237/article/details/133968991