欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

负载均衡集群如何实现(实现负载均衡集的技巧)

程序员文章站 2023-11-24 10:04:34
1、引言刚学习java时,我们编写的程序,运行时只有一个进程,这种程序就是我们常说的“单体架构”,最典型的单体架构图如下:单体架构的软件,我们可以认为是没有架构的。软件的架构,从单体架构,发展到垂直多...
负载均衡集群如何实现(实现负载均衡集的技巧)

1、引言

刚学习java时,我们编写的程序,运行时只有一个进程,这种程序就是我们常说的“单体架构”,最典型的单体架构图如下:

负载均衡集群如何实现(实现负载均衡集的技巧)

单体架构的软件,我们可以认为是没有架构的。

软件的架构,从单体架构,发展到垂直多程序架构、分布式架构、soa架构,一路狂奔,到了现在的微服务架构。

虽然我们推崇微服务架构,但客观地说,单体架构依然盛行,包括很多比较大的软件,就是用单体架构来开发的,发布时也只有一个可执行程序。

单体架构之所以盛行,是因为采用其他架构时,我们除了实现业务功能,还要实现架构,例如模块之间的相互调用,这些都很复杂。

当我们使用springcloud开发微服务架构的软件时,会发现事情变得很轻松。我们可以方便地对软件的处理能力扩容,可以用eureka和ribbon,实现模块之间基于restful的相互调用。

说了这么多理论,估计读者都有点烦了,还是直接上代码吧。

2、建立eureka服务器和eureka客户端

在上一讲《java第66讲——微服务之eureka》文章中,详细介绍了如何建立eureka服务器和eureka客户端,大家可以参考,因此这里不再赘述。

我们建立的eureka服务器的信息如下:

模块名称:register
监听端口:8800
注册url:http://localhost:8800/eureka/

eureka客户端将会启动三个实例,其信息如下:

模块名称:producer
监听端口:三个实例监听的端口分别为9901,9902,9903
应用名称:service-producer

这些信息与《java第66讲——微服务之eureka》文章中实现的代码完全一致。

从名称来看,register是注册中心,producer是生产者,此次开发,将增加一个消费者consumer,获得producer提供的服务:

负载均衡集群如何实现(实现负载均衡集的技巧)

3、ribbon功能介绍

ribbon是一个用来实现负载均衡的组件。

当我们有多个producer处于运行状态时,consumer可以根据负载情况,获得其中一个producer,然后进行调用。

使用ribbon,我们可以根据系统当前的负载情况,决定增加或者减少producer数量。

通过ribbon,我们轻松地实现了集群的能力。

4、在producer中增加一个callcontroller类

在producer中增加一个callcontroller类,用于提供服务,该类的代码如下:

package com.flying.producer.controller;

import org.springframework.beans.factory.annotation.value;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.requestparam;
import org.springframework.web.bind.annotation.restcontroller;

@restcontroller
public class callcontroller {
  
    @value("${server.port}")
    private int theport;
  
    @requestmapping("/call_me")
    private string callme(@requestparam(value = "name") string caller){
        stringbuffer stringbuffer = new stringbuffer();
        stringbuffer.append("service of port ").append(theport).append(" is called by ").append(caller);
        return stringbuffer.tostring();
    }
  
}

5、新增一个模块consumer

新增consumer模块的过程如下:

第1步:建立consumer模块,使用了lombok、spring web、eureka discovery client依赖:

负载均衡集群如何实现(实现负载均衡集的技巧)

第2步:修改consumer模块的pom.xml文件,添加对ribbon的依赖:

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

        <dependency>
            <groupid>org.springframework.cloud</groupid>
            <artifactid>spring-cloud-starter-ribbon</artifactid>
            <version>1.4.7.release</version>
        </dependency>

        <dependency>
            <groupid>org.projectlombok</groupid>
            <artifactid>lombok</artifactid>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-test</artifactid>
            <scope>test</scope>
        </dependency>
    </dependencies>

第3步:编辑入口类consumerapplication,添加对eureka的使用:

package com.flying.consumer;

import org.springframework.boot.springapplication;
import org.springframework.boot.autoconfigure.springbootapplication;
import org.springframework.cloud.client.discovery.enablediscoveryclient;
import org.springframework.cloud.netflix.eureka.enableeurekaclient;

@springbootapplication
@enableeurekaclient
@enablediscoveryclient
public class consumerapplication {
  
    public static void main(string[] args) {
        springapplication.run(consumerapplication.class, args);
    }

}

第4步:创建一个生成resttemplate对象的类resttemplatecreator,加上对ribbon的使用:

package com.flying.consumer.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;

@configuration
public class resttemplatecreator {
  
    @loadbalanced
    @bean
    resttemplate getresttemplate(){
        return new resttemplate();
    }
  
}

第5步:创建一个业务类callerservice,使用resttemplate实现对producer的调用:

package com.flying.consumer.biz;

import org.springframework.beans.factory.annotation.autowired;
import org.springframework.stereotype.service;
import org.springframework.web.client.resttemplate;

@service
public class callerservice {
  
    @autowired
    resttemplate resttemplate;
  
    public string callproducer(){
        return resttemplate.getforobject("http://service-producer/call_me?name=consumer", string.class);
    }
  
}

第6步:为了便于测试,添加一个测试类testcontroller:

package com.flying.consumer.controller;

import com.flying.consumer.biz.callerservice;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.web.bind.annotation.getmapping;
import org.springframework.web.bind.annotation.restcontroller;

@restcontroller
public class testcontroller {
  
    @autowired
    private callerservice callerservice;
  
    @getmapping("/call_test")
    public string testbyexplorer(){
        return callerservice.callproducer();
    }
  
}

第7步:修改application.properties文件,配置监听端口为10000,以及erueka服务器的url:

server.port=10000
eureka.client.serviceurl.defaultzone=http://localhost:8800/eureka/
spring.application.name=service-consumer

代码编写完成了,现在准备进行测试。

6、执行测试

第1步:在linux下建立consumer、producer1、producer2、producer3、register四个目录;

负载均衡集群如何实现(实现负载均衡集的技巧)

第2步:将软件传入到对应的目录,其中,producer软件同时传入producer1、producer2、producer3三个目录:

负载均衡集群如何实现(实现负载均衡集的技巧)

第3步:修改application.properties发文件,修改producer的监听端口:

producer1:监听9901
producer2:监听9902
producer3:监听9903
负载均衡集群如何实现(实现负载均衡集的技巧)

第4步:启动consumer、producer1、producer2、producer3、register;

负载均衡集群如何实现(实现负载均衡集的技巧)

第5步:查询register的监控页面,可以看到四个客户端注册进来了:

负载均衡集群如何实现(实现负载均衡集的技巧)

第6步:多次查看consumer提供的web功能,会发现每次调用的producer并不是同一个。

这是第一次测试时显示的web页面:

负载均衡集群如何实现(实现负载均衡集的技巧)

刷新页面,显示的web页面为:

负载均衡集群如何实现(实现负载均衡集的技巧)

刷新两次页面后,显示了下面的web页面:

负载均衡集群如何实现(实现负载均衡集的技巧)

不敢想象,没有编写多少代码,借助于spring cloud,竟然轻松地实现了集群功能,实现了负载均衡功能!

负载均衡集群如何实现(实现负载均衡集的技巧)