前言
使用最新版本技术栈实践
版本
JDK版本: Oracle OpenJDK version 19.0.2
nacos客户端: 2.2.3
SpringBoot: 3.0.6
SpringCloud: 2022.0.1
其他依赖:
SpringBoot和SpringCloud版本对应关系
具体实现
nacos客户端
单机启动命令
startup.cmd -m standalone
SpringBoot
提供服务者
application.yml of 提供服务者
spring:
application:
name: user-service
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: SH
使用服务者
application.yml of 使用服务者
spring:
application:
name: order-service
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: SH
在配置类中向容器注入RestTemplate的Bean
@Configuration
public class RestTemplateConfig {
/**
* 创建RestTemplate并注入spring容器
**/
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
在配置类中注入负载均衡策略1(@Autowired有error没有关系,在启动类上使用@LoadBalancerClients的configuration 属性加载此配置类)
public class LoadBalancerConfig {
@Autowired
private NacosDiscoveryProperties nacos;
/**
* 负载均衡策略
* RandomLoadBalancer 随机
* RoundRobinLoadBalancer 轮询
* NacosLoadBalancer 优先同集群,再随机
**/
@Bean
ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
LoadBalancerClientFactory loadBalancerClientFactory) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
// return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
// return new RoundRobinLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
return new NacosLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name,nacos);
}
启动类
@SpringBootApplication
@MapperScan("com.example.mapper")
@LoadBalancerClients(value = {
@LoadBalancerClient(name = "user-service",configuration = LoadBalancerConfig.class),
})
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
}
结语
完成了基于nacos的集群优先的负载均衡策略的实现
其他:
nacos相对于eureka除了能够实现服务的注册和发现还有其他更多丰富功能,应用更广
使用ribbon有7种实现了IRule接口的负载均衡策略
springcloud 2020.0.x版本移除ribbon,springcloud推荐使用loadbalancer替换ribbon
在ReactorLoadBalancer接口类中通过CTRL+h查看其有三个实现类 ↩︎