服务器端负载均衡:
例如:Nginx,通过Nginx进行负载均衡,先发送请求,然后通过负载均衡算法,在多个服务器之间选择一个进行访问;即在服务器端再进行负载均衡算法分配。
客户端负载均衡:
例如:spring cloud中的ribbon,客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这是客户端负载均衡;即在客户端就进行负载均衡算法分配。
ribbon的默认负载均衡(轮询),当多次访问Eureka(注册中心)中同一个服务时(该服务有多个服务提供者),采用轮询方式,也可自定义配置。
自定义配置:
1、配置类置于启动类包扫描不到的位置。
/** * * 如果这个配置文件是一个全局的配置文件, 那么就把这个类放到SpringBootApplication或者是Compentscan能扫描到的包里面 * 如果是一个单独的配置, 把这个文件放到不能被上面两个注解扫描到的包,也就是当前类所在的包层级要比他们高,然后单独配置给每一个需要这个配置的负载均衡客户端即可 * */ @Configuration public class RibbonConfig { @Bean public IRule iRule() { return new RandomRule(); //随机 } }
2、排除包扫描,(自定义注解,排除扫描该类)
/**接口
*
* 我们当前的注解本身没有任何含义,就是一个特征标记
*
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Abcfdsfdsfdsfds {
}
//配置类
@Configuration @Abcfdsfdsfdsfds public class RibbonConfig { @Bean public IRule iRule() { return new RandomRule(); } }
//启动类
@SpringBootApplication @EnableDiscoveryClient //如果给多个服务开启负载均衡,通过下面的注解实现 @RibbonClients({@RibbonClient(name = "04PROVIDER-EUREKA", configuration = RibbonConfig.class),@RibbonClient(name = "04PROVIDER-EUREKA1")}) @ComponentScan(excludeFilters={@ComponentScan.Filter({Abcfdsfdsfdsfds.class})}) public class ConsumerStartApp { public static void main (String[] args){ SpringApplication.run(ConsumerStartApp.class,args); } @Bean @LoadBalanced//告诉template 注意有一些服务需要开启负载均衡,通过服务的名字可以访问 public RestTemplate template() { return new RestTemplate(); } }
3、通过配置文件 application.yml
server:
port: 10100
spring:
application:
name: 09consumer-eureka-riibon-config-properties
eureka:
client:
service-url:
defaultZone: http://localhost:12000/eureka
#给 04PROVIDER-EUREKA配置负载均衡的规则为 com.netflix.loadbalancer.RandomRule
04PROVIDER-EUREKA:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
@SpringBootApplication @EnableDiscoveryClient //@RibbonClient(name = "04PROVIDER-EUREKA",configuration = RibbonConfig.class)//给04PROVIDER-EUREKA服务开启负载均衡 //如果给多个服务开启负载均衡,通过下面的注解实现 @RibbonClients({@RibbonClient(name = "04PROVIDER-EUREKA"),@RibbonClient(name = "04PROVIDER-EUREKA1")}) public class ConsumerStartApp { public static void main (String[] args){ SpringApplication.run(ConsumerStartApp.class,args); } @Bean @LoadBalanced//告诉template 注意有一些服务需要开启负载均衡,通过服务的名字可以访问 public RestTemplate template() { return new RestTemplate(); } }
以上仅供参考。