最适合新手入门的SpringCloud教程 6—Ribbon负载均衡「F版本」

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介:

最适合新手入门的SpringCloud教程 6—Ribbon负载均衡「F版本」

前言
写博客一个多月了,断断续续的更新,今天有小伙伴催更新了,很高兴,说明我的分享是有意义的。

于是乎,更新来了,还顺便给该系列教程改了个名儿《最适合入门的SpringCloud教程》

通过之前的几篇文章,在代码中会有三个项目,分别是两个注册中心和一个客户端,如下图:

今天将会在这个代码的基础上:

将 eureka-client-8803 作为服务提供者
通过IDEA将eureka-client-8803启动在8803和8804端口上,模拟服务提供者集群
再创建一个服务消费者eureka-consumer-8805
让消费者通过服务调用和负载均衡调用服务提供者的服务。

Tips:需要了解过RestTemplate的使用 SpringBoot图文教程17—上手就会 RestTemplate 使用指南「Get Post」「设置请求头」

服务提供者集群运行,创建服务消费者
服务提供者写Controller接口
在服务提供者eureka-client-8803中写入一个TestController类

package com.lby.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**

  • @author luxiaoyang
  • @create 2020-04-02-20:13
    */

@RestController
public class TestController {

/**
 * @Value("${server.port}") 读取application配置文件中的值
 * 赋值到成员变量上
 *
 * ${server.port} 参数为 application配置文件中的key
 */
@Value("${server.port}")
private String port;

/**
 * @RequestParam 获取Request参数的 用于RestFul风格中
 * @PathVariable 获取路径中的参数
 */
@GetMapping("showImgById")
public String showImgById(@RequestParam("id") Integer id){
    return "查询到id为:"+id+"的信息,使用端口号为:"+port;
}

}

通过IDEA在8803和8804端口号启动服务提供者「模拟集群」
IDEA 中 默认项目启动是单例的,即一个项目只能够在一个端口号启动一次。但是在IDEA 实际上是支持多实例的,一个项目可以通过修改端口号启动多次。

以eureka-client-8803为例

1.修改eureka-client-8803的IDEA启动设置

IDEA的版本不同,还会出现如图所示的配置

2.在 8803 端口号启动项目

3.不要关闭 8803 这个服务,然后直接修改yml中的端口号为8804,再次通过启动类启动

通过以上步骤,就启动了两个服务提供者,用来模拟集群,效果如下

创建服务消费者 eureka-consumer-8805
根据之前教程中的步骤,再创建一个客户端eureka-consumer-8805作为消费者

pom配置

    <!--        Eureka 客户端的依赖-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>

    <!--        web的依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!--        测试的依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

application配置文件

server:
port: 8805

指定当前服务的名称 会注册到注册中心

spring:
application:

name: eureka-consumer-8805

指定 服务注册中心的地址

eureka:
client:

serviceUrl:
  defaultZone: http://localhost:8801/eureka,http://localhost:8800/eureka

启动类

package com.lby;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**

  • @author luxiaoyang
  • @create 2020-04-02-20:43
    */

@EnableDiscoveryClient
@SpringBootApplication
public class EurekaConsumer8805 {

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

}

服务调用和负载均衡
Ribbon负载均衡
Ribbon是一个基于HTTP和TCP的客户端负载均衡工具。

Ribbon是Netflix发布的开源项目,主要功能是提供客户端的负载均衡算法。

关于Ribbon的简介,有一个名词需要进行解释,客户端负载均衡?
负载均衡是一种非常常见的技术,例如:Nginx,F5。

对于Nginx来说,在Nginx中存储一份服务端的清单,用户的请求到达Nginx之后,Nginx会根据负载均衡策略从服务清单中选择一台服务器去处理客户端的请求。
服务清单存储在负载均衡服务中,这就是服务端负载均衡。
而客户端负责均衡,例如Ribbon,本身是不存储可用服务清单的,需要服务清单的时候通过服务节点找注册中心获取。

服务消费者 eureka-consumer-8805 中通过RestTemplate+Ribbon调用服务提供者
RestTemplate+Ribbon的配置
1.在服务消费者 eureka-consumer-8805中导入Ribbon的依赖


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


2.在启动类中写RestTemplate+Ribbon的配置

演示Ribbon负载均衡的效果
1.在消费者中创建接口 通过RestTemplate调用服务提供者

package com.lby.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**

  • @author luxiaoyang
  • @create 2020-04-02-20:49
    */

@RestController
public class ConsumerController {

@Autowired
private RestTemplate restTemplate;

/**
 * 调用服务提供者
 */
@RequestMapping("/consumer/showConsumer")
public String showConsumer(){
    /**
     * 通过Ribbon 发送服务调用 用的是RestTemplate
     * RestTemplate 本身没有负载均衡的能力
     *
     * 注意:RestTemplate请求地址中写的不是 ip+端口号 而是被调用服务的服务名称
     */
    String object = restTemplate.getForObject("http://eureka-client-8803/showImgById?id=1", String.class);

    return "查询到服务提供者的数据,"+object;
}

}

注意:RestTemplate请求地址中写的不是 ip+端口号 而是被调用服务的服务名称

2.重启所有的服务,两个服务提供者,一个服务消费者

3.访问服务消费者的接口

请求地址:http://localhost:8805/consumer/showConsumer
可以看到每次请求端口号不一样

总结
以上就是RestTemplate+Ribbon的负载均衡的基本使用

RestTemplate负责服务调用
Ribbon实现负载均衡
SpringCloud版本:Finchley.SR2
SpringBoot版本:2.0.3.RELEASE
源码地址:https://gitee.com/bingqilinpeishenme/Java-Tutorials

原文地址https://www.cnblogs.com/bingyang-py/p/12638759.html

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
2月前
|
负载均衡 算法 Java
Spring Cloud全解析:负载均衡算法
本文介绍了负载均衡的两种方式:集中式负载均衡和进程内负载均衡,以及常见的负载均衡算法,包括轮询、随机、源地址哈希、加权轮询、加权随机和最小连接数等方法,帮助读者更好地理解和应用负载均衡技术。
|
9天前
|
负载均衡 Java Nacos
Ribbon负载均衡
Ribbon负载均衡
18 1
Ribbon负载均衡
|
7天前
|
负载均衡 算法 Java
除了 Ribbon,Spring Cloud 中还有哪些负载均衡组件?
这些负载均衡组件各有特点,在不同的场景和需求下,可以根据项目的具体情况选择合适的负载均衡组件来实现高效、稳定的服务调用。
21 5
|
1月前
|
负载均衡 监控 算法
Nginx入门 -- 深入了解Nginx负载均衡
Nginx入门 -- 深入了解Nginx负载均衡
18 0
|
2月前
|
负载均衡 Java Nacos
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
微服务介绍、SpringCloud、服务拆分和远程调用、Eureka注册中心、Ribbon负载均衡、Nacos注册中心
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
|
3月前
|
存储 设计模式 缓存
OpenFeign集成Ribbon负载均衡-过滤和选择服务核心实现
该文章主要介绍了如何在OpenFeign中集成Ribbon以实现负载均衡,并详细分析了Ribbon中服务选择和服务过滤的核心实现过程。文章还涉及了Ribbon中负载均衡器(ILoadBalancer)和负载均衡策略(IRule)的初始化方式。
OpenFeign集成Ribbon负载均衡-过滤和选择服务核心实现
|
2月前
|
负载均衡 Java 开发者
Ribbon框架实现客户端负载均衡的方法与技巧
Ribbon框架为微服务架构中的客户端负载均衡提供了强大的支持。通过简单的配置和集成,开发者可以轻松地在应用中实现服务的发现、选择和负载均衡。适当地使用Ribbon,配合其他Spring Cloud组件,可以有效提升微服务架构的可用性和性能。
32 0
|
2月前
|
运维 负载均衡 监控
slb学习教程
【9月更文挑战第1天】
52 0
|
3月前
|
Java
SpringBoot和SpringCloud对应版本
SpringBoot和SpringCloud对应版本
85 0
|
2月前
|
SpringCloudAlibaba API 开发者
新版-SpringCloud+SpringCloud Alibaba
新版-SpringCloud+SpringCloud Alibaba