1. 程式人生 > >SpringCloud實戰七:Spring Cloud Ribbon 實戰

SpringCloud實戰七:Spring Cloud Ribbon 實戰

前面的兩篇部落格已經講解了Feign作為服務間的呼叫,但是Feign是整合、封裝了Ribbonn這個元件而來的,讓服務間的呼叫更方便,因此大多使用Feign,本篇讓大家瞭解Ribbon的概念與呼叫

Ribbon是Netflix開發的一個負載均衡元件,它在服務體系中起著重要作用,Pivotal將其整合成為Spring Cloud Ribbon,與其他SpringCloud元件結合可以發揮出強大作用,它的負載策略有多種,預設輪詢,可配置超時重試

說到負載均衡,Ribbon與Lvs、Nginx不一樣,nginx是服務端負載均衡,Ribbon是客戶端負載均衡,具體表現為客戶端從註冊中心拿到服務的所有例項,然後以負載均衡方式去呼叫服務,預設以輪詢的方式去呼叫服務例項

程式碼實戰

實戰思路:1.啟用註冊中心,2.建立服務提供者,服務提供者至少啟動兩個節點,3.建立服務消費者,以restTemplate的方式呼叫服務提供者,檢視ribbon元件是否以負載均衡的方式呼叫服務提供者

1.啟動之前部落格中的Eureka註冊中心
2.建立一個maven專案,再建立服務提供者
  • 服務提供者很簡單,只需要引入下面依賴:
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
  • 在主類上啟用@EnableDiscoveryClient
  • 在配置檔案中配置好註冊中心地址
server.port=9600
spring.application.name=provider-service
eureka.instance.prefer-ip-address=true
#配置eureka-server security的賬戶資訊
eureka.client.serviceUrl.defaultZone=http://zy:[email protected]:10025/eureka/
  • 建立控制器,提供服務,返回埠資訊
@RestController
public class IndexController {

    @GetMapping("/hello")
    public String hello(String name , HttpServletRequest request){
        //返回埠資訊
        return " From Port : " + request.getServerPort() + " , hello " + name;
    }
}

服務提供者打包,定位到jar包目錄,使用如下命令,啟用兩個節點,訪問一下看看是否正常
java -jar provider-service-0.0.1-SNAPSHOT.jar --server.port=9600
java -jar provider-service-0.0.1-SNAPSHOT.jar --server.port=9601
在這裡插入圖片描述
兩個服務提供者節點都正常

3.建立ribbon服務消費者
  • 服務消費者比服務提供者多引入一個依賴:spring-cloud-starter-netflix-ribbon
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
  • 在主類上啟用@EnableDiscoveryClient,同時新增一個Bean
    /**
	 * 新增LoadBalanced,使RestTemplate以負載均衡的方式呼叫服務
	 * @return
	 */
	@Bean
	@LoadBalanced
	public RestTemplate restTemplate(){
		return new RestTemplate();
	}
  • 在配置檔案中配置好註冊中心地址,埠為9500,例項名為ribbon-service,其它配置都一樣
server.port=9500
spring.application.name=ribbon-service
eureka.instance.prefer-ip-address=true
#配置eureka-server security的賬戶資訊
eureka.client.serviceUrl.defaultZone=http://zy:[email protected]:10025/eureka/
  • 新增一個控制器,注入RestTemplate,訪問服務提供者
@RestController
public class IndexController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/sayHello")
    public String sayHello(String name){
        String url = "http://provider-service/hello?name=" + name;
        String result = restTemplate.getForObject(url , String.class);
        return result;
    }
}
  • 啟動服務消費者,檢視註冊中心,可以看到服務提供者有2個節點9600、9601,服務消費者一個節點9500
    在這裡插入圖片描述
  • 訪問服務消費者,驗證服務呼叫是否以負載均衡方式
    第一次訪問,呼叫了9600埠的服務提供者
    在這裡插入圖片描述
    第二次訪問,呼叫了9601埠的服務提供者
    在這裡插入圖片描述

OK,Ribbon預設使用輪詢方式呼叫服務
下面說說怎麼使用其他方式,也就是其他負載均衡策略呼叫服務和配置超時重試
ribbon有7種策略,隨機、輪詢、最小併發、響應時間加權等策略,其它自行百度
在專案中使用也很簡單,定義一個config類,新增一個bean,指明使用什麼策略,程式碼如下:

/**
 * ribbon負載均衡配置
 */
@Configuration
public class RibbonLBConfig {

    //使用隨機策略
    @Bean
    public IRule ribbonRule(){
        return new RandomRule();
    }
}

超時與重試,只需在配置檔案中配置

#請求處理的超時時間
ribbon:
  # 同一例項最大重試次數,不包括首次呼叫
  MaxAutoRetries: 1
  # 重試其他例項的最大重試次數,不包括首次所選的server
  MaxAutoRetriesNextServer: 2
  # 是否所有操作都重試
  OkToRetryOnAllOperations: false
  # 是否所有操作都進行重試
  ReadTimeout: 10000
  ConnectTimeout: 10000

程式碼已上傳至碼雲,原始碼,專案使用的版本資訊如下:

  • SpringBoot 2.0.6.RELEASE
  • SpringCloud Finchley.SR2(非常新的版本)