四(1)、springcloud之Ribbon初步配置

1、概述

​ Spring Cloud Ribbon是基於Netflix Ribbon實現的一套客戶端 -負載均衡的工具。Ribbon是Netflix發佈的開源項目,主要功能是提供客戶端的軟件負載均衡算法,將Netflix的中間層服務連接在一起。Ribbon客戶端組件提供一系列完善的配置項如連接超時,重試等。簡單的說,就是在配置文件中列出Load Balancer(簡稱LB)後面所有的機器,Ribbon會自動的幫助你基於某種規則(如簡單輪詢,隨機連接等)去連接這些機器。我們也很容易使用Ribbon實現自定義的負載均衡算法。

LB:,即負載均衡(Load Balance),在微服務或分佈式集羣中經常用的一種應用。負載均衡簡單的說就是將用戶的請求平攤的分配到多個服務上,從而達到系統的HA。常見的負載均衡有軟件Nginx,LVS,硬件 F5等。相應的在中間件,例如:dubbo和SpringCloud中均給我們提供了負載均衡,SpringCloud的負載均衡算法可以自定義。

  • 集中式LB:即在服務的消費方和提供方之間使用獨立的LB設施(可以是硬件,如F5, 也可以是軟件,如nginx), 由該設施負責把訪問請求通過某種策略轉發至服務的提供方;
  • 進程內LB: 將LB邏輯集成到消費方,消費方從服務註冊中心獲知有哪些地址可用,然後自己再從這些地址中選擇出一個合適的服務器。Ribbon就屬於進程內LB,它只是一個類庫,集成於消費方進程,消費方通過它來獲取到服務提供方的地址。

2、配置Ribbon

修改microservicecloud-consumer-dept-80工程修改如下:

1)修改pom文件,添加Ribbon依賴:

<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>
  <parent>
    <groupId>com.jiatp.springcloud</groupId>
    <artifactId>microservicecloud</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>microservicecloud-consumer-dept-80</artifactId>
  <description>部門微服務消費者</description>
  
  <dependencies>
   <dependency><!-- 自己定義的api -->
     <groupId>com.jiatp.springcloud</groupId>
     <artifactId>microservicecloud-api</artifactId>
     <version>${project.version}</version>
   </dependency> 
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
   <!-- 修改後立即生效,熱部署 -->
  <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>springloaded</artifactId>
     <version>1.2.6.RELEASE</version>
   </dependency>
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-devtools</artifactId>
   </dependency>
   <!-- Ribbon相關 -->
   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
   </dependency>
   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
   </dependency>
   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-config</artifactId>
   </dependency>
  </dependencies>
</project>

2)修改yml,追加eureka的服務註冊地址:

server:
  port: 80             # 消費者的端口80
  
eureka:
  client:
    register-with-eureka: false
    service-url: 
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

3)添加ConfigBean配置類,使用@LoadBalanced註解開啓負載均衡

package com.jiatp.springcloud.cfgbeans;

import java.lang.reflect.Method;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;

@Configuration
public class ConfigBean {  //優化spring,從spring(applicationContext.xml)== @Configuration配置 
	
	@Bean
	@LoadBalanced    //開啓負載聚哼
    public RestTemplate restTemplate(){

        return new RestTemplate();
    }
	
} 

在這裏插入圖片描述

對應spring.application.name 微服務名字

4)主啓動類DeptConsumer80_App添加@EnableEurekaClient

 
@SpringBootApplication
@EnableEurekaClient
public class DeptConsumer80_App
{
  public static void main(String[] args)
  {
   SpringApplication.run(DeptConsumer80_App.class, args);
  }
}

5)修改DeptController_Consumer客戶端controller

@RestController
public class DeptController_Consumer
{
  //private static final String REST_URL_PREFIX = "http://localhost:8001";
  private static final String REST_URL_PREFIX = "http://MICROSERVICECLOUD-DEPT";
  
  @Autowired
  private RestTemplate restTemplate;
  
  @RequestMapping(value="/consumer/dept/add")
  public boolean add(Dept dept)
  {
   return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add", dept, Boolean.class);
  }
  
  @RequestMapping(value="/consumer/dept/get/{id}")
  public Dept get(@PathVariable("id") Long id)
  {
   return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id, Dept.class);
  }
  
  @SuppressWarnings("unchecked")
  @RequestMapping(value="/consumer/dept/list")
  public List<Dept> list()
  {
   return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list", List.class);
  } 
  
  //測試@EnableDiscoveryClient,消費端可以調用服務發現
  @RequestMapping(value="/consumer/dept/discovery") 
  public Object discovery()
  {
   return restTemplate.getForObject(REST_URL_PREFIX+"/dept/discovery", Object.class);
  }  
  
}
 

啓動測試:順序先啓動3個eureka集羣后,再啓動microservicecloud-provider-dept-8001並註冊進eureka,再啓動microservicecloud-consumer-dept-80,瀏覽器輸入http://localhost/consumer/dept/list

在這裏插入圖片描述
總結:Ribbon和Eureka整合後Consumer可以直接調用服務而不用再關心地址和端口號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章