javascript
Spring Cloud OpenFeign使用教程
文章目錄
- Spring Cloud OpenFeign Demo
- 怎么配置OpenFeignServer
- 怎么配置OpenFeignClient
- 多個(gè)參數(shù)傳遞問題
- FeignClient的日志問題
- 多個(gè)FeignClient使用同一個(gè)name的問題
- 如何運(yùn)行
Spring Cloud OpenFeign Demo
之前項(xiàng)目中需要在Spring Cloud中使用OpenFeign的情況,Spring Cloud的版本是目前最新的Greenwich.SR2版本,對(duì)應(yīng)的Spring boot是2.1.7.RELEASE。
在網(wǎng)上找了很多資料,大多言之不詳,并且版本也比較低,不適合我的最新版本Spring Cloud的需求。 所以決定還是自己寫個(gè)教程。
本教程要解決如下幾個(gè)問題:
怎么配置OpenFeignServer
我們知道OpenFeign是用在Spring Cloud中的聲明式的web service client。
OpenFeignServer就是一個(gè)普通的Rest服務(wù),不同的是我們需要將他注冊(cè)到eureka server上面,方便后面的OpenFeignClient調(diào)用。
啟動(dòng)類如下:
@SpringBootApplication @EnableDiscoveryClient public class OpenFeignServer {public static void main(String[] args) {SpringApplication.run(OpenFeignServer.class, args);} }我們定義了兩個(gè)Rest服務(wù):
OrderController:
@Slf4j @RestController @RequestMapping(path = "/order") public class OrderController {/*** PostMapping with @RequestBody* @param user*/@PostMapping("doOrder")public void doOrder(@RequestBody User user){log.info("do order !!!!");} }UserController:
@RestController @RequestMapping(path = "/user") public class UserController {/*** GetMapping example with @RequestParam* @param userId* @return userName*/@GetMapping("getUserName")public String getUserName(@RequestParam("userId") String userId){if("100".equals(userId)) {return "張學(xué)友";}else{return "劉德華";}}/*** GetMapping example with @RequestParam and @SpringQueryMap* @param userId* @param user* @return userAge*/@GetMapping("getUserAge")public String getUserAge(@RequestParam("userId") String userId, @SpringQueryMap User user){if("100".equals(userId)) {return "20";}else{return "18";}} }我們將其注冊(cè)到eureka上面,名字為openfeign-server
spring:application:name: openfeign-server怎么配置OpenFeignClient
OpenFeignClient的pom依賴如下:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>配置OpenFeignClient只需要使用@FeignClient來注解一個(gè)interface即可,如下所示:
@FeignClient(value = "openfeign-server") @RequestMapping(path = "/user") public interface UserClient {@GetMapping("getUserName")public String getUserName(@RequestParam("userId") String userId);@GetMapping("getUserAge")public String getUserAge(@RequestParam("userId") String userId, @SpringQueryMap User user); }其中@FeignClient中的value是要調(diào)用的服務(wù)的注冊(cè)名,即OpenFeignServer在eureka的注冊(cè)名。
FeignClient的 Request路徑,方式和參數(shù)要和被調(diào)用的Rest服務(wù)保持一致。
這樣我們就可以像下面一樣來調(diào)用OpenFeignClient了:
@Slf4j @RestController public class UserController {@Autowiredprivate UserClient userClient;@GetMapping("getUserName2")public void getUserName(){log.info(userClient.getUserName("100"));} }多個(gè)參數(shù)傳遞問題
一般我們會(huì)使用@GetMapping和@PostMapping兩種方式來調(diào)用Rest服務(wù)。
而接收的參數(shù)則會(huì)使用@RequestParam和@RequestBody來獲取。
首先我們講一下@RequestBody,@RequestBody只能用在Post請(qǐng)求,并且一個(gè)Post請(qǐng)求只能有一個(gè)@RequestBody。 @RequestBody的參數(shù)可以包括復(fù)雜類型。
然后我們講一下@RequestParam,@RequestParam可以用在Post和Get請(qǐng)求中,但是要注意:@RequestParam 的參數(shù)只能是基本類型或者Enum,或者List和Map(List和Map里面也只能是基本類型)。所以@RequestParam可以和@RequestBody一起使用。
如果我們是Get請(qǐng)求,但是又有復(fù)合類型怎么辦? 比如我們想傳遞一個(gè)User對(duì)象。User對(duì)象里面只有普通的兩個(gè)String屬性。 這里我們可以使用@SpringQueryMap:
@GetMapping("getUserAge")public String getUserAge(@RequestParam("userId") String userId, @SpringQueryMap User user);注意:@SpringQueryMap后面的參數(shù)只能是普通的POJO,不能是復(fù)合類型,否則解析不了。如果必須使用復(fù)合類型,那么使用@RequestBody吧。
FeignClient的日志問題
OpenFeign的Logger.Level有4種級(jí)別:
- NONE 沒有日志
- BASIC 請(qǐng)求方法,請(qǐng)求URL,返回Code和執(zhí)行時(shí)間
- HEADERS 請(qǐng)求和返回的頭部基本信息
- FULL 請(qǐng)求和返回的頭部,內(nèi)容,元數(shù)據(jù)
要想使用這些級(jí)別,必須將OpenFeignClient的logger設(shè)置成debug級(jí)別:
#日志配置 logging:level:com:flydean: debug同時(shí)我們?cè)诖a中配置OpenFeign的日志級(jí)別:
@Configuration public class CustFeignLogConfig {@BeanLogger.Level feignLoggerLevel() {return Logger.Level.FULL;} }這樣我們?cè)谌罩纠锩婢涂梢钥吹紻EBUG的所有HTTP請(qǐng)求信息。
多個(gè)FeignClient使用同一個(gè)name的問題
其實(shí)這里我們的Server定義了兩個(gè)Rest服務(wù),User和Order。
上面我們講到了可以這樣定義UserClient:
@FeignClient(value = "openfeign-server") @RequestMapping(path = "/user") public interface UserClient {... }如果我們同樣的這樣定義OrderClient:
@FeignClient(value = "openfeign-server") @RequestMapping(path = "/order") public interface OrderClient {... }運(yùn)行時(shí)候就會(huì)報(bào)錯(cuò)。 原因是兩個(gè)FeignClient使用了同一個(gè)value!
那怎么解決這個(gè)問題呢?
/*** 因?yàn)?#64;FeignClient的value不能重復(fù),所以需要在這里以自定義的方式來創(chuàng)建* @author wayne* @version FeignClientController, 2019/9/5 7:07 下午*/ @Data @Component @Import(FeignClientsConfiguration.class) public class FeignClientController {private OrderClient orderClient;private UserClient userClient;public FeignClientController(Decoder decoder, Encoder encoder, Client client, Contract contract) {this.orderClient = Feign.builder().client(client).encoder(encoder).decoder(decoder).contract(contract)//默認(rèn)是Logger.NoOpLogger.logger(new Slf4jLogger(OrderClient.class))//默認(rèn)是Logger.Level.NONE.logLevel(Logger.Level.FULL).target(OrderClient.class, "http://openfeign-server");this.userClient = Feign.builder().client(client).encoder(encoder).decoder(decoder).contract(contract)//默認(rèn)是Logger.NoOpLogger.logger(new Slf4jLogger(UserClient.class))//默認(rèn)是Logger.Level.NONE.logLevel(Logger.Level.FULL).target(UserClient.class, "http://openfeign-server");} }方法就是手動(dòng)創(chuàng)建FeignClient, 上面的例子中,我們手動(dòng)創(chuàng)建了OrderClient和UserClient兩個(gè)FeignClient。
注意下面的代碼片段,手動(dòng)創(chuàng)建的FeignClient默認(rèn)是沒有l(wèi)ogger和logLevel的。所以上面我們配置好的log信息對(duì)手動(dòng)創(chuàng)建的FeignClient是無(wú)效的。 下面展示了如何手動(dòng)添加:
//默認(rèn)是Logger.NoOpLogger.logger(new Slf4jLogger(OrderClient.class))//默認(rèn)是Logger.Level.NONE.logLevel(Logger.Level.FULL)如何運(yùn)行
本項(xiàng)目的模塊都是以spring boot構(gòu)建的,直接在編譯器中運(yùn)行Main方法即可啟動(dòng)。
openfeign-registry-server會(huì)啟動(dòng)eureka server,供后面的OpenFeignServer和OpenFeignClient注冊(cè)。
啟動(dòng)openfeign-server
啟動(dòng)openfeign-client
測(cè)試openFeignClient
get請(qǐng)求url: http://localhost:8000/getUserName1
查看日志,看看輸出吧。
本項(xiàng)目代碼地址 :spring-cloud-openfeign-demo
更多精彩內(nèi)容且看:
- 區(qū)塊鏈從入門到放棄系列教程-涵蓋密碼學(xué),超級(jí)賬本,以太坊,Libra,比特幣等持續(xù)更新
- Spring Boot 2.X系列教程:七天從無(wú)到有掌握Spring Boot-持續(xù)更新
- Spring 5.X系列教程:滿足你對(duì)Spring5的一切想象-持續(xù)更新
- java程序員從小工到專家成神之路(2020版)-持續(xù)更新中,附詳細(xì)文章教程
更多教程請(qǐng)參考 flydean的博客
總結(jié)
以上是生活随笔為你收集整理的Spring Cloud OpenFeign使用教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 公钥私钥
- 下一篇: Spring Cloud sleuth