Spring Cloud微服务架构——Ribbon客户端负载均衡

前几篇文章学习了Spring Cloud的注册中心,服务注册,服务发现与消费。

假设现在这样一种场景:

商场开的海底捞生意太过火爆,每天很多人排队,供不应求怎么办呢,商场又入驻了一家海底捞,现在有了两家海底捞入驻到商场,分别是6666号分店和8888号分店。这样当一家店爆满的时候可以去另外一家消费。把这种情景搬到业务场景中,就相当于负载均衡,将人流量均匀的分配到各个分店(将请求负载到各个服务上),在Spring Cloud中是有一种叫做Ribbon的组件支持我们来做客户端负载均衡。

Ribbon简介

Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面对服务的REST模块请求自动转换成客户端负载均衡的服务调用。Spring Cloud Ribbon几乎存在于每一个Spring Cloud构建的微服务和基础设施中。

参阅链接:Spring Cloud Ribbon简介

服务集群

在上一篇文章中已经将一个海底捞6666号分店入驻到了商场,为了增加一家店铺,我们需要再将8888号分店也入驻到商场,可以直接参考我们创建6666号分店时候的过程,换个店名,换个端口(我的6666号分店端口是9001,那我8888号分店端口就用9002吧)然后注册到注册中心。

目前,我们的项目目录已经是这样的:

eureka-register  port:8000 (Eureka注册中心)(商场)

eureka-provider1  port:9001 (服务提供者1)(海底捞6666号分店)

eureka-provider2  port:9002 (服务提供者2)(海底捞8888号分店)

分别按此顺序运行:eureka-register ==> eureka-provider1 ==> eureka-provider2

运行完毕后,打开Eureka注册中心后台页面,可以观察到我们注册的服务是这样的:

创建Ribbon项目

  • 快速构建一个Spring Boot工程,过程略(参考前面的文章)
  • 修改创建好的Ribbon项目的pom.xml文件,如下:
    
        org.springframework.boot
        spring-boot-starter-parent
        1.3.5.RELEASE
         
    
    com.jqcode
    ribbon
    0.0.1
    ribbon
    Spring cloud Ribbon

    
        1.8
    

    
        
            org.springframework.boot
            spring-boot-starter
        
        
            org.springframework.cloud
            spring-cloud-starter-eureka
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
            
                
                    org.junit.vintage
                    junit-vintage-engine
                
            
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                Brixton.RELEASE
                pom
                import
            
        
    
  • 启动类加上@EnableDiscoveryClient注解并构建RestTemplate的Bean实例
@EnableDiscoveryClient
@SpringBootApplication
public class RibbonApplication {

    @Bean
    @LoadBalanced       // 开启客户端负载均衡的能力
    RestTemplate restTemplate(){
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(RibbonApplication.class, args);
    }

}
  • 创建消费类RibbonController
@RestController
public class RibbonController {

    private static final String SERVER_URL = "http://FOOD-SERVICE/eat?customerName=小白";

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping(value = "/ribbonConusme", method = RequestMethod.GET)
    public String ribbonConusme() {
        return restTemplate.getForEntity(SERVER_URL, String.class).getBody();
    }
}
  • 修改application.properties配置文件
#Ribbon服务启动端口
server.port=9101
#Ribbon服务名称
spring.application.name=ribbon
#Eureka注册中心服务地址
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka
  • 启动Ribbon并访问地址:http://localhost:9101/ribbonConusme

可以看到网页输出内容为:

Spring Cloud微服务架构——Ribbon客户端负载均衡_第1张图片

再次访问此网址,输出内容为:

Spring Cloud微服务架构——Ribbon客户端负载均衡_第2张图片

可以多次访问,发现其实现的负载均衡方式为轮询。也可以观察下eureka-provider1和eureka-provider2服务日志,发现分别被请求了一次,即完成了负载均衡。

可能有人会比较好奇,在我们的pom文件里也没有引入相关ribbon组件的依赖,为什么可以实现客户端的负载均衡呢?其实在我们引入的

Spring-Cloud-Starter-Eureka里已经内部包含了ribbon的相关组件的。大家可以通过idea的依赖关系看到ribbon是存在的。

Spring Cloud微服务架构——Ribbon客户端负载均衡_第3张图片

 

图解架构

Spring Cloud微服务架构——Ribbon客户端负载均衡_第4张图片

你可能感兴趣的:(java相关)