复制多个服务
① 点击 idea 的服务 进入以下界面 , 进行配置服务

② 复制配置信息



启动服务之后可以看到有两个实例

多次调用 http://127.0.0.1:9096/order/1 发现还是访问同一台机器 , 并没有分担符合

解决方法
修改 OrderController
private List<ServiceInstance> instances;
@PostConstruct //????
public void init(){
//从Eureka 中获取服务
instances = client.getInstances("product-service");//如果将初始化写在方法中 , 则不能保重每次调用的值相同
}
// 改版
@RequestMapping("/{orderId}")
public OrderInfo selectOrderById (@PathVariable("orderId") Integer orderId){//从请求url中获取参数
OrderInfo info = orderService.selectOrderById(orderId);
// String url = "http://127.0.0.1:9095/product/"+info.getProductId();
//从Eureka中获取服务列表 并添加应用名
//计算轮流实例
int index = count.getAndIncrement()%instances.size();
//拼接url
String uri = instances.get(index).getUri().toString();
String url = uri+"/product/"+info.getProductId();
log.info("远程调用的url:"+url);
ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);
info.setProductInfo(productInfo);
return info;
}
多次调用 :
观察日志 , 发现请求被均匀分配在了不同的实例上

负载均衡
负载均衡(Load Balance,简称 LB),是高并发,高可用系统必不可少的关键组件,当服务流量增大时,通常会采用增加机器的方式进行扩容,负载均衡就是用来在多个机器或者其他资源中,按照一定的规则合理分配负载
负载均衡的实现
服务端的负载均衡
Nginx 负载均衡器 , 请求先到达 Nginx , 然后通过负载均衡算法 , 在多个服务器之间选择一个进行访问
客户端负载均衡器
- 核心机制:将负载均衡功能以"库"的形式集成到客户端,而非依赖集中的硬件设备
- 工作流程:客户端(如 Ribbon)从注册中心(如 Eureka)获取服务列表,在发送请求前通过算法自主选择目标服务器
- 技术演进 :早期的默认实现 Ribbon 已停止维护,最新版本的 Spring Cloud 已替换为官方维护的 Spring Cloud LoadBalance
Spring cloud LoadBalancer(客户端负债均衡器)
1.添加注解
在 config 中添加注解@LoadBalanced
@Configuration
public class BeanConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
2.修改远程调用代码 , 把 ip 和端口号改成应用名
删除获取 url 的 代码 , 改为最原始的形式 , 并将 ip 和端口号改为应用名
// 改版Spring cloud LoadBalancer
@RequestMapping("/{orderId}")
public OrderInfo selectOrderById (@PathVariable("orderId") Integer orderId){//从请求url中获取参数
OrderInfo info = orderService.selectOrderById(orderId);
String url = "http://product-service/product/"+info.getProductId();
log.info("远程调用的url:"+url);
ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);
info.setProductInfo(productInfo);
return info;
}}

负债均衡策略
- 轮询(Round Robin):轮询策略是指服务器轮流处理用户的请求。这是一种实现最简单,也最常用的策略。生活中也有类似的场景,比如学校轮流值日,或者轮流打扫卫生
- 随机选择(Random):随机选择策略是指随机选择一个后端服务器来处理新的请求
自定义负债均衡策略
参考官网
Spring Cloud LoadBalancer :: Spring Cloud Commons
复制官网代码
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;
public class CustomLoadBalancerConfiguration {
@Bean
ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
LoadBalancerClientFactory loadBalancerClientFactory) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
return new RandomLoadBalancer(loadBalancerClientFactory
.getLazyProvider(name, ServiceInstanceListSupplier.class),
name);
}
}
配置@LoadBalancerClient
name : 对哪个服务运用负载均衡
configuration : 使用哪个负载均衡策略实现
@LoadBalancerClient(name = "product-service",configuration = CustomLoadBalancerConfiguration.class)
@Configuration
public class BeanConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}