【SpringCloud】(六):Ribbon實現客戶端負載均衡

00潤物無聲00發表於2017-08-13

  前面文章中已經將服務註冊到了Eureka,但是還沒有解決請求地址硬編碼和負載均衡的問題。

  這邊文章,我們講述使用Ribbon完成請求以及負載均衡。讓電影微服務呼叫使用者微服務的時候,解決請求地址和埠的硬編碼

  實現負載均衡
    1.伺服器端負載均衡:使用Nginx,由Nginx完成反向代理,實現負載均衡。
    2.客戶端負載均衡:電影微服務中有某個元件(Ribbon),可以知道有多少個可用的使用者微服務的IP和埠,在元件中完成負載均衡演算法。




Ribbon實現客戶端負載均衡。

http://cloud.spring.io/spring-cloud-static/Camden.SR7/#netflix-ribbon-starter


Client Side Load Balancer: Ribbon



Ribbon 工作分為2步:

  1.選擇Eureka Server,優先選擇在同一Zone且負載較少的Server.

  2.根據使用者指定的策略,在從Server取到的服務註冊列表中選擇一個地址。

策略包括:輪詢,隨機,響應時間加權。




1.加入依賴

  在Spring-cloud-start-Eureka的依賴中已經依賴了spring-cloud-starter-ribbon.所以不用新增依賴

2.使用註解@LoadBalanced


程式碼實現:

只需要修改電影微服務即可。

我們通過拷貝,修改前面程式碼的電影微服務。重新建立了一個電影微服務:microservice-comsumer-movie-ribbon


1.主要是在RestTemplate上加入了@LoadBalanced,讓restTemplate具備Ribbon負載均衡的能力。

啟動類:

package com.dynamic.cloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableEurekaClient
public class ComsumerMovieRibbonApplication {

	@Bean
	@LoadBalanced//讓restTemplate具備Ribbon負載均衡的能力。
	public RestTemplate restTemplate()
	{
		return new RestTemplate();
	}
	
	public static void main(String[] args) {
		SpringApplication.run(ComsumerMovieRibbonApplication.class, args);
	}
}

2.修改MovieController中的使用者微服務地址,修改硬編碼為Eureka上註冊的服務的ServicId,即使用者微服務的application.name;


package com.dynamic.cloud.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import com.dynamic.cloud.entity.User;

@RestController
public class MovieController {
	@Autowired
	private RestTemplate restTemplate;
	
	
	@GetMapping("/movie/{id}")
	public User findById(@PathVariable Long id)
	{
		//http://localhost:7900/simple/
		//VIP Virtual IP:虛擬IP,使用的是服務提供者的ServiceId,也就是application.name
		//HAProxy HeartBeat
		//microservice-provider-user:7900
		return this.restTemplate.getForObject("http://microservice-provider-user/simple/"+id, User.class);
	}

}

3.application.yml

server:
  port: 7902

spring:
  application:
    name: microservice-comsumer-movie-ribbon
  
eureka:
  client:
    serviceUrl:
      defaultZone: http://user:pass123@localhost:8761/eureka
  instance: 
    prefer-ip-address: true
    instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}}

啟動Eureka,電影微服務,2個使用者微服務。


  

實現了客戶端負載均衡。





相關文章