1、Spring Cloud Ribbon
负载均衡有以下几种方式来实现,Spring Cloud OpenFeign 就是默认规则,下面我们会详细分析
-
默认规则:轮训 RoundRobin -
简单轮询负载均衡(RoundRobin) -
随机负载均衡 (Random)随机选择 UP 的 Server -
加权响应时间负载均衡 WeightedResponseTime -
区域感知轮询负载均衡(ZoneAware)
下面这些算法可以直接配置,或者用代码配置,配置的话一般我们用代码可以直接去替换
2、构建 Ribbon 服务提供者
创建 spring-cloud-alibaba-ribbon-provider 模块,并注册到 Nacos
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</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>
修改 application.properties 配置文件
server.port=8000
spring.application.name=spring-cloud-alibaba-ribbon-provider
management.server.port=9000
management.endpoints.jmx.exposure.include=*
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
# Nacos注册信息
spring.cloud.nacos.discovery.server-addr=localhost:8848
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
spring.cloud.nacos.discovery.namespace=sandbox-configuration
启动类增加注解
@EnableDiscoveryClient
创建一个提供服务的控制层
package cn.tellsea.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
/**
* ribbon 测试
*
* @author Tellsea
* @date 2021/12/22
*/
@RestController
public class RibbonController {
@Value("${server.port}")
private int port;
@GetMapping("/ribbon/message/{message}")
public String message(@PathVariable("message") String message) {
return "[端口:]" + port + ",消息:" + message;
}
}
启动服务访问
http://localhost:8000/ribbon/message/Tellsea
返回结果
[端口:]8000,消息:Tellsea
到此,第一个服务提供者创建完成了,下面创建第二个服务提供者,这里我们使用 IDEA 提供的快捷方式配置,主要是复制启动方式,修改相关端口即可
复制之后,编辑生成的 SpringCloudAlibabaRibbonProviderApplication(1)修改为 SpringCloudAlibabaRibbonProviderApplication2,然后修改端口
-Dserver.port=8001 -Dmanagement.server.port=9001
保存之后启动,就有同一个服务,两个实例了, 检查 Nacos 的配置

3、构建 Ribbon 服务消费者
创建 spring-cloud-alibaba-ribbon-consumer 模块,依赖就多了一个 OpenFeign,同样的注册到 Nacos
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.2.RELEASE</version>
</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>
修改 application.properties 配置文件
server.port=8002
spring.application.name=spring-cloud-alibaba-ribbon-consumer
management.server.port=9002
management.endpoints.jmx.exposure.include=*
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
# Nacos注册信息
spring.cloud.nacos.discovery.server-addr=localhost:8848
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
spring.cloud.nacos.discovery.namespace=sandbox-configuration
启动类增加注解
@EnableDiscoveryClient
@EnableFeignClients
远程调用 OpenFeign 的接口
package cn.tellsea.service;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
* @author Tellsea
* @date 2021/12/22
*/
@FeignClient("spring-cloud-alibaba-ribbon-provider")
public interface RibbonService {
/**
* 远程方法
*
* @param message
* @return
*/
@GetMapping("/ribbon/message/{message}")
String message(@PathVariable("message") String message);
}
测试使用的控制层方法
package cn.tellsea.controller;
import cn.tellsea.service.RibbonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
/**
* Spring Cloud OpenFeign 远程调用
*
* @author Tellsea
* @date 2021/12/22
*/
@RestController
public class OpenFeignController {
@Autowired
private RibbonService ribbonService;
@GetMapping("/feign/ribbon/message/{message}")
public String feignEcho(@PathVariable String message) {
return ribbonService.message(message);
}
}
然后启动服务,检查 Nacos 是否注册完成,现在有个一个消费者,两个服务提供者

4、OpenFeign 默认负载方法
疯狂请求测试接口
http://localhost:8000/ribbon/message/Tellsea
发现每次都是轮询调用的,证实了默认使用的方式是轮询。文章头部说明了还有哪些负载方式,剩下的就是各种方式根据实际业务配置即可
微信公众号
原文始发于微信公众号(花海里):【Spring Cloud Alibaba】Ribbon 负载均衡器
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/69481.html