国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

服務器之家 - 編程語言 - JAVA教程 - Spring Cloud Feign實例講解學習

Spring Cloud Feign實例講解學習

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

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

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

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

案例一:

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

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

服務調用方:https://github.com/yejingtao/forblog/tree/master/demo-feign-freeconsumer

服務提供方就是個簡單的EurekaClient端+web應用,提供以下方法

?
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.

如果缺少了以上注解,服務運行起來以后雖然不會報錯,但是獲取不到入參。

服務調用方項目:

?
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 超時時間設置
#ribbon:
# ConnectTimeout: 500
# ReadTimeout: 3000

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

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包里的內容,我的pom里并沒有引入Hystrix。所以這一點Spring Cloud做的還是有不足的地方,直接用@SpringCloudApplication編譯不會報錯,但是啟動不了。當然這里的主角還是@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上的服務名,fallback是服務降級后的接口實現類。

@RequestMapping里指定了請求的相對url和http請求方式,與服務端一一對應。入參里的@RequestParam、

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

降級服務代碼:

?
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";
  }
}

發現這里的入參里我故意去掉了@RequestParam、@RequestBody、@RequestHeader注解,因為這幾個注解本質上的意義就在于Feign在做微服務調用的時候對http傳遞參數用的,但服務降級根本不會做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實例講解學習

Spring Cloud Feign實例講解學習

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

再看一組:

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

Spring Cloud Feign實例講解學習

Spring Cloud Feign實例講解學習

在案例一中我們總有種感覺,服務提供方和服務調用方存在重復的代碼,是否可以進行優化?請看案例二。

案例二:

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

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

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

服務調用方:https://github.com/yejingtao/forblog/tree/master/demo-feign-apiconsumer

案例二最大的變動是將服務能力單獨寫到一個API的project中,調用方和提供方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);   
}

服務提供方:

?
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();
  }      
}

服務調用方:

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

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

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品蜜桃一区二区三区 | 91tv.com| 成人福利在线 | 久久精品国产久精国产 | 欧美成人免费在线视频 | 国内精品一区二区 | 亚洲高清毛片一区二区 | 999国产在线 | 精品久久久久久亚洲精品 | 特黄一级 | 日韩理伦片在线观看视频播放 | 黄色大片网站 | 亚洲 欧美 另类 综合 偷拍 | 天天综合7799精品影视 | 欧美日韩国产在线播放 | 黄色小视频在线 | 亚洲第一av网站 | 3344视频 | 亚洲国产成人精品久久久国产成人一区 | 天堂在线免费视频 | 亚洲欧美日韩国产综合精品二区 | 亚洲综合中文 | 亚洲免费一区二区 | 亚洲视频二区 | 久久久一 | 成人片免费看 | 国产精品毛片无码 | 午夜免费av | 中文字幕一区二区三区四区 | 在线理论电影 | 欧美福利电影在线观看 | 黄免费 | 成人国产免费视频 | 亚洲激情在线 | 午夜久久久久久久 | av中文字幕在线播放 | 蜜桃一区 | 国产精品99久久久久久动医院 | 色综合中文 | 中文字幕天天操 | 国产一区二区三区久久久久久久久 |