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 如無特殊說明,本系列教程全採用以上版本 隨著分散式專案越來越大,勤勞的程式猿們會開始面