1. 程式人生 > 其它 >SpringCloud中整合OpenFeign實現服務呼叫

SpringCloud中整合OpenFeign實現服務呼叫

場景

SpringCloud中整合Eureka實現服務註冊(單機Eureka構建):

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/124688609

SpringCloud中整合Eureka實現叢集部署服務註冊與服務提供者:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/124710576

SpringCloud中整合Eureka時通過Discovery實現服務發現:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/124725905

在上面使用Eureka作為服務註冊與發現時進行過叢集搭建並測試了負載均衡的呼叫。

SpringCloud中整合Ribbon實現負載均衡以及修改負載均衡規則和輪詢演算法原理分析:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/124802698

並且使用了Ribbon進行服務呼叫。

下面通過OpenFeign實現服務呼叫。

OpenFeign

Feign是一個宣告式WebService客戶端。

使用Feign能讓編寫Web Service客戶端更加簡單。

它的使用方法是定義一個服務介面然後在上面添加註解。Feign也支援可插拔式的編碼器和解碼器。Spring Cloud對Feign進行了封裝,使其支援了Spring MVC標準註解和HttpMessageConverters。Feign也可以Eureka和Rabbion組合使用以支援負載均衡。

Github:

https://github.com/spring-cloud/spring-cloud-openfeign

Feign能幹啥

Feign旨在使編寫的Java Http 客戶端變得更加容易。

前面在使用Ribbon + RestTemplate時,利用RestTemplate對http請求的封裝處理,形成了一套模板化的呼叫方法。

但是在實際開發中,由於對服務依賴的呼叫可能不止一處,往往一個介面會被多處呼叫,所以通常都會針對每個微服務自行封裝一些客戶端類

來包裝這些依賴服務的呼叫。所以Feign在此基礎上做了進一步封裝,由它來幫助我們定義和實現依賴服務介面的定義。

在Feign的實現下,我們只需要建立一個介面並使用註解的方式來配置它(以前是Dao介面上面標註Mapper註解,現在是一個微服務介面上面標註一個

Feign註解即可),即可完成對服務提供方的介面繫結,簡化了使用SpringCloudRibbon時,自動封裝服務呼叫客戶端的開發量。

Feign集成了Ribbon

利用Ribbon維護了Payment的服務列表資訊,並且通過輪詢實現了客戶端的負載均衡。而與Ribbon不同的是,

通過feign只需要定義服務繫結介面且以宣告式的方法,優雅而簡單的實現了服務呼叫。

注:

部落格:
https://blog.csdn.net/badao_liumang_qizhi
關注公眾號
霸道的程式猿
獲取程式設計相關電子書、教程推送與免費下載。

實現

1、參考上面的新建子模組的流程,新建cloud-consumer-feign-order88消費者子模組

2、新增pom依賴

        <!--openfeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

這裡使用Eureka作為服務註冊中心,所以還需要新增Eureka的依賴

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

其他依賴根據自己需要,完整Pom

<?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">
    <parent>
        <artifactId>SpringCloudDemo</artifactId>
        <groupId>com.badao</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-consumer-feign-order88</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <!--openfeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--eureka client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency><!-- 引入自己定義的api通用包,可以使用Payment支付Entity -->
            <groupId>com.badao</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>
</project>

3、新建application.yml

server:
  port: 88

eureka:
  client:
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/

配置專案埠號以及Eureka叢集的Server地址

4、新建主啟動類並新增@EnableFeignClients註解

package com.badao.springclouddemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;


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

5、新建service包,包下新建service用來實現服務呼叫

package com.badao.springclouddemo.service;


import com.badao.springclouddemo.entities.CommonResult;
import com.badao.springclouddemo.entities.Payment;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService
{
    @GetMapping(value = "/payment/get/{id}")
    public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);

}

注意這裡要在service上新增@FeignClient註解,並且value值就是服務名,服務名就是註冊進Eureka的服務別名。

然後這裡服務消費者介面呼叫的註解以及路徑和服務提供者Controller的介面一致。

6、然後新建Controller,用來實現對service進行呼叫

package com.badao.springclouddemo.controller;


import com.badao.springclouddemo.entities.CommonResult;
import com.badao.springclouddemo.entities.Payment;
import com.badao.springclouddemo.service.PaymentFeignService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;


@RestController
@Slf4j
public class OrderFeignController
{
    @Resource
    private PaymentFeignService paymentFeignService;

    @GetMapping(value = "/consumer/payment/get/{id}")
    public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id)
    {
        return paymentFeignService.getPaymentById(id);
    }

}

7、啟動Eureka叢集7001和7002以及服務提供者8001和8002,然後啟動88服務消費者。

呼叫88的介面檢視效果