前言
- 基于Eureka示例搭建时的代码
- hosts增加域名dingsu-300
- 两种设备服务提供者(软交换-sip、300)各两个节点,用于测试负载路由情况
负载均衡概念
依据各项指标(可使用硬件资源、节点数、请求速率、业务场景等)进行权重考量,将负载(访问请求、工作任务等)分摊到多个服务节点上,从而提升系统整体的稳定性、可靠性。
LoadBalancer介绍
- 本次样例搭建使用的是Spring Cloud的 J 版本,H版本(某个小版本😄)之前默认引用的是Netflix Ribbon,在2020年之后不再维护,因此Spring Cloud官方推出并推荐使用Spring Cloud LoadBalancer
- Nacos默认引用Ribbon,后期搭建Nacos时,会替换为LoadBalancer
- LoadBalancer是一个客户端负载均衡器(调用方负责),而nginx则是服务端负载均衡器(服务提供方负责)
- 提供RoundRobin(轮询)和Random(随机)两种服务choose算法,当然也可以继承ReactorLoadBalancer< ServiceInstance>类,或者实现ReactorServiceInstanceLoadBalancer接口自定义算法
项目结构
- dingsu-300/-slave:设备300服务(2台)服务节点
- dingsu-device:设备管理服务
- dingsu-eureka:服务注册中心(-cluster是上篇文章遗老,忽略)
- dingsu-sip/-slave:软交换服务/设备(2台)服务节点
- dingsu-common: 通用数据结构
配置及代码
- 基于dingsu-sip模块示例,其他模块复制以下,修改配置即可
- hosts文件
127.0.0.1 confucius-eureka-server
127.0.0.1 dingsu-sip
127.0.0.1 dingsu-devices
127.0.0.1 dingsu-300
- application.yml
- 注意上一篇中提到的,defaultZone、application.name、hostname一致性的问题
spring:
application:
name: dingsu-sip
server:
port: 4512
desc: 软交换系统服务-4512
logging:
config: classpath:logback.xml
eureka:
instance:
hostname: dingsu-sip
client:
service-url:
defaultZone: http://confucius-eureka-server:4499/eureka
- pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.hd</groupId>
<artifactId>dingsu-common</artifactId>
</dependency>
<dependency>
<groupId>com.github.oshi</groupId>
<artifactId>oshi-core</artifactId>
</dependency>
- controller
- 两种设备方便起见,这个接口路径是一致的
package com.hd.sip.modules.server.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
import com.hd.common.core.domain.R;
import com.hd.sip.modules.server.service.ServerService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author 丁宿
*/
@Api(tags = "服务器状态")
@ApiSupport(order = 10,author = "丁宿")
@RestController
@RequestMapping("/server")
public class ServerController {
private final ServerService serverService;
public ServerController(ServerService serverService) {
this.serverService = serverService;
}
@ApiOperation(value = "当前状态")
@ApiOperationSupport(order =