irpas技术客

【云原生&微服务一】SpringCloud之Ribbon实现负载均衡详细案例(集成Eureka、Ribbon)_秃秃爱健身

网络 7044

一、负载均衡概述

在分布式 或 微服务架构中,服务的提供者往往有多个实例 会注册到服务注册中心中,服务消费者需要使用服务时,需要决定使用哪个服务提供者,这正是负载均衡的体现。 负载均衡也可以理解为:将用户的请求平摊分配到每个服务器上,尽可能的压榨每台服务器的带宽、性能。

负载均衡的方式有两种:

服务端负载均衡

像以前的老架构,通过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-sample

ribbon-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-consumer

ribbon-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.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。