Ribbon客户端负载均衡

Ribbon实现客户端负载均衡

Ribbon与Eureka配合使用,Ribbon从Eureka Server获取服务提供者列表,基于某种负载均衡算法,请求其中一个服务提供者的实例。
复制micro-service-consumer工程,改名为micro-service-consumer-ribbon,由于eureka中已经包含了ribbon的依赖,因此不需要添加新的依赖。
需要注意的是,启动类配置RestTemplate需要加上@LoadBalanced注解。

@SpringBootApplication
@EnableEurekaClient
public class MicroServiceConsumerRibbonApplication {

	@Bean
	@LoadBalanced
	public RestTemplate restTemplate() {
		return new RestTemplate();
	}

	public static void main(String[] args) {
		SpringApplication.run(MicroServiceConsumerRibbonApplication.class, args);
	}
}

修改Controller层代码:
logUserInstance方法,loadBalancerClient使用choose()方法获取当前选择的微服务节点,多次请求该方法,查看控制台打印的日志。

Autowired
    private LoadBalancerClient loadBalancerClient;
    
 @GetMapping("/log-instance")
    public void logUserInstance() {
        ServiceInstance serviceInstance = this.loadBalancerClient.choose("micro-service-provider");
        System.out.println(serviceInstance.getServiceId()+","+serviceInstance.getHost()+","+serviceInstance.getPort());
    }

Java代码自定义Ribbon配置

创建Ribbon的配置类: 修改Ribbon的负载均衡规则。

/**
 * Description: Ribbon配置类
 * 注意:该类不应该在主应用程序上下文的@ComponentScan中
 * Author:
 * Date:2019/1/23
 */
@Configuration
public class RibbonCustomConfiguration {

    @Bean
    public IRule ribbonRule() {
        // 负载均衡规则改为随机
       return new RandomRule();
    }
}

使用@RibbonClient为特定name的Ribbon Client自定义配置。

/**
 * Description: 使用Java代码自定义Ribbon配置
 * Author:
 * Date:2019/1/24
 */
@Configuration
@RibbonClient(name="micro-service-provider", configuration=RibbonCustomConfiguration.class)
public class TestConfiguration {
}

以上的配置RibbonCustomConfiguration 不在主应用程序上下文的@ComponentScan中,若在的话则该配置会被所有的@RibbonClient共享,代码结构如下图所示。
在这里插入图片描述
RibbonCustomConfiguration在主应用程序上下文的@ComponentScan中的情况:
项目的结构如下图所示:
在这里插入图片描述
创建ExcludeFromComponentScan自定义注解:

/**
 * Description: 自定义注解
 * 若 RibbonCustomConfiguration在com.fanfan.cloud路径下则需要这个注解,
 * 以及启动类的@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = ExcludeFromComponentScan.class)})
 * Author:
 * Date:2019/1/25
 */
public @interface ExcludeFromComponentScan {
}

RibbonCustomConfiguration配置类:

/**
 * Description: Ribbon配置类
 * 方式二:
 * 注意:该类若在主应用程序上下文的@ComponentScan中,则需要@ExcludeFromComponentScan注解
 * 使用Java代码自定义Ribbon配置
 * Author:
 * Date:2019/1/23
 */
@Configuration
@ExcludeFromComponentScan
public class RibbonCustomConfiguration {

    @Bean
    public IRule ribbonRule() {
        // 负载均衡规则改为随机
       return new RandomRule();
    }
}

启动类:

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name="micro-service-provider", configuration= RibbonCustomConfiguration.class)
 // 指定ComponetScan Exclude的路径,只作用于一个RibbonClient
@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = ExcludeFromComponentScan.class)})
public class MicroServiceConsumerRibbonCustomApplication {

	@Bean
	@LoadBalanced
	public RestTemplate restTemplate() {
		return new RestTemplate();
	}

	public static void main(String[] args) {
		SpringApplication.run(MicroServiceConsumerRibbonCustomApplication.class, args);
	}
}

使用属性自定义Ribbon配置

在application.yml中添加如下的配置即可。

# 使用属性自定义Ribbon配置
microservice-provider:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RamdomRule

以上是使用Java配置类和配置文件的方式实现负载均衡。

脱离Eureka使用Ribbon

创建micro-service-consumer-ribbon-without-eureka,pom文件如下:注意直接使用ribbon的依赖而不是eureka的依赖。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<artifactId>micro-service-consumer-ribbon-without-eureka</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<!-- 引入parent的依赖 -->
	<parent>
		<groupId>com.fanfan.cloud</groupId>
		<artifactId>micro-service-spring-cloud-study</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-ribbon</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
	</dependencies>

	<build>
		<finalName>consumer-ribbon-without-eureka</finalName>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

application.yml文件如下:

server:
  port: 7903


spring:
  application:
    name: cunsumer-ribbon-custom
micro-service-provider:
  ribbon:
   listOfServers: localhost:8010,localhost:8011

启动类上去掉@EnableEurekaClient注解:

@SpringBootApplication
public class MicroServiceConsumerRibbonWithoutEurekaApplication {

	@Bean
	@LoadBalanced
	public RestTemplate restTemplate() {
		return new RestTemplate();
	}

	public static void main(String[] args) {
		SpringApplication.run(MicroServiceConsumerRibbonWithoutEurekaApplication.class, args);
	}
}

不过一般很少有这样使用的,了解即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值