成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

微服務(wù)實(shí)戰(zhàn):服務(wù)遠(yuǎn)程調(diào)用組件 Spring Cloud Feign 架構(gòu)原理及用法,實(shí)戰(zhàn)講解!

開(kāi)發(fā) 架構(gòu)
Feign 是一個(gè)輕量級(jí)的 HTTP 客戶端框架,使用者能夠以一種更簡(jiǎn)潔、易于維護(hù)的方式來(lái)實(shí)現(xiàn) HTTP 服務(wù)請(qǐng)求。同時(shí)在 Spring Cloud 生態(tài)中,F(xiàn)eign 整合了 Ribbon,可以自動(dòng)實(shí)現(xiàn)客戶端負(fù)載均衡功能。

一、背景介紹

今天通過(guò)這篇文章,結(jié)合之前的知識(shí),我們一起來(lái)了解一下 Spring Cloud 技術(shù)體系中另一個(gè)最核心的組件之一 Fegin。

二、Fegin 簡(jiǎn)介

Spring Cloud Feign 是一套基于 Netflix Feign 實(shí)現(xiàn)的 HTTP 客戶端工具,主要作用是簡(jiǎn)化 HTTP 客戶端的開(kāi)發(fā)和維護(hù)工作。

傳統(tǒng)的模式下,當(dāng)我們要對(duì)某個(gè)接口發(fā)起 HTTP 請(qǐng)求時(shí),首先會(huì)封裝 HTTP 請(qǐng)求報(bào)文,然后發(fā)起請(qǐng)求,最后處理響應(yīng)結(jié)果。例如之前介紹過(guò)的RestTemplate工具。

其實(shí)這三步驟,可以編寫(xiě)一個(gè)動(dòng)態(tài)代理類來(lái)幫助我們以一種更簡(jiǎn)潔、易于維護(hù)的方式完成 HTTP 請(qǐng)求的調(diào)用。Fegin 的實(shí)現(xiàn)邏輯大體就是這種思路,我們只需要?jiǎng)?chuàng)建一個(gè)接口并添加@FeignClient注解,然后配置相關(guān)的請(qǐng)求方法既可完成 HTTP 請(qǐng)求工作,剩下的就交給代理類來(lái)完成。不過(guò)底層,使用的依然是Apache HttpClientOkHttp發(fā)送請(qǐng)求。

與原生 Feign 組件相比,Spring Cloud Feign 還擴(kuò)展了對(duì) Spring MVC 注解的支持,同時(shí)還整合了 Ribbon 提供客戶端的負(fù)載均衡實(shí)現(xiàn),以及 Hystrix 服務(wù)熔斷器。

下面我們通過(guò)具體的例子,看看如何使用 Feign 來(lái)實(shí)現(xiàn) HTTP 請(qǐng)求。

三、方案實(shí)踐

與之前介紹 Ribbon 類似,依次創(chuàng)建eureka-servereureka-provider-1eureka-provider-2工程,就不重復(fù)粘貼了。

根據(jù)eureka-consumer復(fù)制一個(gè)服務(wù)消費(fèi)者工程,命名為eureka-consumer-feign,并在pom.xml中引入 Feign 依賴包,示例如下:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.4.RELEASE</version>
    <relativePath/>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</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-feign</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Edgware.SR3</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

然后,創(chuàng)建一個(gè)服務(wù)啟動(dòng)類并添加@EnableFeignClients注解,表示開(kāi)啟掃描 Spring Cloud Feign 客戶端。

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

接著,創(chuàng)建一個(gè)接口并使用@FeignClient注解指定要調(diào)用的目標(biāo)服務(wù)實(shí)例名稱,接口中定義的各個(gè)方法使用 Spring MVC 的注解就可以指定要調(diào)用的目標(biāo)服務(wù)接口地址,示例如下:

/**
 * 配置要調(diào)用的服務(wù)實(shí)例名稱
 */
@FeignClient(name = "eureka-provider")
public interface RpcService {

    /**
     * 要調(diào)用的目標(biāo)服務(wù)接口地址
     * @return
     */
    @RequestMapping(value = "/hello")
    String hello();
}

最后,創(chuàng)建一個(gè)controller,通過(guò)定義的 feign 客戶端來(lái)調(diào)用服務(wù)提供方的接口。

@RestController
public class HelloController {

    @Autowired
    private RpcService rpcService;

    /**
     * 發(fā)起遠(yuǎn)程調(diào)用測(cè)試
     * @return
     */
    @GetMapping("/rpc")
    public String rpc() {
        String result = rpcService.hello();
        return "發(fā)起遠(yuǎn)程調(diào)用,收到返回的信息:" +  result;
    }
}

完成以上工程之后,依次將eureka-servereureka-provider-1eureka-provider-2eureka-consumer-feign服務(wù)啟動(dòng)起來(lái)。

然后在瀏覽器上多次訪問(wèn)http://localhost:9003/rpc,可以得到類似于如下內(nèi)容。

圖片圖片

可以清晰的看到,客戶端以輪訓(xùn)的方式調(diào)用目標(biāo)接口。至此,最簡(jiǎn)單的一個(gè)服務(wù)注冊(cè)與調(diào)用的例子就完成了。

四、Fegin 傳輸文件

默認(rèn)情況下,F(xiàn)egin 可以滿足絕大部分的 HTTP 請(qǐng)求場(chǎng)景。

但是在某些場(chǎng)景下,比如在服務(wù)之間實(shí)現(xiàn)文件遠(yuǎn)程上傳,如何實(shí)現(xiàn)呢?

實(shí)際上,Spring Cloud Feign 并不支持直接傳文件,但可以通過(guò)引入 Feign 的擴(kuò)展包來(lái)實(shí)現(xiàn)。

具體實(shí)現(xiàn)例子如下。

4.1服務(wù)提供方(接收文件)

服務(wù)提供方的實(shí)現(xiàn)比較簡(jiǎn)單,按照 Spring MVC 的正常實(shí)現(xiàn)即可,文件上傳接口示例如下:

@RestController
publicclass HelloController {

    privatestaticfinal String SRC_PATH = "/Users/demo/file/";

    @PostMapping("/fileUpload")
    public String fileUpload(@RequestParam("file") MultipartFile file,
                             @RequestParam("prefixName") String prefixName) throws IOException {
        // 獲取上傳文件的文件名
        String fileName = file.getOriginalFilename();
        String absolutePath = SRC_PATH + prefixName + "_" + fileName;
        // 將文件保存到磁盤(pán)
        file.transferTo(new File(absolutePath));
        return"Upload file success:" + prefixName + "_" + fileName;
    }
}

4.2服務(wù)消費(fèi)方(發(fā)送文件)

在服務(wù)消費(fèi)方,由于需要利用 Feign 客戶端來(lái)上傳文件,需要在pom.xml文件引入支持文件上傳的依賴包,內(nèi)容如下。

<dependency>
    <groupId>io.github.openfeign.form</groupId>
    <artifactId>feign-form</artifactId>
    <version>3.0.3</version>
</dependency>
<dependency>
    <groupId>io.github.openfeign.form</groupId>
    <artifactId>feign-form-spring</artifactId>
    <version>3.0.3</version>
</dependency>

接著,定義一個(gè)文件上傳的 Feign 客戶端接口,示例如下。

@FeignClient(name = "eureka-provider", configuration = FeignSupportConfig.class)
public interface RpcUploadService {


    @PostMapping(value = "/fileUpload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    String handleFileUpload(@RequestPart(value = "file") MultipartFile file,
                            @RequestParam("prefixName") String prefixName);

}

然后,為@FeignClient注解類創(chuàng)建所需的編碼器,也就是上文所配置的FeignSupportConfig類,不然調(diào)用的時(shí)候會(huì)報(bào)錯(cuò)。

@Configuration
public class FeignSupportConfig {

    @Autowired
    private ObjectFactory<HttpMessageConverters> messageConverters;


    /**
     * 微服務(wù)傳輸文件用
     * @return
     */
    @Bean
    public Encoder feignFormEncoder() {
        return new SpringFormEncoder(new SpringEncoder(messageConverters));
    }
}

最后,創(chuàng)建一個(gè)controller,通過(guò)上文定義的 feign 客戶端來(lái)上傳文件到服務(wù)端。

@RestController
public class HelloController {

    @Autowired
    private RpcUploadService rpcUploadService;

    @PostMapping("/rpcUpload")
    public String rpcUpload(@RequestParam("file") MultipartFile file) throws IOException {
        String result = rpcUploadService.handleFileUpload(file,"feign");
        return "通過(guò) feign 發(fā)起文件遠(yuǎn)程上傳調(diào)用,收到返回的信息:" +  result;
    }
}

完成以上操作之后,依次將eureka-servereureka-provider-1eureka-provider-2eureka-consumer-feign服務(wù)啟動(dòng)起來(lái)。

用 postman 調(diào)用客戶端接口上傳文件,不出意外的話,會(huì)看到類似如下的返回信息。

圖片圖片

可以清晰的看到,文件遠(yuǎn)程上傳成功。

五、小結(jié)

最后總結(jié)一下,F(xiàn)eign 是一個(gè)輕量級(jí)的 HTTP 客戶端框架,使用者能夠以一種更簡(jiǎn)潔、易于維護(hù)的方式來(lái)實(shí)現(xiàn) HTTP 服務(wù)請(qǐng)求。同時(shí)在 Spring Cloud 生態(tài)中,F(xiàn)eign 整合了 Ribbon,可以自動(dòng)實(shí)現(xiàn)客戶端負(fù)載均衡功能。

另外,F(xiàn)eign 還整合了 Hystrix 來(lái)實(shí)現(xiàn)服務(wù)的容錯(cuò)保護(hù),在下一篇文章中我們會(huì)對(duì)其進(jìn)行介紹。

六、參考

  1. https://www.didispace.com/spring-cloud/spring-cloud-starter-dalston-2-4.html
責(zé)任編輯:武曉燕 來(lái)源: 潘志的技術(shù)筆記
相關(guān)推薦

2025-03-13 00:55:00

微服務(wù)架構(gòu)系統(tǒng)

2025-03-04 02:20:00

EurekaNetflixSpring

2017-09-05 14:05:11

微服務(wù)spring clou路由

2017-08-10 11:15:05

Spring Clou微服務(wù)架構(gòu)

2016-08-25 20:55:19

微服務(wù)架構(gòu)發(fā)布

2016-08-25 21:12:31

微服務(wù)架構(gòu)發(fā)布

2021-05-14 09:15:32

SpringCloud微服務(wù)日志

2021-03-09 09:33:42

網(wǎng)關(guān)授權(quán)微服務(wù)

2017-06-26 09:06:10

Spring Clou微服務(wù)架構(gòu)

2018-04-16 14:56:56

微服務(wù)架構(gòu)分布式服務(wù)

2018-03-13 16:42:26

分布式服務(wù)跟蹤

2021-01-28 10:10:51

微服務(wù)后端SpringCloud

2017-09-04 16:15:44

服務(wù)網(wǎng)關(guān)架構(gòu)

2017-07-03 09:50:07

Spring Clou微服務(wù)架構(gòu)

2017-08-09 15:50:47

Spring Clou微服務(wù)架構(gòu)

2022-04-09 14:45:02

微服務(wù)常見(jiàn)概念Spring

2021-08-02 09:27:02

微服務(wù)接口場(chǎng)景

2017-12-20 15:37:39

Spring Clou微服務(wù)架構(gòu)

2021-06-09 09:42:50

SpringCloud微服務(wù)灰度發(fā)布

2021-04-22 09:31:58

服務(wù)器微服務(wù)配置
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲码欧美码一区二区三区 | 狠狠干av | 久一精品| 日本久久视频 | www国产成人免费观看视频,深夜成人网 | 91短视频网址 | 国产精品区一区二 | 免费亚洲视频 | 涩涩视频在线看 | 国产a爽一区二区久久久 | 亚洲成人在线视频播放 | 亚洲色图综合网 | 老司机深夜福利网站 | 成人av一区 | 国产良家自拍 | 国产99久久精品一区二区永久免费 | 国产一区二区三区视频免费观看 | 中文字幕99 | 亚洲综合激情 | 国产1区在线 | 羞羞的视频在线 | 五月激情婷婷在线 | 日日操操 | 欧美激情一区二区三区 | 久久国产成人 | 日韩在线视频一区二区三区 | 蜜桃五月天 | a级大毛片 | 国产精品久久久久久妇女 | 99久久免费观看 | 欧美色人| 精品亚洲永久免费精品 | 高清一区二区三区 | 日韩av在线一区 | 精品久久久久久久久久久久 | 精品国产精品国产偷麻豆 | 高清黄色 | 久久99精品久久久久久国产越南 | 三级黄视频在线观看 | 国产精品婷婷 | 国产在线中文字幕 |