Ribbon负载均衡服务器多个配置类的使用

本文会使用到的注解有:@LoadBalanced,@RibbonClient,如果还不了解请自行去弄懂,本文只通过完整项目案例来阐述用法。

那么现在我有一个需求,如上图所示,该如何实现呢?
重点代码都在Ribbon服务器里,那我们来看看Ribbon项目的结构:

其中:
RibbonConfig、UserController、ServiceHiRibbonConfiguration对应的是user服务器的负载均衡。
RibbonConfig2、OrderController、ServiceHiRibbonConfiguration2对应的是user服务器的负载均衡。

让我们由下至上来讲解
最底下的是ServiceHiRibbonConfiguration和ServiceHiRibbonConfiguration2。

ServiceHiRibbonConfiguration:

package config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RoundRobinRule;


@Configuration
public class ServiceHiRibbonConfiguration {
	
	@Bean
	public IRule hiRule() {
		// user服务器的负载均衡采用轮询算法
		return new RoundRobinRule();
	}
}

ServiceHiRibbonConfiguration2:

package config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;

@Configuration
public class ServiceHiRibbonConfiguration2 {
	
	@Bean
	public IRule hiRule() {
		// order服务器的负载均衡采用随机算法
		return new RandomRule();
	}
}

注意:该配置类的包路径一定不能被@SpringBootApplication扫描到,原因自行百度。

可以看到,ServiceHiRibbonConfiguration和ServiceHiRibbonConfiguration2确定的是负载均衡算法,那么Ribbon怎么知道这两种算法分别对应哪个服务器呢,答案就在下面:
来看看RibbonConfig和RibbonConfig2,这两个类同样是配置类。

@Configuration
@RibbonClient(name = "user-service",configuration = ServiceHiRibbonConfiguration.class)
public class RibbonConfig {
}
@Configuration
@RibbonClient(name = "order-service",configuration = ServiceHiRibbonConfiguration2.class)
public class RibbonConfig2 {
}

这两个类只有配置作用,相当于配置文件,所以都是空的,重点在
@RibbonClient注解上。
@RibbonClient有两个参数
name:对应的服务的名字(在对应服务的yml或application文件中配置的)。
configuration:该服务对应的配置类。

所以可以看出来,就是这个注解将微服务和配置类关联了起来,实际上这个注解所在类只起到了“中间人”的作用。

那么上文所述就是多配置类和单配置类时的唯一区别了。
其实在单配置类(即只有一个微服务的情况下)的时候,@RibbonClient注解可以直接写在main方法所在的类上(也就是@SpringBootApplication所在的类上),而不需要新建一个配置类,然后再在这个类上添加@RibbonClient注解来达到配置文件的作用,如下:

@SpringBootApplication
@EnableDiscoveryClient
// 假设唯一的微服务是user
@RibbonClient(name = "user-service",configuration = ServiceHiRibbonConfiguration.class)
public class SpringcloudRibbonServerApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringcloudRibbonServerApplication.class, args);
	}
	
	@Bean
	@LoadBalanced
	public RestTemplate restTemplate() {
		return new RestTemplate();
	}
	
}

再偷懒一点,在单微服务的情况下,甚至都不需要新建一个配置类用来指定负载均衡算法,直接在主类里写一个方法,附上@Bean注解即可,如下:

@SpringBootApplication
@EnableDiscoveryClient

public class SpringcloudRibbonServerApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringcloudRibbonServerApplication.class, args);
	}
	
	@Bean
	public IRule ribbonRule() {
		return new RoundRobinRule(); // 采用轮询算法
	}
	
	@Bean
	@LoadBalanced
	public RestTemplate restTemplate() {
		return new RestTemplate();
	}
}

不过实际上这种情况很少见,因为微服务肯定不止一个

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值