@Spring Cloud | NO.2 - 服務的消費者 [Ribbon & Feign]

本文繼@Spring Cloud | NO.1 - 服務的註冊與發現 [Eureka],上一篇已經開啓了一個服務註冊中心並已註冊服務提供者的服務到註冊中心,本章主要講如何調用註冊中心的服務。html

在SpringCloud微服務架構中,服務與服務之間的通訊基於 HTTP RESTFUL

服務的消費者-Ribbon

Ribbon是一個客戶端負載均衡器,它能夠很好地控制HTTP和TCP客戶端的行爲。Ribbon中的中心概念是指定客戶端的概念。每一個負載平衡器是組合的組合的一部分,它們一塊兒工做以根據須要聯繫遠程服務器,而且集合具備您將其做爲應用程序開發人員(例如使用@FeignClient註釋)的名稱。
——官方直譯

項目集成

1. pom.xml引入Maven依賴java

<parent>
    <!-- spring boot -->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

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

<dependencyManagement>
    <dependencies>
        <!-- spring cloud -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley RC1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
注意: Ribbon引入的Maven依賴中 artifactId有變更, SpringBoot2.0以前的版本爲 spring-cloud-starter-ribbon

2. 添加註解支持web

@SpringBootApplication
@EnableDiscoveryClient
public class RibbonServiceApplication {

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

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
經過 @EnableDiscoveryClient向服務中心註冊
經過 @Bean注入一個 RestTemplate Bean,並經過 @LoadBalanced註解代表這個 restRemplate開啓負載均衡的功能

3. application.yml配置spring

spring:
  application:
    name: service-ribbon
server:
  port: 8764
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
將名稱爲 service-ribbon的服務註冊到註冊中心,端口爲 8764

4. 服務調用segmentfault

@Service
public class HelloService {

    @Autowired
    RestTemplate restTemplate;

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

}
與正常的 RestTemplate調用服務不一樣的是將請求 服務的url替換成了具體的 服務名稱,也就是註冊在註冊中心的服務名稱,若是相同的服務名稱在註冊中心存在不一樣端口的註冊,那麼在這裏會作客戶端的負載均衡。

至此Ribbon的配置完畢。瀏覽器

此時,咱們寫一個Controller來展現服務調用的結果。服務器

@RestController
public class HelloControler {

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

4. 運行概覽圖antd

啓動一個服務註冊中心,兩個服務提供者,一個服務消費者(Ribbon)

服務註冊中心

屢次訪問 http://127.0.0.1:8764/hi?name...,瀏覽器交替顯示:架構

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

服務的消費者-Feign

Feign是一個聲明式的Web服務客戶端。這使得Web服務客戶端的寫入更加方便 要使用Feign建立一個界面並對其進行註釋。它具備可插入註釋支持,包括Feign註釋和JAX-RS註釋。Feign還支持可插拔編碼器和解碼器。Spring Cloud增長了對Spring MVC註釋的支持,並使用Spring Web中默認使用的HttpMessageConverters。Spring Cloud集成Ribbon和Eureka以在使用Feign時提供負載均衡的http客戶端。
——官方直譯

項目集成

1. pom.xml引入Maven依賴app

<parent>
    <!-- spring boot -->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

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

<dependencyManagement>
    <dependencies>
        <!-- spring cloud -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley RC1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
注意: Feign引入的Maven依賴中 artifactId有變更, SpringBoot2.0以前的版本爲 spring-cloud-starter-feign

2. 添加註解支持

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class FeignServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(FeignServiceApplication.class, args);
    }
}
經過 @EnableDiscoveryClient向服務中心註冊
經過 @EnableFeignClients註解開啓Feign的功能

3. application.yml配置

spring:
  application:
    name: service-feign
server:
  port: 8765

cage:
  feign-client:
    base-packages: ltd.ueic,ltd.ueic.cages

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
將名稱爲 service-feign的服務註冊到註冊中心,端口爲 8765

4. 服務調用

定義一個接口來調用服務

@FeignClient(value = "service-hi")
public interface SchedualServiceHi {
    @RequestMapping(value = "/hi",method = RequestMethod.GET)
    String sayHiFromClientOne(@RequestParam(value = "name") String name);
}
經過 @FeignClient制定調用的服務名稱
經過在接口上聲明 @RequestMapping指明調用服務的接口地址

至此Feign的配置完畢。

此時,咱們寫一個Controller來展現服務調用的結果。

@RestController
public class HiController {

    @Autowired
    SchedualServiceHi schedualServiceHi;
    
    @RequestMapping(value = "/hi",method = RequestMethod.GET)
    public String sayHi(@RequestParam String name){
        return schedualServiceHi.sayHiFromClientOne(name);
    }
}

4. 運行概覽圖

啓動一個服務註冊中心,兩個服務提供者,一個服務消費者(Ribbon),一個服務消費者(Feign)

服務註冊中心

屢次訪問 http://localhost:8765/hi?name...,瀏覽器交替顯示:

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

附加說明

  1. 本文參考資料
相關文章
相關標籤/搜索