springCloud學習-服務消費者(rest+ribbon)

一、ribbon簡介 git

  spring cloud的Netflix中提供了兩個組件實現軟負載均衡調用:ribbon和feign。github

Ribbon 是一個基於 HTTP 和 TCP 客戶端的負載均衡器web

它能夠在客戶端配置 ribbonServerList(服務端列表),而後輪詢請求以實現均衡負載spring

它在聯合 Eureka 使用時apache

ribbonServerList 會被 DiscoveryEnabledNIWSServerList 重寫,擴展成從 Eureka 註冊中心獲取服務端列表瀏覽器

同時它也會用 NIWSDiscoveryPing 來取代 IPing,它將職責委託給 Eureka 來肯定服務端是否已經啓動架構

二、啓動多個client實例app

  中止eureka-client服務,打開Run/Debug Configurations
負載均衡


把圖中勾選取消,而後保存,啓動,此時啓動端口爲8762,打開配置文件,將端口修改成8763,再次啓動,能夠看到在註冊中心啓動了兩個服務maven

 

三、建立服務消費者service-ribbon

<?xml version="1.0" encoding="UTF-8"?>
<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>

    <groupId>com.study</groupId>
    <artifactId>service-ribbon</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>service-ribbon</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>com.study</groupId>
        <artifactId>cloud</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>

    </dependencies>


</project>

配置文件

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8764
spring:
  application:
    name: service-ribbon

在工程的啓動類中,經過@EnableDiscoveryClient向服務中心註冊;而且向程序的ioc注入一個bean: restTemplate;並經過@LoadBalanced註解代表這個restRemplate開啓負載均衡的功能。

@EnableEurekaClient
@EnableDiscoveryClient
@SpringBootApplication
public class ServiceRibbonApplication {

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

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

寫一個測試類HelloService,經過以前注入ioc容器的restTemplate來消費service-hi服務的「/hi」接口,在這裏咱們直接用的程序名替代了具體的url地址,

在ribbon中它會根據服務名來選擇具體的服務實例,根據服務實例在請求的時候會用具體的url替換掉服務名,代碼以下:

@Service
public class HelloService {

    @Autowired
    RestTemplate restTemplate;

    public String hiService(String name) {
        return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class);
    }
}

寫一個controller,在controller中用調用HelloService 的方法,代碼以下:

@RestController
public class HelloControler {

    @Autowired
    HelloService helloService;

    @GetMapping(value = "/hi")
    public String hi(@RequestParam String name) {
        return helloService.hiService( name );
    }
}

啓動工程,在瀏覽器中訪問http://localhost:8764/hi?name=study 瀏覽器交替顯示:

hi study ,i am from port:8762
hi study ,i am from port:8763

這說明當咱們經過調用restTemplate.getForObject(「http://SERVICE-HI/hi?name=「+name,String.class)方法時,已經作了負載均衡,訪問了不一樣的端口的服務實例。

四、此時的架構

 

五、架構分析

  5.一、看實線部分,service-hi 876二、service-hi 8763 和 service-ribbon 8764都做爲服務消費者分別向服務註冊中心eureka-server 8761中註冊。

  5.二、看虛線部分,當sercvice-ribbon經過restTemplate調用service-hi的hi接口時,由於用ribbon進行了負載均衡,會輪流的調用service-hi:8762和8763 兩個端口的hi接口。

相關文章
相關標籤/搜索