一、loadbalancer实现负载均衡
新版本的nacos已经取消了对ribbon的支持,所以不能使用ribbon来实现nacos提供的负载均衡。
但是新版本中我们可以使用loadbalancer实现负载均衡。
二、导入loadbalancer坐标
1、原本的坐标:
在parent的pom.xml中
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.4</version>
<relativePath/>
</parent>
<!-- springCloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2023.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--nacos的管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2022.0.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
在继承parent的pom.xml中
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2、修改后添加的loadbalancer坐标
在继承parent的pom.xml中加入
<!-- nacos配置管理依赖包 -->
<!--负载均衡-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
三、默认轮询策略
在导入maven坐标后需要在启动类加入以下代码
/**
* 创建RestTemplate对象,并注入Spring容器中
* @return
*/
@Bean
@LoadBalanced//负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
注入bean对象,调用该对象即可实现负载均衡,但是实现的是默认的轮询策略,就是消费者会轮流使用提供者提供的方法。
下面是application.yml需要配置的nacos。
spring:
application:
name: orderservice #order服务的名称
cloud:
# 负载均衡配置
loadbalancer:
ribbon:
#禁用ribbon
enabled: false # 爆红黄线的话不设置也可以
nacos:
discovery:
server-addr: localhost:8848 #nacos服务地址
cluster-name: HZ #设置集群名称
默认是禁用ribbon的,所以ribbon那边配置不配置都行。
四、使用随机策略
参考官方文档:Cloud Native Applications
先建一个config包来放配置类:
注意:那个Environment是 org.springframework.core.env.Environment这个包下的
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);
}
}
在消费者的启动类上加上下面这个注解,这个是我们根据官方文档自定义的随机策略配置类对应的注解
@LoadBalancerClients(defaultConfiguration = {CustomLoadBalancerConfiguration.class})
//扫描mapper对应包
@MapperScan("com.bluefox.order.mapper")
@SpringBootApplication
// 使用@LoadBalanced注解赋予RestTemplate负载均衡的能力
//注入配置类,这个配置是我们自定义的策略--随机策略
@LoadBalancerClients(defaultConfiguration = {CustomLoadBalancerConfiguration.class})
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
/**
* 创建RestTemplate对象,并注入Spring容器中
* @return
*/
@Bean
@LoadBalanced//负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
五、集群
根据集群不同设置不同名字
spring:
application:
name: orderservice #order服务的名称
cloud:
# 负载均衡配置
loadbalancer:
ribbon:
#禁用ribbon
enabled: false # 爆红黄线的话不设置也可以
nacos:
discovery:
server-addr: localhost:8848 #nacos服务地址
cluster-name: HZ #设置集群名称
nacos:
discovery:
server-addr: localhost:8848 #nacos服务地址
cluster-name: HZ #设置集群名称
在 Nacos 中定义不同的分组(Group),用于区分不同的集群或服务,在LoadBalancer这个策略中似乎不能像NacosRule 的实现可以优先从同集群中挑选实例,并且支持同集群内的随机策略,就是同集群只访问同集群,所以可以用分组来区分。
nacos:
discovery:
server-addr: localhost:8848 #nacos服务地址
cluster-name: HZ #设置集群名称
group: HZ-group # 服务的分组名称
在集群这方面有不同见解欢迎指正啊!!!