Spring Cloud實戰系列(二) - 客戶端調用Rest + Ribbon

相關

  1. Spring Cloud實戰系列(一) - 服務註冊與發現Eureka php

  2. Spring Cloud實戰系列(二) - 客戶端調用Rest + Ribbon java

  3. Spring Cloud實戰系列(三) - 聲明式客戶端Feign git

  4. Spring Cloud實戰系列(四) - 熔斷器Hystrix github

  5. Spring Cloud實戰系列(五) - 服務網關Zuul web

  6. Spring Cloud實戰系列(六) - 分佈式配置中心Spring Cloud Config算法

  7. Spring Cloud實戰系列(七) - 服務鏈路追蹤Spring Cloud Sleuthspring

  8. Spring Cloud實戰系列(八) - 微服務監控Spring Boot Adminapache

  9. Spring Cloud實戰系列(九) - 服務認證受權Spring Cloud OAuth 2.0 編程

  10. Spring Cloud實戰系列(十) - 單點登陸JWT與Spring Security OAuth 後端

前言

上一篇文章咱們介紹了 Eureka 服務註冊中心 的搭建,這篇文章介紹一下如何使用 Eureka 服務註冊中心,搭建一個簡單的 服務端註冊服務,由 客戶端 經過 Ribbon 負載均衡 地去調用服務案例。

正文

1. 建立服務提供者

建立一個 service-hiModule,建立完成後的 pom.xml 以下:

<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>io.ostenant.github.springcloud</groupId>
    <artifactId>service-hi</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>service-hi</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Dalston.SR1</spring-cloud.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
複製代碼

經過 註解 @EnableEurekaClient 代表本身是一個 Eureka Client

@SpringBootApplication
@EnableEurekaClient
@RestController
public class ServiceHiApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceHiApplication.class, args);
    }
}
複製代碼

建立一個控制器 HelloController,對外提供一個 /hiHTTP 的服務。在響應數據中返回當前 服務實例端口號

@RestController
public class HelloController {

    @Value("${server.port}")
    private String port;

    @RequestMapping("/hi")
    public String hi(@RequestParam String name) {
        return "Hi " + name + ", I am from port: "  + port;
    }
}
複製代碼

配置文件 中註明的 服務註冊中心 的地址,application.yml 配置文件以下:

spring:
 active:
 profiles: service-hi1 # service-hi2

---

spring:
 profiles: service-hi1
eureka:
 client:
 serviceUrl:
 defaultZone: http://localhost:8761/eureka/
server:
 port: 8763
spring:
 application:
 name: service-hi

---

spring:
 profiles: service-hi2
eureka:
 client:
 serviceUrl:
 defaultZone: http://localhost:8761/eureka/
server:
 port: 8764
spring:
 application:
 name: service-hi
複製代碼

分別以 spring.profiles.active=hi1spring.profiles.active=hi2 做爲 Spring Boot啓動命令參數,在 端口號 87638764 啓動 2服務提供者 實例。

2. 建立服務消費者

從新新建 service-ribbonModule,在它的 pom.xml 文件分別引入 起步依賴 spring-cloud-starter-eurekaspring-cloud-starter-ribbonspring-boot-starter-web,代碼以下:

<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>io.ostenant.github.springcloud</groupId>
    <artifactId>service-ribbon</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>service-ribbon</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Dalston.SR1</spring-cloud.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
複製代碼

在項目的 配置文件 指定服務的 服務註冊中心 的地址,應用名稱service-ribbon端口號8762。完整配置文件 application.yml 以下:

eureka:
 client:
 serviceUrl:
 defaultZone: http://localhost:8761/eureka/
server:
 port: 8762
spring:
 application:
 name: service-ribbon
複製代碼

在應用 啓動類 上,經過 @EnableDiscoveryClient服務中心 註冊自身信息,向 Spring Boot 容器註冊一個 RestTemplate 對象,並經過 @LoadBalanced 註解代表這個 RestRemplate 開啓 客戶端負載均衡 的功能。

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

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
複製代碼

寫一個 測試接口,注入上面的 RestTemplate 對象來消費 service-hi 服務的 /hi 接口。在 RestTemplateURL 中,咱們將具體 服務生產者主機名稱端口號 替換爲它的 服務名稱

@RestController
public class HelloController {

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping(value = "/hi")
    public String requestForHi(@RequestParam String name){
        return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class);
    }
}
複製代碼

在瀏覽器上屢次訪問 http://localhost:8762/hi?name=ribbon,瀏覽器交替顯示:

Hi ribbon, I am from port: 8763

Hi ribbon, I am from port: 8764

在具體的調用過程當中,Ribbon 提供的 @LoadBalanced 註解會從 Eureka Server 上查詢 服務列表,根據 服務名稱 找到 SERVICE-HI服務實例。若是有多個 SERVICE-HI 實例,Ribbon 會根據 客戶端負載均衡 算法篩選其中一臺,並把 URL 中的 SERVICE-HI 替換爲具體實例的 主機名稱端口號

參考

  • 方誌朋《深刻理解Spring Cloud與微服務構建》

歡迎關注技術公衆號: 零壹技術棧

零壹技術棧

本賬號將持續分享後端技術乾貨,包括虛擬機基礎,多線程編程,高性能框架,異步、緩存和消息中間件,分佈式和微服務,架構學習和進階等學習資料和文章。

相關文章
相關標籤/搜索