02.Spring Cloud Ribbon负载均衡

Spring Cloud Ribbon

1.负载均衡示例

新建三个项目,一个注册中心(A),一个提供服务的client(B),一个消费服务的client(C)。配置好并启动,B在不同端口启动多份。这样就有了一个注册中心A,服务提供client B集群,和一个消费服务client c。在c中获取B服务:

@RestController
public class UserController {
	
	@Autowired
	private LoadBalancerClient client;
	
	@GetMapping("/log")
	public String log() {
		return "当前打印的节点:" +client.choose("provider").getInstanceId();
	}

}

client.choose(“provider”)这个方法回去获取provider服务,启动项目访问/log请求,会打印当前请求的具体是哪个服务。测试发现发现 负载均衡 的实现方式是轮询的方式去请求服务。

2.修改负载均衡策略

方式一:代码配置

配置负载均衡规则为 随机, RibbonConfiguration不能被@ComponentScan扫描,否则全部都会应用这个规则

@Configuration
public class RibbonConfiguration {
	
	@Bean
	public IRule ribbonRule() {
		// 配置负载均衡规则为 随机
		return new RandomRule();
	}

}

@RibbonClient设置为某一个服务启动指定的负载均衡策略:

@Configuration
// 指定provider服务使用RibbonConfiguration配置的策略(provider是服务名client.choose("provider"))
@RibbonClient(name = "provider", configuration=RibbonConfiguration.class)
public class TestConfiguration {
	

}

重启项目,访问/log,会发现此时访问的服务是随机的。
@SpringBooApplication配置了扫描这个类路径及其以下的所有组件。RibbonConfiguration 这个不应该被扫描(如果全部应用这个规则,就不需要@RibbonClient这个来指定哪个服务调用用哪个规则)。

方式二:配置方式

#provider是服务名
provider:
 ribbon:
 # 自定义规则
   NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

内置算法

RoundRobinRule: 轮询
RandomRule: 随机
AvailabilityFilteringRule: 过滤故障熔断跳闸状态的服务,并发连接的数量超过阈值的服务,剩下的轮询
WeightedResponseTimeRule: 根据平均响应时间计算权重,响应时间越快服务权重越大被选中的概率越高,权重信息不足(如刚启动时),采用轮询策略
RetryRule: 先采用轮询策略,如果获取服务失败则在指定时间内会进行重试,获取可用服务
BestAvailableRule: 过滤多次访问故障服务,访问并发量小的服务
ZoneAvoidanceRule: 默认规则,复合判断server所在区域的性能和server的可用性选择服务器

3.在没有Eureka的情况下使用Ribbon

新建工程,提供服务,pom文件:

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

	<!--打包执行,要加这个-->
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

application.yml中配置:

spring:
  application:
    name: common-service
    

就一个spring boot的web工程就可以了,创建好启动类,就打包,然后执行打包好 的jar包,使其分别运行在9000和9001端口。
新建工程,使用ribbon调用服务:
pom文件:

<dependencies>
	<!--提供web支持-->
  	<dependency>
  		<groupId>org.springframework.boot</groupId>
  		<artifactId>spring-boot-starter-web</artifactId>
  	</dependency>
  	<!--导入ribbon-->
  	<dependency>
  		<groupId>org.springframework.cloud</groupId>
  		<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
  	</dependency>
  </dependencies>

启动类:

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

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

调用服务:

@RestController
public class UserController {

	@Autowired
	private LoadBalancerClient client;
	
	@GetMapping("/info")
	public String getInfo() {
		return client.choose("common-service").getInstanceId();
	}
	
}

application.yml配置:

# 通过这种方式指定服务
common-service:
  ribbon:
    listOfServers: http://localhost:9000,localhost:9001
    
server:
  port: 9000

启动项目 ,访问localhost:9000/info,就能发现服务是轮询调用的,也就是ribbon的负载均衡生效了。

猜你喜欢

转载自blog.csdn.net/qq122516902/article/details/85124381