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文件,如下:
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.jqcode</groupId>
    <artifactId>ribbon</artifactId>
    <version>0.0.1</version>
    <name>ribbon</name>
    <description>Spring cloud Ribbon</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Brixton.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
  • 启动类加上@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

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

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

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

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

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

 

图解架构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值