博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Cloud - Ribbon实现客户端的负载均衡
阅读量:4312 次
发布时间:2019-06-06

本文共 2757 字,大约阅读时间需要 9 分钟。

 

接上节,假如我们的Hello world服务的访问量剧增,用一个服务已经无法承载, 我们可以把Hello World服务做成一个集群。 

很简单,我们只需要复制Hello world服务,同时将原来的端口8762修改为8763。然后启动这两个Spring Boot应用, 就可以得到两个Hello World服务。这两个Hello world都注册到了eureka服务中心。这时候再访问http://localhost:8761, 可以看到两个hello world服务已经注册。(服务与注册参见)。

1.  客户端的负载均衡

负载均衡可分为服务端负载均衡和客户端负载均衡,服务端负载均衡完全由服务器处理,客户端不需要做任何事情。而客户端负载均衡技术,客户端需要维护一组服务器引用,每次客户端向服务端发请求的时候,会根据算法主动选中一个服务节点。常用的负载均衡算法有: Round Robbin,  Random,Hash,StaticWeighted等

Spring 提供两辆种服务调度方式:Ribbon+restful和Feign。Ribbon就是一个基于客户端的负载均衡器, Ribbon提供了很多在HTTP和TCP客户端之上的控制. 

Feign内部也已经使用了Ribbon, 所以只要使用了@FeignClient注解,那么这一章的内容也都是适用的。

下面就看看如何Spring Cloud如何用Ribbon来实现两个Hello World服务的负载均衡。以下是Spring cloud的ribbon客户端负载均衡架构图。

hello world服务和ribbon均注册到服务中心

service-hi工程跑了两个副本,端口分别为8762,8763,分别向服务注册中心注册, 当sercvice-ribbon通过restTemplate调用service-Hellowworld的接口时,利用用ribbon进行负载均衡,会轮流的调用处于两个不同端口的Hello world服务

 2. 创建一个Ribbon服务

1) 创建一个maven工程,取名叫service-ribbon, pom.xml文件如下:

 
pom.xml

 

2). 创建主类ServiceRibbonApplication

1 package springcloud.helloworld.ribbon.service; 2  3 import org.springframework.boot.SpringApplication; 4 import org.springframework.boot.autoconfigure.SpringBootApplication; 5 import org.springframework.cloud.client.discovery.EnableDiscoveryClient; 6 import org.springframework.cloud.client.loadbalancer.LoadBalanced; 7 import org.springframework.context.annotation.Bean; 8 import org.springframework.web.client.RestTemplate; 9 10 @SpringBootApplication11 @EnableDiscoveryClient12 public class ServiceRibbonApplication {13 14     public static void main(String[] args) {15         SpringApplication.run(ServiceRibbonApplication.class, args);16     }17 18     @Bean19     @LoadBalanced20     RestTemplate restTemplate() {21         return new RestTemplate();22     }23 }

@EnableDiscoveryClient向服务中心注册,并且注册了一个叫restTemplate的bean。

@ LoadBalanced注册表明,这个restRemplate是需要做负载均衡的。

 3). 创建获取一个获取Hello内容的service类

1 package springcloud.helloworld.ribbon.client; 2  3 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.stereotype.Service; 5 import org.springframework.web.client.RestTemplate; 6  7 @Service 8 public class HelloService { 9     @Autowired RestTemplate restTemplate;10 11     public String getHelloContent() {12         return restTemplate.getForObject("http://SERVICE-HELLOWORLD/",String.class);13     }14 }

这里关键代码就是, restTemplate.getForObject方法会通过ribbon负载均衡机制, 自动选择一个Hello word服务,

这里的URL是“http://SERVICE-HELLOWORLD/",其中的SERVICE-HELLOWORLD是Hello world服务的名字,而注册到服务中心的有两个SERVICE-HELLOWORLD。 所以,这个调用本质是ribbon-service作为客户端根据负载均衡算法自主选择了一个作为服务端的SERVICE-HELLOWORLD服务。然后再访问选中的SERVICE-HELLOWORLD来执行真正的Hello world调用。

3. 启动ribbon-service应用,我们就可以访问http://localhost:8901/, 然后每次刷新可以看到以下两种结果交替出现,表明实际调用的是在不同端口的不同的SERVICE-HELLOWORLD。

            

转载于:https://www.cnblogs.com/wzb0228/p/10973113.html

你可能感兴趣的文章
查看源代码
查看>>
C基础的练习集及测试答案(提高题)
查看>>
PKUWC2019滚粗记
查看>>
【H3C交换机】cpu各个进程的详细说明
查看>>
python3调用阿里云短信服务
查看>>
TensorFlow安装流程(GPU加速)
查看>>
Ninject在.NET WebForm和MVC中的使用
查看>>
生成二维码、条形码、带logo的二维码
查看>>
sublime 添加 ctags 实现代码跳转
查看>>
简单的SpringWebFlow例子及遇到的问题
查看>>
Java基础语法总结
查看>>
这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧【转】
查看>>
实现MySQL 用户密码的设置步骤
查看>>
CF961G Partitions
查看>>
弹出层之1:JQuery.Boxy (一)
查看>>
SpringBoot数据库集成-Mybatis
查看>>
CSS 基本语法
查看>>
SQLite清空表并将自增列归零
查看>>
vue响应的数据变化
查看>>
Web 开发常见安全问题
查看>>