激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務(wù)器之家 - 編程語言 - JAVA教程 - Spring Cloud Feign實例講解學(xué)習(xí)

Spring Cloud Feign實例講解學(xué)習(xí)

2021-04-07 13:13牛麥康納 JAVA教程

這篇文章主要介紹了Spring Cloud Feign實例講解學(xué)習(xí),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前面博文搭建了一個Eureka+Ribbon+Hystrix的框架,雖然可以基本滿足服務(wù)之間的調(diào)用,但是代碼看起來實在丑陋,每次客戶端都要寫一個restTemplate,為了讓調(diào)用更美觀,可讀性更強,現(xiàn)在我們開始學(xué)習(xí)使用Feign

Feign包含了Ribbon和Hystrix,這個在實戰(zhàn)中才慢慢體會到它的意義,所謂的包含并不是Feign的jar包包含有Ribbon和Hystrix的jar包這種物理上的包含,而是Feign的功能包含了其他兩者的功能這種邏輯上的包含。簡言之:Feign能干Ribbon和Hystrix的事情,但是要用Ribbon和Hystrix自帶的注解必須要引入相應(yīng)的jar包才可以。

案例一:

Eureka注冊中心:https://github.com/yejingtao/forblog/tree/master/demo-eureka-register

服務(wù)提供方:https://github.com/yejingtao/forblog/tree/master/demo-feign-freeservice

服務(wù)調(diào)用方:https://github.com/yejingtao/forblog/tree/master/demo-feign-freeconsumer

服務(wù)提供方就是個簡單的EurekaClient端+web應(yīng)用,提供以下方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@RestController
@RequestMapping("/feign-service")
public class HelloServiceContorller {
  private Logger logger = LoggerFactory.getLogger(this.getClass());   
  private void sleep(String methodName) {
    int sleepMinTime = new Random().nextInt(3000);
    logger.info("helloService "+methodName+" sleepMinTime: "+sleepMinTime);
    try {
      Thread.sleep(sleepMinTime);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
   
  @RequestMapping(value="/serviceGet",method=RequestMethod.GET)
  public String helloService(@RequestParam String name) {
    sleep("get");
    return "HelloServiceImpl name :"+name;
  }
   
  @RequestMapping(value="/serviceHead", method=RequestMethod.HEAD)
  public String helloService(@RequestHeader String name,
      @RequestHeader String password) {
    sleep("header");
    return "helloServiceHead name :"+name +" password:"+password;
  }
   
  @RequestMapping(value="/servicePost", method=RequestMethod.POST)
  public String helloService(@RequestBody UserDemo userDemo) {
    sleep("post");
    return userDemo.toString();
  }
}

需要注意的以下注解不可以省略。

@RequestParam:Annotation which indicates that amethod parameter should be bound to a web request parameter

@RequestBody:Annotation indicating a methodparameter should be bound to the body of the web request.

@RequestHeader:Annotation which indicates that amethod parameter should be bound to a web request header.

如果缺少了以上注解,服務(wù)運行起來以后雖然不會報錯,但是獲取不到入?yún)ⅰ?/p>

服務(wù)調(diào)用方項目:

?
1
2
3
4
<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-feign</artifactId>
    </dependency>

這里只依賴了Feign,沒有依賴Ribbon和Hystrix。

application.yml:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server:
 port: 9051
 
spring:
 application:
  name: demo-feign-freeconsumer
   
eureka:
 client:
  serviceUrl:
   defaultZone: http://peer1:1111/eureka/,http://peer2:1112/eureka/
feign:
 hystrix:
  enabled: true
 
#Ribbon 超時時間設(shè)置
#ribbon:
# ConnectTimeout: 500
# ReadTimeout: 3000

hystrix這個配置坑了我好久我用的Spring Cloud是Dalston版本SR1,比網(wǎng)上其他材料的版本要新,因為在新版本中Feign對Hystrix的支持默認是關(guān)閉的,所以要通過配置手動打開feign.hystrix.enabled=true,這樣服務(wù)降級等功能才有效果。

Application啟動程序

?
1
2
3
4
5
6
7
8
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class DemoFeignApplication {   
  public static void main(String[] args) {
    SpringApplication.run(DemoFeignApplication.class, args);
  }
}

注意這里還有個坑,我這里用的是@SpringBootApplication+@EnableEurekaClient,而不是用的@SpringCloudApplication,因為后者包含了@EnableCircuitBreaker,而@EnableCircuitBreaker又是屬于Hystrix包里的內(nèi)容,我的pom里并沒有引入Hystrix。所以這一點Spring Cloud做的還是有不足的地方,直接用@SpringCloudApplication編譯不會報錯,但是啟動不了。當(dāng)然這里的主角還是@EnableFeignClients這個注解。

核心客戶端代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
@FeignClient(name="demo-feign-freeservice",fallback=DemoFeignFallback.class)
public interface DemoFeignService{
    
  @RequestMapping(value="/feign-service/serviceGet",method=RequestMethod.GET)
  String helloService(@RequestParam("name") String name);
   
  @RequestMapping(value="/feign-service/serviceHead", method=RequestMethod.HEAD)
  String helloService(@RequestHeader("name") String name,
      @RequestHeader("password") String password);
   
  @RequestMapping(value="/feign-service/servicePost", method=RequestMethod.POST)
  String helloService(@RequestBody UserDemo userDemo); 
}

@FeignClient注解定義了該接口是一個Feign客戶端,name指定了注冊到Eureka上的服務(wù)名,fallback是服務(wù)降級后的接口實現(xiàn)類。

@RequestMapping里指定了請求的相對url和http請求方式,與服務(wù)端一一對應(yīng)。入?yún)⒗锏腀RequestParam、

@RequestBody、@RequestHeader注解比起服務(wù)端多了value屬性,這里不能省略,需要顯式的告知Feign客戶端參數(shù)要如何對應(yīng)。

降級服務(wù)代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Component
public class DemoFeignFallback implements DemoFeignService{
  @Override
  public String helloService(String name) {
    return "get error";
  }
 
  @Override
  public String helloService(String name,String password) {
    return "head error";
  }
   
  @Override
  public String helloService(UserDemo userDemo) {
    return "post error";
  }
}

發(fā)現(xiàn)這里的入?yún)⒗镂夜室馊サ袅薂RequestParam、@RequestBody、@RequestHeader注解,因為這幾個注解本質(zhì)上的意義就在于Feign在做微服務(wù)調(diào)用的時候?qū)ttp傳遞參數(shù)用的,但服務(wù)降級根本不會做http請求了,所以此處可以省略。

Controller代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@RestController
public class DemoFeignController {   
  @Autowired
  private DemoFeignService demoFeignService;   
  @RequestMapping(value="/test", method=RequestMethod.GET)
  public String demoServiceTest() {
    StringBuffer sb = new StringBuffer();
    sb.append(demoFeignService.helloService("yuanyuan"));
    sb.append("\n");
    sb.append(demoFeignService.helloService("yjt","xixihaha"));
    sb.append("\n");
    sb.append(demoFeignService.helloService(new UserDemo("yejingtao","123456")));
    return sb.toString();     
  }
}

我們來看效果:

Spring Cloud Feign實例講解學(xué)習(xí)

Spring Cloud Feign實例講解學(xué)習(xí)

我們服務(wù)都沒超時,3個方法全部正常,但是head請求沒有拿到返回值,這個是因為head方式http請求的特性決定的,head不返回response的body體,一般用來做連通性測試來用。

再看一組:

運氣不好head和post請求方法處理時間超過了2000ms,服務(wù)降級,實現(xiàn)被fallback處理類取代。

Spring Cloud Feign實例講解學(xué)習(xí)

Spring Cloud Feign實例講解學(xué)習(xí)

在案例一中我們總有種感覺,服務(wù)提供方和服務(wù)調(diào)用方存在重復(fù)的代碼,是否可以進行優(yōu)化?請看案例二。

案例二:

Eureka注冊中心:https://github.com/yejingtao/forblog/tree/master/demo-eureka-register

接口API:https://github.com/yejingtao/forblog/tree/master/demo-feign-serviceapi

服務(wù)提供方:https://github.com/yejingtao/forblog/tree/master/demo-feign-serviceimpl

服務(wù)調(diào)用方:https://github.com/yejingtao/forblog/tree/master/demo-feign-apiconsumer

案例二最大的變動是將服務(wù)能力單獨寫到一個API的project中,調(diào)用方和提供方pom都依賴這個API。

API:

?
1
2
3
4
5
6
7
8
9
10
11
public interface HelloService {   
  @RequestMapping(value="/feign-service/serviceGet",method=RequestMethod.GET)
  String helloService(@RequestParam("name") String name);
   
  @RequestMapping(value="/feign-service/serviceHead", method=RequestMethod.HEAD)
  String helloService(@RequestHeader("name") String name,
      @RequestHeader("password") String password);
   
  @RequestMapping(value="/feign-service/servicePost", method=RequestMethod.POST)
  String helloService(@RequestBody UserDemo userDemo);   
}

服務(wù)提供方:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@RestController
public class HelloServiceContorller implements HelloService{   
  private Logger logger = LoggerFactory.getLogger(this.getClass());   
  private void sleep(String methodName) {
    int sleepMinTime = new Random().nextInt(3000);
    logger.info("helloService "+methodName+" sleepMinTime: "+sleepMinTime);
    try {
      Thread.sleep(sleepMinTime);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
   
  @Override
  public String helloService(@RequestParam("name") String name) {
    sleep("get");
    return "HelloServiceImpl name :"+name;
  }
   
  @Override
  public String helloService(@RequestHeader("name") String name,
      @RequestHeader("password") String password) {
    sleep("header");
    return "helloServiceHead name :"+name +" password:"+password;
  }
   
  @Override
  public String helloService(@RequestBody UserDemo userDemo) {
    sleep("post");
    return userDemo.toString();
  }      
}

服務(wù)調(diào)用方:

?
1
2
3
@FeignClient(name="demo-feign-serviceimpl", fallback=FeignServiceFallback.class)
public interface FeignService extends HelloService{ 
}

其它代碼基本不變,效果也一樣。

兩種風(fēng)格各有優(yōu)缺點:freestyle的更自由,服務(wù)端新增方法不會影響客戶端代碼,缺點是服務(wù)能力不同步服務(wù)能力的變動會引起異常;API格式服務(wù)端客戶端服務(wù)能力同步,但是接口的變動需要修改兩邊的代碼,需要構(gòu)建的時候就要考慮清楚。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://blog.csdn.net/yejingtao703/article/details/77748190

延伸 · 閱讀

精彩推薦
  • JAVA教程java Mail郵件接收工具類

    java Mail郵件接收工具類

    這篇文章主要介紹了java Mail郵件接收工具類,本文直接給出類實現(xiàn)代碼和使用示例,需要的朋友可以參考下 ...

    junjie3982019-12-10
  • JAVA教程解析Java的JVM以及類與對象的概念

    解析Java的JVM以及類與對象的概念

    這篇文章主要介紹了解析Java的JVM以及類與對象的概念,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下 ...

    goldensun1802020-01-06
  • JAVA教程Mybatis調(diào)用視圖和存儲過程的方法

    Mybatis調(diào)用視圖和存儲過程的方法

    MyBatis支持普通sql的查詢、視圖的查詢、存儲過程調(diào)用,是一種非常優(yōu)秀的持久層框架。接下來通過本文給大家介紹mybatis調(diào)用視圖和存儲過程的方法,感興...

    夏雪冬日2462020-06-22
  • JAVA教程Spring中@Async用法詳解及簡單實例

    Spring中@Async用法詳解及簡單實例

    這篇文章主要介紹了Spring中@Async用法詳解及簡單實例的相關(guān)資料,需要的朋友可以參考下...

    lqh4132020-08-06
  • JAVA教程Java groovy如何提升代碼運行效率

    Java groovy如何提升代碼運行效率

    這篇文章主要介紹了Java groovy如何提升代碼運行效率,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參...

    賈樹丙4072020-09-24
  • JAVA教程java中的char占幾個字節(jié)實例分析

    java中的char占幾個字節(jié)實例分析

    這篇文章主要介紹了java中的char占幾個字節(jié)實例分析的相關(guān)資料,需要的朋友可以參考下...

    Java之家1352020-09-05
  • JAVA教程Java如何基于反射機制獲取不同的類

    Java如何基于反射機制獲取不同的類

    這篇文章主要介紹了Java如何基于反射機制獲取不同的類,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可...

    whyha3422020-08-13
  • JAVA教程Maven本地打包war包實現(xiàn)代碼解析

    Maven本地打包war包實現(xiàn)代碼解析

    這篇文章主要介紹了Maven本地打包war包實現(xiàn)代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參...

    手撕高達的村長1362020-09-23
主站蜘蛛池模板: 石原莉奈日韩一区二区三区 | 全网免费毛片 | 国产精品岛国久久久久久久 | 一级黄色免费电影 | 91精品国产综合久久久动漫日韩 | 操碰 | 中文字幕极速在线观看 | 青青草国产在线视频 | 成人区一区二区三区 | 特级西西444www大精品视频免费看 | 一区二区三区欧美在线观看 | 成人mm视频在线观看 | 中国av免费在线观看 | 萌白酱福利视频在线网站 | 奶子吧naiziba.cc免费午夜片在线观看 | 国产免费观看电影网站 | 娇妻被各种姿势c到高潮小说 | 李宗瑞国产福利视频一区 | 色阁阁69婷婷 | 国产成人高清在线 | 久久精品视频网站 | 爱高潮www亚洲精品 国产精品一区自拍 | 在线看一级片 | 国产毛片毛片毛片 | av免费在线网 | 国产91精品一区二区麻豆亚洲 | 伊人一二三四区 | 3级毛片| 欧美成人精品一区二区三区 | 久久精品亚洲精品国产欧美kt∨ | 久久色网站| 日韩精品久久久久久久电影99爱 | av成人在线播放 | 宅男噜噜噜66一区二区 | 亚洲爱爱网站 | 国产精品嘿咻嘿咻在线播放 | 偷偷操偷偷操 | 成人9禁啪啪无遮挡免费 | 久久久久无码国产精品一区 | 国产一区二区三区在线免费 | 欧美精品国产综合久久 |