微服务Spring Cloud (二)远程调用 Ribbon

转载请表明出处 https://blog.csdn.net/Amor_Leo/article/details/87875269 谢谢

Spring Cloud Ribbon 概述

Spring Cloud Ribbon 是一个基于Http和TCP的客服端负载均衡工具,它是基于Netflix Ribbon实现的。它提供了很多负载均衡算法,例如轮询、随机等,在配置服务提供者地址后,可以将服务消费者请求按照负载均衡算法进行分发。
它主要包括六个组件:

  • ServerList:负载均衡使用的服务器列表.这个列表会缓存在负载均衡器中,并定期更新.当Ribbon与Eureka结合使用时,ServerList的实现类就是DiscoveryEnabledNIWSServerList,它会保存Eureka Server中注册的服务实例表.
  • ServerListFilter:服务器列表过滤器.这是一个接口,主要用于对Service Consumer获取到的服务器列表进行预过滤,过滤的结果也是ServerList.Ribbon提供了多种过滤器的实现.
  • IPing:探测服务实例是否存活的策略.
  • IRule:负载均衡策略,其实现类表述的策略包括:轮询、随机、根据响应时间加权等.我们也可以自己定义负载均衡策略,比如我们就利用自己实现的策略,实现了服务的版本控制和直连配置.实现好之后,将实现类重新注入到Ribbon中即可.
  • ILoadBalancer:负载均衡器.这也是一个接口,Ribbon为其提供了多个实现,比如ZoneAwareLoadBalancer,而上层代码通过调用其API进行服务调用的负载均衡选择.一般ILoadBalancer的实现类中会引用一个IRule.
  • RestClient:服务调用器.顾名思义,这就是负载均衡后,Ribbon向Service Provider发起REST请求的工具.

Ribbon提供的主要负载均衡策略介绍:

  1. 简单轮询负载均衡(RoundRobin): 以轮询的方式依次将请求调度不同的服务器,即每次调度执行i = (i + 1) mod n,并选出第i台服务器。
  2. 随机负载均衡 (Random): 随机选择状态为UP的Server。
  3. 加权响应时间负载均衡 (WeightedResponseTime): 根据相应时间分配一个weight,相应时间越长,weight越小,被选中的可能性越低。
  4. 区域感知轮询负载均衡(ZoneAvoidanceRule): 复合判断server所在区域的性能和server的可用性选择server。

Spring Cloud Ribbon 搭建

  • pom (Eureka里包含Ribbon)
		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-actuator</artifactId>
	    </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
  • yml
spring:
  application:
    name: consumer-service
server:
  port: 8080
eureka:
  client:
    service‐url:
      defaultZone: http://localhost:8761/eureka
  instance:
    prefer‐ip‐address: true  #访问路径可以显示ip地址
  • Application 类
@EnableDiscoveryClient
@SpringBootApplication
public class Application {
  @Bean
  @LoadBalanced
  public RestTemplate restTemplate() {
    return new RestTemplate();
  }

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}
  • Controller
    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private LoadBalancerClient loadBalancerClient;

	@GetMapping("/get/provider/test")
	public String rpc() {                  
		String forObject = restTemplate.getForObject("http://PROVIDER-SERVICE/test", String.class);
		return forObject;
	}

    @GetMapping("/log-user-instance")
    public void logUserInstance() {
    	ServiceInstance serviceInstance = this.loadBalancerClient.choose("PROVIDER-SERVICE");
    	// 打印当前选择的是哪个节点
 	   MovieController.LOGGER.info("{}:{}:{}", serviceInstance.getServiceId(), serviceInstance.getHost(), serviceInstance.getPort());
  • 如果要修改负载均衡算法
spring:
  application:
    name: consumer-service
server:
  port: 8080
eureka:
  client:
    service‐url:
      defaultZone: http://localhost:8761/eureka
  instance:
    prefer‐ip‐address: true  #访问路径可以显示ip地址
provider-service:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

< ClientName >.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
在这里插入图片描述

  • 如果不添加eureka依赖
  • pom
		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-actuator</artifactId>
	    </dependency>
  		<dependency>
    		<groupId>org.springframework.cloud</groupId>
    		<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
  		</dependency>
  • yml
spring:
  application:
    name: consumer-service
server:
  port: 8080
provider-service:
  ribbon:
    listOfServers: localhost:8000,localhost:8001
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章