成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Spring Cloud中如何優(yōu)雅的使用Feign調(diào)用接口

ChanceWong / 3321人閱讀

摘要:對(duì)進(jìn)行了封裝,使其支持標(biāo)準(zhǔn)注解和??梢耘c和組合使用以支持負(fù)載均衡。中使用當(dāng)我們搭建好注冊(cè)中心之后,就是需要將自己的服務(wù)注冊(cè)到中,然后別的服務(wù)可以直接調(diào)用。

JAVA 項(xiàng)目中接口調(diào)用怎么做 ?

Httpclient

Okhttp

Httpurlconnection

RestTemplate

上面是最常見的幾種用法,我們今天要介紹的用法比上面的更簡(jiǎn)單,方便,它就是 Feign

Feign是一個(gè)聲明式的REST客戶端,它的目的就是讓REST調(diào)用更加簡(jiǎn)單。

Feign提供了HTTP請(qǐng)求的模板,通過編寫簡(jiǎn)單的接口和插入注解,就可以定義好HTTP請(qǐng)求的參數(shù)、格式、地址等信息。

而Feign則會(huì)完全代理HTTP請(qǐng)求,我們只需要像調(diào)用方法一樣調(diào)用它就可以完成服務(wù)請(qǐng)求及相關(guān)處理。

SpringCloud對(duì)Feign進(jìn)行了封裝,使其支持SpringMVC標(biāo)準(zhǔn)注解和HttpMessageConverters。

Feign可以與Eureka和Ribbon組合使用以支持負(fù)載均衡。

SpringCloud中使用Feign

當(dāng)我們搭建好注冊(cè)中心Eureka之后,就是需要將自己的服務(wù)注冊(cè)到Eureka中,然后別的服務(wù)可以直接調(diào)用。

首先呢是服務(wù)提供方需要注冊(cè)到Eureka中,這邊我們新建一個(gè)房產(chǎn)服務(wù)fangjia-fsh-house-service

fangjia-fsh-house-service中提供跟房子相關(guān)的接口,比如最簡(jiǎn)單的獲取房子的基本信息

/**
 * 獲取房產(chǎn)信息
 * @param houseId 房產(chǎn)編號(hào)
 * @return 
 */
 @GetMapping("/{houseId}")
 public ResponseData hosueInfo(@PathVariable("houseId")Long houseId) {
     return ResponseData.ok(houseService.getHouseInfo(houseId));
 }

另外我們起一個(gè)項(xiàng)目來消費(fèi)房產(chǎn)服務(wù)的這個(gè)接口,房產(chǎn)置換服務(wù)fangjia-fsh-substitution-service

/**
 * 獲取置換信息
 * @param sid
 * @return
 */
 @GetMapping("/{sid}")
 public ResponseData substitutionInfo(@PathVariable("sid") Long sid) {
     return ResponseData.ok(substitutionService.getSubstitutionInfo(sid));
 }

在substitutionService中需要消費(fèi)房產(chǎn)服務(wù)的獲取房產(chǎn)信息接口,一般的做法我們都會(huì)通過Httpclient或者最底層的Httpurlconnection來直接調(diào)用接口,當(dāng)然這些都需要自己集成或者封裝,在spring里面已經(jīng)有了一個(gè)很好的封裝,那就是RestTemplate來調(diào)用接口。

關(guān)于RestTemplate的使用可以查看我的這篇文章:http://cxytiandi.com/blog/detail/6157

可以直接注入對(duì)象,然后調(diào)用接口,這種方式唯一的弊端就是你需要知道服務(wù)提供者的地址,根據(jù)指定的地址來進(jìn)行調(diào)用

@Autowired
private RestTemplate restTemplate;

@Override
public SubstitutionDto getSubstitutionInfo(Long sid) {
    House house = this.restTemplate.getForObject("http://localhost:8000/hosue/" + id, House.class);
  // .......
}

另一種就是我們今天的主角,簡(jiǎn)單的調(diào)用方式就是使用一個(gè)聲明式的REST客戶端Feign來進(jìn)行接口調(diào)用

用了Feign之后調(diào)用接口只需要定義相同的接口即可實(shí)現(xiàn)調(diào)用

使用Feign肯定要引入jar的依賴


    org.springframework.cloud
    spring-cloud-starter-feign

在啟動(dòng)類上加@EnableFeignClients注解,如果你的Feign接口定義跟你的啟動(dòng)類不在一個(gè)包名下,還需要制定掃描的包名@EnableFeignClients(basePackages = "com.fangjia.api.client")

這邊建議大家將接口的消費(fèi)定義,多帶帶抽一個(gè)項(xiàng)目出來,后面打成公共的jar,這樣無論是哪個(gè)項(xiàng)目需要調(diào)用接口,引入公共的接口SDK jar即可,不用重新定義一遍了。

**
 * 房生活房產(chǎn)服務(wù)API調(diào)用客戶端
 *
 * @author yinjihuan
 * @create 2017-10-27 13:55
 **/
@FeignClient(value = "fangjia-fsh-house-service", path = "/house", configuration = FeignConfiguration.class, fallback = HouseRemoteClientHystrix.class)
public interface HouseRemoteClient {
    
    /**
     * 獲取企業(yè)下某用戶的有效房產(chǎn)信息
     * @param eid    企業(yè)編號(hào)
     * @param uid    用戶編號(hào)
     * @return
     */
    @GetMapping("/list/{eid}/{uid}")
    public HouseListDto hosueList(@PathVariable("eid")Long eid, @PathVariable("uid")String uid);    
    
    /**
     * 獲取房產(chǎn)詳細(xì)信息
     * @param houseId 房產(chǎn)編號(hào)
     * @return
     */
    @GetMapping("/{houseId}")
    public HouseInfoDto hosueInfo(@PathVariable("houseId")Long houseId);
    
}

@FeignClient里的value表示你要消費(fèi)哪個(gè)服務(wù)的接口,path就是統(tǒng)一的前綴,也就是我們HouseController中類上面的@RequestMapping("/house")的地址

@FeignClient里的configuration可以讓你自定義配置信息來覆蓋Feign的默認(rèn)配置,
比如配置日志輸出

日志的輸出還需要在配置文件中指定才能生效logging.level.com.fangjia.api.client.fsh.house.HouseRemoteClient=DEBUG

@Configuration
public class FeignConfiguration {
    @Bean  
    Logger.Level feignLoggerLevel() {  
        return Logger.Level.FULL;  
    }  
}

@FeignClient里的fallback可以讓你的接口在熔斷處理時(shí),返回默認(rèn)的值給調(diào)用方,這個(gè)一般有2種方式:

實(shí)現(xiàn)Feign的接口,實(shí)現(xiàn)所有的默認(rèn)方法

/**
 * 房產(chǎn)服務(wù)調(diào)用熔斷默認(rèn)返回處理
 *
 * @author yinjihuan
 * @create 2017-10-29 14:30
 **/
@Component
public class HouseRemoteClientHystrix implements HouseRemoteClient {

    @Override
    public HouseListDto hosueList(Long eid, String uid) {
        return new HouseListDto();
    }

    @Override
    public HouseInfoDto hosueInfo(Long houseId) {
        return new HouseInfoDto();
    }
}

另一種就是@FeignClient里的fallbackFactory,效果是一樣的

使用的話更簡(jiǎn)單了,和普通的Service的類一樣使用,注入進(jìn)來,然后直接調(diào)用方法就相當(dāng)于調(diào)用遠(yuǎn)程接口了

@Autowired
private HouseRemoteClient houseRemoteClient;

HouseInfoDto houseInfoDto = houseRemoteClient.hosueInfo(1L);
普通Java項(xiàng)目中如何使用Feign

通過上面的講解,在SpringCloud中使用Feign顯得那么的自然,因?yàn)榧蛇@件事SpringCloud已經(jīng)幫我們做好了,這是廣大開發(fā)人員的福音。

那如果你們沒有使用SpringCloud來進(jìn)行開發(fā),我能用Feign來調(diào)用接口馬,答案是:當(dāng)然

首先你需要看一遍文檔,如果還不會(huì)用你來找我:https://github.com/OpenFeign/feign

我們看官方的提個(gè)Demo:

定義了一個(gè)GitHub的接口調(diào)用類,上面配置了請(qǐng)求方式以及參數(shù),是通過Feign自帶的注解方式配置的

然后通過Feign.builder()構(gòu)建一個(gè)客戶端,同時(shí)可以設(shè)置編碼,解碼需要用到的類,以及訪問的目標(biāo)地址等等信息,當(dāng)然也包括日志的設(shè)置,輸出等等。。

interface GitHub {
  @RequestLine("GET /repos/{owner}/{repo}/contributors")
  List contributors(@Param("owner") String owner, @Param("repo") String repo);
}

static class Contributor {
  String login;
  int contributions;
}

public static void main(String... args) {
  GitHub github = Feign.builder()
                       .decoder(new GsonDecoder())
                       .target(GitHub.class, "https://api.github.com");

  // Fetch and print a list of the contributors to this library.
  List contributors = github.contributors("OpenFeign", "feign");
  for (Contributor contributor : contributors) {
    System.out.println(contributor.login + " (" + contributor.contributions + ")");
  }
}

具體代碼可以參考我的github:

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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70871.html

相關(guān)文章

  • springcloud框架簡(jiǎn)單搭建(消費(fèi)服務(wù)基于feign

    摘要:不過,我們搭建好框架就是為了消費(fèi)它使用它,那么這篇文章就來看看如何去消費(fèi)使用我們之前搭建起來的服務(wù)吧首先本文是基于上一篇文章進(jìn)行的。代碼如下啟動(dòng)程序,多次訪問,瀏覽器顯示內(nèi)容為至此我們這個(gè)服務(wù)消費(fèi)的框架就搭建完畢了。。。 上一篇文章主要介紹了如何搭建一個(gè)簡(jiǎn)單的springcloud框架。不過,我們搭建好框架就是為了消費(fèi)它使用它,那么這篇文章就來看看如何去消費(fèi)使用我們之前搭建起來的服務(wù)吧...

    xiguadada 評(píng)論0 收藏0
  • 拜托!面試請(qǐng)不要再問我Spring Cloud底層原理!

    摘要:不過大多數(shù)講解還停留在對(duì)功能使用的層面,其底層的很多原理,很多人可能并不知曉。每個(gè)線程池里的線程就僅僅用于請(qǐng)求那個(gè)服務(wù)。 歡迎關(guān)注微信公眾號(hào):石杉的架構(gòu)筆記(id:shishan100) 每日更新!精品技術(shù)文章準(zhǔn)時(shí)送上! 目錄 一、業(yè)務(wù)場(chǎng)景介紹 二、Spring Cloud核心組件:Eureka 三、Spring Cloud核心組件:Feign 四、Spring Cloud核心組件:R...

    wums 評(píng)論0 收藏0
  • 拜托!面試請(qǐng)不要再問我Spring Cloud底層原理!

    摘要:不過大多數(shù)講解還停留在對(duì)功能使用的層面,其底層的很多原理,很多人可能并不知曉。每個(gè)線程池里的線程就僅僅用于請(qǐng)求那個(gè)服務(wù)。 歡迎關(guān)注微信公眾號(hào):石杉的架構(gòu)筆記(id:shishan100) 每日更新!精品技術(shù)文章準(zhǔn)時(shí)送上! 目錄 一、業(yè)務(wù)場(chǎng)景介紹 二、Spring Cloud核心組件:Eureka 三、Spring Cloud核心組件:Feign 四、Spring Cloud核心組件:R...

    wangjuntytl 評(píng)論0 收藏0
  • spring-cloud-feign源碼深度解析

    摘要:內(nèi)部使用了的動(dòng)態(tài)代理為目標(biāo)接口生成了一個(gè)動(dòng)態(tài)代理類,這里會(huì)生成一個(gè)動(dòng)態(tài)代理原理統(tǒng)一的方法攔截器,同時(shí)為接口的每個(gè)方法生成一個(gè)攔截器,并解析方法上的元數(shù)據(jù),生成一個(gè)請(qǐng)求模板。的核心源碼解析到此結(jié)束了,不知道是否對(duì)您有無幫助,可留言跟我交流。 Feign是一個(gè)聲明式的Web服務(wù)客戶端。這使得Web服務(wù)客戶端的寫入更加方便 要使用Feign創(chuàng)建一個(gè)界面并對(duì)其進(jìn)行注釋。它具有可插拔注釋支持,包...

    vibiu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<