摘要:對(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") Listcontributors(@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
摘要:不過,我們搭建好框架就是為了消費(fèi)它使用它,那么這篇文章就來看看如何去消費(fèi)使用我們之前搭建起來的服務(wù)吧首先本文是基于上一篇文章進(jìn)行的。代碼如下啟動(dòng)程序,多次訪問,瀏覽器顯示內(nèi)容為至此我們這個(gè)服務(wù)消費(fèi)的框架就搭建完畢了。。。 上一篇文章主要介紹了如何搭建一個(gè)簡(jiǎn)單的springcloud框架。不過,我們搭建好框架就是為了消費(fèi)它使用它,那么這篇文章就來看看如何去消費(fèi)使用我們之前搭建起來的服務(wù)吧...
摘要:不過大多數(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...
摘要:不過大多數(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...
摘要:內(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)行注釋。它具有可插拔注釋支持,包...
閱讀 926·2021-11-22 13:54
閱讀 2853·2021-09-28 09:36
閱讀 2993·2019-08-30 15:55
閱讀 1960·2019-08-30 15:44
閱讀 554·2019-08-29 12:31
閱讀 2570·2019-08-28 18:18
閱讀 1208·2019-08-26 13:58
閱讀 1394·2019-08-26 13:44