一、负载均衡概述
在分布式 或 微服务架构中,服务的提供者往往有多个实例 会注册到服务注册中心中,服务消费者需要使用服务时,需要决定使用哪个服务提供者,这正是负载均衡的体现。 负载均衡也可以理解为:将用户的请求平摊分配到每个服务器上,尽可能的压榨每台服务器的带宽、性能。
负载均衡的方式有两种:
服务端负载均衡像以前的老架构,通过nginx对请求做负载均衡,然后下发到指定的tomcat。
客户端负载均衡client获取到所有的service实例,然后做负载均衡规则。例如:Ribbon、Feign
本文我们针对SpringCloud如何集成Ribbon实现负载均衡做一个讨论。
注:(版本信息)–
二、Ribbon实现负载均衡整体项目目录包括三个Module,分别为:eureka-server、ribbon-feign-sample、ribbon-feign-sample-consumer。 其中eureka-server作为服务注册中心、ribbon-feign-sample作为服务提供者、ribbon-feign-sample-consumer作为服务消费者。
Ribbon 与 RestTemplate 配合使用,实现了微服务之间的调用。
0、最上层父项目spring-cloud-center的pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://`flix.eureka.server.EnableEurekaServer; /** * @author Saint */ @EnableEurekaServer @SpringBootApplication public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }这里和普通的启动有一个区别:需要加上 @EnableEurekaServer 注解开启Eureka-Server。
4、启动eureka-server启动成功后,控制台输出如下: 进入到eureka-server 的dashboard,可以看到eureka-server已经上线:
2、搭建服务提供者ribbon-feign-sampleribbon-feign-sample整体代码结构目录如下: 其中包含一个pom.xml文件、一个配置文件、一个启动类、一个Controller。
1、pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://`flix.eureka.EnableEurekaClient; /** * Saint */ @SpringBootApplication @EnableEurekaClient public class RibbonFeignSampleApplication { public static void main(String[] args) { SpringApplication.run(RibbonFeignSampleApplication.class, args); } }这里和普通的启动有一个区别:需要加上 @EnableEurekaClient 注解开启eureka-client。
4、编写GreetingController package com.saint.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @author Saint */ @RestController @RequestMapping("/greeting") public class GreetingController { @GetMapping("/sayHello/{name}") public String sayHello(@PathVariable("name") String name) { System.out.println("接收到了请求调用 + " + name); return "Hello, " + name; } } 5、启动GREETING-SERVICE服务实例1(8081端口)服务启动成功后,控制台输出如下: 再看eureka-server dashboard中多了一个 GREETING-SERVICE 服务,并且其有一个实例 192.168.3.32:greeting-service:8081。
6、启动GREETING-SERVICE服务实例2(8082端口)1> 修改RibbonFeignSampleApplication的配置:
2> 复制出一个RibbonFeignSampleApplication配置: 3> 修改第二启动类配置名为:RibbonFeignSampleApplication-8082,启动端口为8082: 4> 运行RibbonFeignSampleApplication-8082: 5> 启动之后,看eureka-server dashboard中GREETING-SERVICE 服务多了一个实例 192.168.3.32:greeting-service:8082:
3、搭建服务消费者ribbon-feign-sample-consumerribbon-feign-sample-consumer整体代码结构目录如下: 其包含一个pom.xml文件、一个application配置文件、一个启动类、一个Http负载均衡配置类、一个Controller。
1、pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://`flix.eureka.EnableEurekaClient; /** * Saint */ @SpringBootApplication @EnableEurekaClient public class RibbonFeignSampleConsumerApplication { public static void main(String[] args) { SpringApplication.run(RibbonFeignSampleConsumerApplication.class, args); } } 4、修改HTTP负载均衡配置类–HttpConfig package com.saint.config; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; /** * Http配置类 * * @author Saint */ @Configuration public class HttpConfig { @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }HttpConfig类的作用:对RestTemple的调用使用Ribbon做负载均衡,将RestTemplate注入到Spring IOC容器中。
5、编写ConsumerController package com.saint.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; /** * @author Saint */ @RestController public class ConsumerController { @Autowired private RestTemplate restTemplate; @RequestMapping("/say/{name}") public String getHello(@PathVariable("name") String name) { String res = restTemplate.getForObject("http://GREETING-SERVICE/greeting/sayHello/" + name, String.class); return res; } }ConsumerController中通过RestTemplate调用http://GREETING-SERVICE/greeting/sayHello/{name}。
6、启动ribbon-feign-sample-consumer启动成功后,看eureka-server dashboard中多了一个 CONSUMER-SERVICE 服务,并且其有一个实例 192.168.3.32:consumer-service:9090。
4、使用浏览器进行调用服务消费者上述步骤中,我们已经依次启动了eureka-server、ribbon-feign-sample-8081、ribbon-feign-sample-8082、ribbon-feign-sample-consumer;三个服务、四个实例。
此处我们针对服务消费者ribbon-feign-sample-consumer做四次接口调用,分别为:
http://localhost:9090/say/sainthttp://localhost:9090/say/saint2http://localhost:9090/say/saint3http://localhost:9090/say/saint4然后我们去看ribbon-feign-sample-8081、ribbon-feign-sample-8082的控制台输出:
1> ribbon-feign-sample-8081控制台输出: 2> ribbon-feign-sample-8082控制台输出:
3> 结果说明: 我们可以发现,四个请求,ribbon-feign-sample-8081和ribbon-feign-sample-8082各分担了两个请求。其中ribbon-feign-sample-8081服务实例承担了请求:http://localhost:9090/say/saint2、http://localhost:9090/say/saint4,而ribbon-feign-sample-8082服务实例承担了请求:http://localhost:9090/say/saint、http://localhost:9090/say/saint3。
从现象上来看,已经Ribbon实现了负载均衡,并且默认是按照轮询的方式。
下文我们接着讨论 Ribbon是如何实现负载均衡(源码分析)?
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。 |