1. 程式人生 > >springcloud(第八篇)springcloud feign

springcloud(第八篇)springcloud feign

# spring cloud feign

introduction

netflix feign是一個類似retrofit進行http呼叫框架,Feign makes writing java http clients easier 使得編寫http client程式碼更加簡單

netflix feign

直接給出一段簡單的案例

package com.lkl.netflix.feign;

import feign.*;
import feign.codec.ErrorDecoder;
import feign.codec.Decoder;
import feign.gson.GsonDecoder;

import java.io.IOException;
import java.util.List
; /** * Created by liaokailin on 16/5/9. */ public class GitHubExample { interface GitHub { // 1 @RequestLine("GET /repos/{owner}/{repo}/contributors") List<Contributor> contributors(@Param("owner") String owner, @Param("repo") String repo); } public static void main(String... args) { Decoder decoder = new
GsonDecoder(); // 2 GitHub github = Feign.builder() .decoder(decoder) // 3 .errorDecoder(new GitHubErrorDecoder(decoder)) // 4 .logger(new Logger.ErrorLogger()) // 5 .logLevel(Logger.Level.BASIC) // 5 .target(GitHub.class, "https://api.github.com"
); // 6 System.out.println("Let's fetch and print a list of the contributors to this library."); List<Contributor> contributors = github.contributors("netflix", "feign"); // 7 for (Contributor contributor : contributors) { System.out.println(contributor.login + " (" + contributor.contributions + ")"); } System.out.println("Now, let's cause an error."); try { github.contributors("netflix", "some-unknown-project"); // 8 } catch (GitHubClientError e) { System.out.println(e.getMessage()); } } static class Contributor { String login; int contributions; } static class GitHubClientError extends RuntimeException { // 4 private String message; // parsed from json @Override public String getMessage() { return message; } } static class GitHubErrorDecoder implements ErrorDecoder { // 4 final Decoder decoder; final ErrorDecoder defaultDecoder = new ErrorDecoder.Default(); GitHubErrorDecoder(Decoder decoder) { this.decoder = decoder; } @Override public Exception decode(String methodKey, Response response) { try { return (Exception) decoder.decode(response, GitHubClientError.class); } catch (IOException fallbackToDefault) { return defaultDecoder.decode(methodKey, response); } } } }

1.首先定義介面GitHub,使用註解RequestLine 表明contributors()方法為一個get請求,請求相對為/repos/{owner}/{repo}/contributors
2.Decoder decoder = new GsonDecoder(); 建立一個GsonDecoder解碼器,表明通過Gson解析返回資料
3.decoder()方法設定解碼器
4.errorDecoder()指定發生異常時的解碼器,需要實現ErrorDecoder介面,覆寫decode方法,通過指定的Decoder解析錯誤資訊,這裡還是使用GsonDecoder
5.logger 相關的表示配置日誌系你係
6.target() 方法指定訪問url以及返回的型別
7.通過建立的github物件呼叫contributors獲取結果
8.模擬異常情況

note: feign使用起來很簡單,其原理和retrofit及其類似,通過介面定義訪問訪問,用jdk的動態代理建立介面的實現類,在類中解析方法上的註解資訊用以識別使用者配置的http請求資訊,然後執行請求;
feign可以通過ReflectiveFeign下的newInstance()方法看到

return (T) Proxy
        .newProxyInstance(target.type().getClassLoader(), new Class<?>[]{target.type()}, handler);

spring cloud feign

spring cloud feign通過註解的封裝使用起來更加簡單

package com.lkl.springcloud.feign;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * Created by liaokailin on 16/5/11.
 */
@Configuration
@EnableAutoConfiguration
@EnableFeignClients
@RestController
public class Application {

    @Autowired
    GitHub gitHub;
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @FeignClient(url = "https://api.github.com")
    interface GitHub {
        @RequestMapping(value = "/repos/{owner}/{repo}/contributors", method = RequestMethod.GET)
      ResponseEntity<List<Contributor>> contributors(@PathVariable("owner") String owner, @PathVariable("repo") String repo);
    }

    @RequestMapping("/")
    public void test(){
        ResponseEntity< List<Contributor>>  responseEntity  =   gitHub.contributors("netflix", "feign");
        List<Contributor> contributors = responseEntity.getBody();
         for (Contributor contributor : contributors) {
         System.out.println(contributor.login + " (" + contributor.contributions + ")");
         }
    }


    static class Contributor {
        String login;
        int contributions;
    }
}

註解EnableFeignClients表明需要掃描使用FeignClient註解的介面,在程式碼中定義了@FeignClient(url = "https://api.github.com") 表明該介面為一個feign介面
通過url指定訪問路徑RequestMapping表明相對路徑

在程式碼中注入beanGitHub,直接呼叫其中申明的方法即可。

重點說明下FeignClient註解

該註解表示申明建立一個rest client bean,可以直接通過Autowired注入使用,如果ribbon在工程中啟用,則會使用load balance進行後端請求呼叫,可以為FeignClient指定value表明需要訪問的serviceId

feign + ribbon + eureka


package com.lkl.springcloud.feign;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import static org.springframework.web.bind.annotation.RequestMethod.GET;

/**
 * Created by liaokailin on 16/5/9.
 */
@SpringBootApplication
@EnableDiscoveryClient
@RestController
@RibbonClient("hello")
@EnableFeignClients
public class Application {

    @Autowired
    HelloClient client;

    @RequestMapping("/")
    public String hello() {
        return client.hello();
    }

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

    @FeignClient("simple")
    interface HelloClient {
        @RequestMapping(value = "/", method = GET)
        String hello();
    }

}

使用@FeignClient("simple")指定要訪問的service id 由於hello()對應的mapping為@RequestMapping(value = "/", method = GET) 那麼該方法實際呼叫url為
http://simple/,因此在執行

@RequestMapping("/")
    public String hello() {
        return client.hello();
    }

呼叫的為SimpleApplication.java

@RequestMapping("/")
    public String hello() {
        return "Hello";
    }

歡迎關注,您的肯定是對我最大的支援

這裡寫圖片描述

相關推薦

springcloud()springcloud feign

# spring cloud feign introduction netflix feign是一個類似retrofit進行http呼叫框架,Feign makes writing java http clients easier 使得編寫http cl

跟我學SpringCloud | :Spring Cloud Bus 訊息匯流排

SpringCloud系列教程 | 第八篇:Spring Cloud Bus 訊息匯流排 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如無特殊說明,本系列教程全採用以上版本 前面兩篇文章我們聊了Spring Cloud Config配置

springcloud()springcloud ribbon with eureka

spring cloud ribbon with eureka introduction 在上一篇中闡述了ribbon的基本用法,但是可以發現服務列表是通過配置得來的,實際 情況通常是由負載均衡+服務發現來實現的,通過服務發現獲取服務列表,負載均衡通過

史上最簡單的SpringCloud教程 | : 訊息匯流排(Spring Cloud Bus)

最新Finchley版本請訪問: https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f8-bus/ 或者 http://blog.csdn.net/forezp/article/details/81041062

SpringCloud feign

1.新建一個專案feign-client 選擇eureka discovery,feign,web三個依賴 2.啟動eureka,兩個eureka client 3.具體的pom.xml <?xml version="1.0" encoding="UTF-8"?>

springcloud — Finchley.RELEASE版》 服務鏈路追蹤Sleuth

Sleuth簡述 微服務架構是通過業務來劃分服務的,對外暴露的介面,可能需要很多個服務協同才能完成一個介面功能,如果鏈路上任何一個服務出現問題,都會形成導致介面呼叫失敗。此時查找出現問題的微服務是很困難的。Spring Cloud Sleuth主要功能就是在分散式系統中提供

原 史上最簡單的SpringCloud教程 | : 訊息匯流排(Spring Cloud Bus)(Finchley版本)

轉載請標明出處: Spring Cloud Bus 將分散式的節點用輕量的訊息代理連線起來。它可以用於廣播配置檔案的更改或者服務之間的通訊,也可以用於監控。本文要講述的是用Spring Cloud Bus實現通知微服務架構的配置檔案的更改。 一、準備工作

SpringCloud : 服務消費者(Ribbon / Feign

        前面的文章學習了服務的註冊和發現。在微服務架構中,業務都會被拆分成一個獨立的服務,服務與服務的通訊是基於http restful的。Spring cloud有兩種服務呼叫方式,一種是ribbon+restTemplate,另一種是feign。在這一篇文章要學習

SpringCloud | : 服務消費者(Feign

上一篇文章,講述瞭如何通過RestTemplate+Ribbon去消費服務,這篇文章主要講述如何通過Feign去消費服務。 一、Feign簡介 Feign是一個宣告式的偽Http客戶端,它使得寫Http客戶端變得更簡單。使用Feign,只需要建立一個介面並註解。它具有

SpringCloud教程 | : 訊息匯流排(Spring Cloud Bus)(Finchley版本)

Spring Cloud Bus 將分散式的節點用輕量的訊息代理連線起來。它可以用於廣播配置檔案的更改或者服務之間的通訊,也可以用於監控。本文要講述的是用Spring Cloud Bus實現通知微服務架構的配置檔案的更改。 一、準備工作 本文還是基於上一篇文章來實現。

跟我學SpringCloud | :服務的提供與Feign呼叫

跟我學SpringCloud | 第三篇:服務的提供與Feign呼叫 上一篇,我們介紹了註冊中心的搭建,包括叢集環境嚇註冊中心的搭建,這篇文章介紹一下如何使用註冊中心,建立一個服務的提供者,使用一個簡單的客戶端去呼叫服務端提供的服務。 本篇文章中需要三個角色,分別是服務的提供者,服務的消費者,還有一個是上一篇

SpringCloud maven module管理多節點專案

1.效果圖 2.新建maven專案 選擇pom 2.如果有src檔案目錄,刪掉即可 3.pom.xml如下 <project xmlns="http://maven.apache.org/POM/4.0.0"     xmln

SpringCloud ribbon

1.複製上一個專案eureka-client,命名為eureka-client2,並修改pom.xml對應的名字,修改applicaiton.yml裡面的埠為8002,application name不換 2.啟動eureka,兩個client 3.新建一個專案  ribbon-c

SpringCloud eureka 客戶端

1.新建一個專案 eureka-client 2.pom如下 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"   

白話SpringCloud | 章:分散式配置中心的服務化及動態重新整理

前言 上一章節,簡單介紹了分散式配置中心Spring Cloud Config的使用。同時,我們也遺漏了一些問題,比如如何配置實時生效,當服務端地址變更或者叢集部署時,如何指定服務端地址?回想,在服務註冊章節,服務提供者和服務消費者,同時往註冊中心進行註冊和獲取服務地址,而本身註冊中心又支援高可用配置。所以

springcloud()netflix zuul

netflix zuul introduction zuul用來提供動態路由、監控、授權、安全、排程等等的邊緣服務(edge service) ZuulFilter ZuulFilter是Zuul中核心元件,通過繼承該抽象類,覆寫幾個關鍵方法達到

【Spring Cloud】分散式必學springcloud)——配置Feign重試機制

一、前言       在上一篇部落格中,小編向大家介紹了Feign的負載均衡和斷路器的使用。在這篇部落格中,小編向大家介紹一下Ribbon在Feign的配置以及Feign的重試機制。 二、Ribbo

跟我學SpringCloud | :熔斷器Hystrix

跟我學SpringCloud | 第四篇:熔斷器Hystrix 1. 熔斷器 服務雪崩 在正常的微服務架構體系下,一個業務很少有隻需要呼叫一個服務就可以返回資料的情況,這種比較常見的是出現在demo中,一般都是存在呼叫鏈的,比如A->B->C->D,如果D在某一個瞬間出現問題,比如網路波動,

跟我學SpringCloud | :熔斷監控Hystrix Dashboard和Turbine

SpringCloud系列教程 | 第五篇:熔斷監控Hystrix Dashboard和Turbine Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如無特殊說明,本系列教程全採用以上版本 Hystrix-dashboard是一款針對Hy

跟我學SpringCloud | :Spring Cloud Config Github配置中心

SpringCloud系列教程 | 第六篇:Spring Cloud Config Github配置中心 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如無特殊說明,本系列教程全採用以上版本 隨著分散式專案越來越大,勤勞的程式猿們會開始面