第一种方案:通过配置文件application.yml
第一步:创建项目
参考 nacos入门案例的《第三部分:编写订单服务》拷贝一份,修改项目名为:order-ribbon第二步:创建自定义rule
package com.example.rule;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
public class CustomRule extends AbstractLoadBalancerRule {
public void initWithNiwsConfig(IClientConfig iClientConfig) {
}
public Server choose(Object o) {
//这里实现自定义负载均衡器
System.out.println("自定义负载均衡");
ILoadBalancer loadBalancer = this.getLoadBalancer();
//获取当前请求的服务的实例
List<Server> reachableServers = loadBalancer.getReachableServers();
int random = ThreadLocalRandom.current().nextInt(reachableServers.size());
Server server = reachableServers.get(random);
return server;
}
}
第三步:修改配置文件
server:
port: 8084
#应用名称(nacos会将该名称当做服务名称)
spring:
application:
name: order-service
cloud:
nacos:
server-addr: 127.0.0.1:8848
discovery:
username: nacos
password: nacos
namespace: public
#提供者微服务名
stock-service:
ribbon:
#指定使用Nacos提供的负载均衡策略(优先调用同一集群的实例,基于随机&权重)
NFLoadBalancerRuleClassName: com.example.rule.CustomRule
第四步:启动测试,发现是随机的
第二种方案:通过配置类
第一步:创建项目
参考 nacos入门案例的《第三部分:编写订单服务》拷贝一份,修改项目名为:order-ribbon第二步:创建自定义rule
package com.example.rule;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
public class CustomRule extends AbstractLoadBalancerRule {
public void initWithNiwsConfig(IClientConfig iClientConfig) {
}
public Server choose(Object o) {
//这里实现自定义负载均衡器
System.out.println("自定义负载均衡");
ILoadBalancer loadBalancer = this.getLoadBalancer();
//获取当前请求的服务的实例
List<Server> reachableServers = loadBalancer.getReachableServers();
int random = ThreadLocalRandom.current().nextInt(reachableServers.size());
Server server = reachableServers.get(random);
return server;
}
}
第三步:创建配置类
注意有坑,不能放在@ComponentScan能扫描到的地方,否则全部服务实例均为该负载均衡策略
package com.example.ribbon;
import com.example.rule.CustomRule;
import com.netflix.loadbalancer.IRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RibbonRandomRuleConfig {
//方法名一定要叫iRule
@Bean
public IRule iRule(){
return new CustomRule();
}
}
第四步:application.yml
server:
port: 8084
#应用名称(nacos会将该名称当做服务名称)
spring:
application:
name: order-service
cloud:
nacos:
server-addr: 127.0.0.1:8848
discovery:
username: nacos
password: nacos
namespace: public
第五步:修改启动类
package com.example.order;
import com.example.ribbon.RibbonRandomRuleConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
//---------------------第一种方案:配置类---------------------------------------------------------------
//name属性是服务名,configuration属性是指该服务的负载均衡机制为该配置类修改的负载均衡机制
//表示stock-service服务实例使用RibbonRandomRuleConfig配置类配置的负载均衡机制,这里是随机机制
@RibbonClients(value = {
@RibbonClient(name = "stock-service",configuration = RibbonRandomRuleConfig.class)
})
//------------------------------------------------------------------------------------
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class,args);
}
@Bean
@LoadBalanced //负载均衡
/**
* 默认的负载均衡机制采用的类似轮询的这种均衡机制
*/
public RestTemplate restTemplate(RestTemplateBuilder builder){
//spring官网建议RestTemplateBuilder构造器来进行构造,这里体现了构造者设计模式
return builder.build();
}
}
第六步:启动测试,发现是随机
解决负载均衡懒加载
Ribbon默认懒加载,意味着只有在发起第一次调用的时候才会创建客户端。 在进行服务调用的时候,如果网络情况不好,第一次调用会超时。访问http://localhost:8084/order/add才会出现如下图
解决方案:使用饥饿加载
在order-ribbon配置文件application.yml加上
##解决懒加载
ribbon:
eager-load:
#开启ribbon饥饿加载
enabled: true
#配置stock-service使用ribbon饥饿加载,多个使用逗号分隔
clients: stock-service
解决懒加载重启order-ribbon
在一启动时就出现了