三、Spring Cloud之软负载均衡 Ribbon

上一节我们已经学习了Eureka 注册中心,其实我们也使用到了Ribbon ,只是当时我们没有细讲,所以我们现在一起来学习一下Ribbon。

什么是Ribbon

之前接触到的负载均衡都是硬负载均衡,什么是硬负载均衡呢?硬负载均衡就是在以往的大型系统中,会有单独一套系统来负责负载均衡策略,我们所以的请求都会先走到负载均衡的系统上,进行分配到不同的服务器处理。
比如我们熟悉的nginx 。其实就可以算作一个负载均衡的系统,客户端请求的接口会先通过nginx 的负载均衡策略分配到不同的服务器上。

在这里插入图片描述


那Ribbon 不是这样的吗?那又是怎样的呢?
Ribbon 是和 Eureka 一样是Netflix 推出的开源产品,它可以和Eureka 完成无缝结合,Ribbon 主要实现客户端负载均衡。
那什么是客户端负载均衡呢?
就是在客户端请求的时候,就通过均衡策略将请求分发到不同的服务器上,如下图

在这里插入图片描述


这个图是根据上节的Eureka 的架构图改编来的,主要的流程还是没有变,服务消费者和服务提供者都会注册到服务中心,然后服务消费者会从服务中心获取可用实例列表 ,这里就会通过负载均衡策略选择其中一个实例进行访问。

好了我们来用代码来看一下。

demo

我们为了简化,注册中心服务端,我们还是用上节的单节点。怎么配置我不说了。然后我们新建一个module 用来做服务提供者,其实也可以用上一节的服务提供者,但是我怕揉在一起不好,所以就全都分开了,不过很多代码都是一样的。

服务提供者

我们新建一个模块后pom.xml 文件如下:

<parent> <groupId>cn.quellanan</groupId> <artifactId>SpringCloud</artifactId> <version>1.0.0</version> </parent> <groupId>com.quellanan.springcloud</groupId> <artifactId>ribbon-provider-9004</artifactId> <version>1.0.0</version> <name>ribbon-provider-9004</name> <description>ribbon-provider-9004 服务提供者</description> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies>

主要就是引入了eureka-client 可以注册到注册中心去,然后启动类加上@EnableEurekaClient 注解

在这里插入图片描述


在配置文件中加上配置如下:

server.port=9004 spring.application.name=ribbon-provider eureka.client.service-url.defaultZone=http://localhost:8000/eureka/

我们在创建一个测试类:HelloController

@RestController @Slf4j public class HelloController { @Value("${server.port}") private String port; @RequestMapping("/hello") public String hello(){ log.info(port); return "hello "+port; } }

这样我们一个服务提供者就弄好了,为了看出负载均衡的效果,我们还需要创建一个一样的服务提供者。或者不同的端口启动。我们将端口改为9005.其他的和上面一样。

服务消费者

服务提供者有了,我们再来创建一个服务消费者的模块。pom.xml 较服务提供者就多了一个ribbon 的依赖

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency>

然后启动类中加上@EnableEurekaClient 和 RestTemplate

@SpringBootApplication @EnableEurekaClient public class RibbonConsumerApplication { @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(RibbonConsumerApplication.class, args); } }

@LoadBalanced 注解就是来实现客户端负载均衡的。

配置文件中加入如下配置:

server.port=9003 #服务名,在注册时所用 spring.application.name=ribbon-consumer eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

最后我们来写一个调用服务提供者的接口,创建一个IndexController类,内容如下

@RestController public class IndexController { private static final String applicationName = "ribbon-provider"; @Autowired private RestTemplate restTemplate; @RequestMapping("/index") public String getHello(){ String url = "http://"+ applicationName +"/hello"; return restTemplate.getForObject(url,String.class); } } 测试

我们现在来启动服务中心,两个服务提供者,一个服务消费者。启动之后我们输入:

:8000/

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfpsp.html