最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringCloud實(shí)戰(zhàn)之Feign聲明式服務(wù)調(diào)用

 更新時(shí)間:2018年05月18日 08:31:27   作者:蝸居在小黑屋操控世界  
這篇文章主要介紹了SpringCloud實(shí)戰(zhàn)之Feign聲明式服務(wù)調(diào)用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

在前面的文章中可以發(fā)現(xiàn)當(dāng)我們通過(guò)RestTemplate調(diào)用其它服務(wù)的API時(shí),所需要的參數(shù)須在請(qǐng)求的URL中進(jìn)行拼接,如果參數(shù)少的話或許我們還可以忍受,一旦有多個(gè)參數(shù)的話,這時(shí)拼接請(qǐng)求字符串就會(huì)效率低下,并且顯得好傻。

那么有沒(méi)有更好的解決方案呢?答案是確定的有,Netflix已經(jīng)為我們提供了一個(gè)框架:Feign。

Feign是一個(gè)聲明式的Web Service客戶端,它的目的就是讓W(xué)eb Service調(diào)用更加簡(jiǎn)單。Feign提供了HTTP請(qǐng)求的模板,通過(guò)編寫(xiě)簡(jiǎn)單的接口和插入注解,就可以定義好HTTP請(qǐng)求的參數(shù)、格式、地址等信息。

而Feign則會(huì)完全代理HTTP請(qǐng)求,我們只需要像調(diào)用方法一樣調(diào)用它就可以完成服務(wù)請(qǐng)求及相關(guān)處理。Feign整合了Ribbon和Hystrix(關(guān)于Hystrix我們后面再講),可以讓我們不再需要顯式地使用這兩個(gè)組件。

總起來(lái)說(shuō),F(xiàn)eign具有如下特性:

  1. 可插拔的注解支持,包括Feign注解和JAX-RS注解;
  2. 支持可插拔的HTTP編碼器和解碼器;
  3. 支持Hystrix和它的Fallback;
  4. 支持Ribbon的負(fù)載均衡;
  5. 支持HTTP請(qǐng)求和響應(yīng)的壓縮。

這看起來(lái)有點(diǎn)像我們springmvc模式的Controller層的RequestMapping映射。這種模式是我們非常喜歡的。Feign是用@FeignClient來(lái)映射服務(wù)的。

首先第一步,在原來(lái)的基礎(chǔ)上新建一個(gè)Feign模塊,接著引入相關(guān)依賴(lài),引入Feign依賴(lài),會(huì)自動(dòng)引入Hystrix依賴(lài)的,如下:

    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-eureka</artifactId>
      <version>1.3.5.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-feign</artifactId>
      <version>1.4.0.RELEASE</version>
    </dependency>

application.yml配置如下:

server:
 port: 8083
spring:
 application:
  name: feign-consumer
eureka:
 client:
  service-url:
   defaultZone: http://localhost:8888/eureka/,http://localhost:8889/eureka/

接著在前面文章中的的的兩個(gè)provider1和provider2兩個(gè)模塊的服務(wù)新增幾個(gè)方法,如下代碼所示:

/**
 * Created by cong on 2018/5/8.
 */
@RestController
public class HelloController {

  @RequestMapping("/hello")
  public String hello(){
    System.out.println("訪問(wèn)來(lái)1了......");
    return "hello1";
  }

  @RequestMapping("/hjcs")
  public List<String> laowangs(String ids){
    List<String> list = new ArrayList<>();
    list.add("laowang1");
    list.add("laowang2");
    list.add("laowang3");
    return list;
  }

  //新增的方法
  @RequestMapping(value = "/hellol", method= RequestMethod.GET)
  public String hello(@RequestParam String name) {
    return "Hello " + name;
  }

  @RequestMapping(value = "/hello2", method= RequestMethod.GET)
  public User hello(@RequestHeader String name, @RequestHeader Integer age) {
    return new User(name, age);
  }

  @RequestMapping(value = "/hello3", method = RequestMethod.POST)
  public String hello (@RequestBody User user) {
    return "Hello "+ user. getName () + ", " + user. getAge ();
  }

}

接著是上面代碼所需用到的User類(lèi),代碼如下:

/**
 * Created by cong 2017/12/2.
 */
public class User {

  private String name;
  private Integer age;

  //序列化傳輸?shù)臅r(shí)候必須要有空構(gòu)造方法,不然會(huì)出錯(cuò)
  public User() {
  }
  public User(String name, Integer age) {
    this.name = name;
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Integer getAge() {
    return age;
  }

  public void setAge(Integer age) {
    this.age = age;
  }
}

接下來(lái)用Feign的@FeignClient(“服務(wù)名稱(chēng)”)映射服務(wù)調(diào)用。代碼如下:

package hjc;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.*;

/**
 * Created by cong on 2018/5/17.
 */
//configuration = xxx.class 這個(gè)類(lèi)配置Hystrix的一些精確屬性
//value=“你用到的服務(wù)名稱(chēng)”

@FeignClient(value = "hello-service",fallback = FeignFallBack.class)
public interface FeignService {
  //服務(wù)中方法的映射路徑
  @RequestMapping("/hello")
  String hello();

  @RequestMapping(value = "/hellol", method= RequestMethod.GET)
  String hello(@RequestParam("name") String name) ;

  @RequestMapping(value = "/hello2", method= RequestMethod.GET)
  User hello(@RequestHeader("name") String name, @RequestHeader("age") Integer age);

  @RequestMapping(value = "/hello3", method= RequestMethod.POST)
  String hello(@RequestBody User user);
}

接著在Controller層注入FeiService這個(gè)接口,進(jìn)行遠(yuǎn)程服務(wù)調(diào)用,代碼如下:

/**
 * Created by cong on 2018/5/17.
 */
@RestController
public class ConsumerController {

  @Autowired
  FeignService feignService;

  @RequestMapping("/consumer")
  public String helloConsumer(){
    return feignService.hello();
  }

  @RequestMapping("/consumer2")
  public String helloConsumer2(){
    String r1 = feignService.hello("hjc");
    String r2 = feignService.hello("hjc", 23).toString();
    String r3 = feignService.hello(new User("hjc", 23));
    return r1 + "-----" + r2 + "----" + r3;
  }

}

接著在Feign模塊的啟動(dòng)類(lèi)哪里打上Eureka客戶端的注解@EnableDiscoveryClient  Feign客戶端的注解

@EnableFeignClients,代碼如下:

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class FeignApplication {

  public static void main(String[] args) {
    SpringApplication.run(FeignApplication.class, args);
  }
}

接著啟動(dòng)啟動(dòng)類(lèi),瀏覽器上輸入localhost:8083/consumer  運(yùn)行結(jié)果如下:

可以看到負(fù)載均衡輪詢出現(xiàn)hello1,hello2。

接著繼續(xù)在瀏覽器上輸入localhost:8083/consumer2,運(yùn)行結(jié)果如下:

接下來(lái)我們進(jìn)行Feign聲明式調(diào)用服務(wù)下的,服務(wù)降級(jí)的使用,那么我們就必須新建一個(gè)FeignFallBack類(lèi)來(lái)繼承FeiService,代碼如下:

package hjc;

import org.springframework.stereotype.Component;

/**
 * Created by cong on 2018/5/17.
 */
@Component
public class FeignFallBack implements FeignService{
  //實(shí)現(xiàn)的方法是服務(wù)調(diào)用的降級(jí)方法
  @Override
  public String hello() {
    return "error";
  }

  @Override
  public String hello(String name) {
    return "error";
  }

  @Override
  public User hello(String name, Integer age) {
    return new User();
  }

  @Override
  public String hello(User user) {
    return "error";
  }
}

接著我們?cè)侔涯莾蓚€(gè)服務(wù)提供模塊provider1,provider2模塊進(jìn)行停止,運(yùn)行結(jié)果如下所示:

可以看到我們這幾個(gè)調(diào)用,都進(jìn)行了服務(wù)降級(jí)了。

那么如果我們想精確的控制一下Hystrix的參數(shù)也是可以的,比方說(shuō)跟Hystrix結(jié)合的參數(shù),那么可以在FeignClient注解里面配置一個(gè)Configuration=XXX類(lèi).class屬性,在哪個(gè)類(lèi)里面精確的指定一下屬性。

或者在application.yml里面配置,如下:

hystrix:
 command:
  default:
   execution:
    isolation:
     thread:
      timeoutinMilliseconds: 5000

ribbon:
 connectTimeout: 500

 
#如果想對(duì)單獨(dú)的某個(gè)服務(wù)進(jìn)行詳細(xì)配置,如下
hello-service:
 ribbon:
  connectTimeout: 500

這里滿足了我們大部分場(chǎng)景的調(diào)用,但是有寫(xiě)精細(xì)場(chǎng)景,還是要用原生的Hystrix,跟我們之前的Hystrix用法一下,不要走Feign客戶端調(diào)用就行了,如下:

/**
 * Created by cong on 2018/5/17.
 */
public class HjcCommand extends HystrixCommand {
  protected HjcCommand(HystrixCommandGroupKey group) {
    super(group);
  }

  @Override
  protected Object run() throws Exception {
    return null;
  }
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Lombok注解之@SuperBuilder--解決無(wú)法builder父類(lèi)屬性問(wèn)題

    Lombok注解之@SuperBuilder--解決無(wú)法builder父類(lèi)屬性問(wèn)題

    這篇文章主要介紹了Lombok注解之@SuperBuilder--解決無(wú)法builder父類(lèi)屬性問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Java鏈表中添加元素的原理與實(shí)現(xiàn)方法詳解

    Java鏈表中添加元素的原理與實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了Java鏈表中添加元素的原理與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了Java實(shí)現(xiàn)鏈表中添加元素的相關(guān)原理、操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2020-03-03
  • zuul集成Sentinel,完成對(duì)path映射的限流操作

    zuul集成Sentinel,完成對(duì)path映射的限流操作

    這篇文章主要介紹了zuul集成Sentinel,完成對(duì)path映射的限流操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 詳解Spring數(shù)據(jù)緩存注解@Cacheable、@CachePut、@CacheEvict

    詳解Spring數(shù)據(jù)緩存注解@Cacheable、@CachePut、@CacheEvict

    這篇文章主要介紹了詳解Spring數(shù)據(jù)緩存注解@Cacheable、CachePut、@CacheEvict,當(dāng)以一組參數(shù)第一次調(diào)用某個(gè)方法時(shí),返回值會(huì)被保存在緩存中,如果這個(gè)方法再次以相同的參數(shù)進(jìn)行調(diào)用時(shí),這個(gè)返回值會(huì)從緩存中查詢獲取,需要的朋友可以參考下
    2023-07-07
  • JDK21新特性Record?Patterns記錄模式詳解(最新推薦)

    JDK21新特性Record?Patterns記錄模式詳解(最新推薦)

    這篇文章主要介紹了JDK21新特性Record?Patterns記錄模式詳解,本JEP建立在Pattern?Matching?for?instanceof(JEP?394)的基礎(chǔ)上,該功能已在JDK?16中發(fā)布,它與Pattern?Matching?for?switch(JEP?441)共同演進(jìn),需要的朋友可以參考下
    2023-09-09
  • Java中String類(lèi)getBytes()方法詳解與完整實(shí)例

    Java中String類(lèi)getBytes()方法詳解與完整實(shí)例

    這篇文章主要給大家介紹了關(guān)于Java中String類(lèi)getBytes()方法詳解與完整實(shí)例的相關(guān)資料,getBytes()是Java編程語(yǔ)言中將一個(gè)字符串轉(zhuǎn)化為一個(gè)字節(jié)數(shù)組byte[]的方法,需要的朋友可以參考下
    2023-10-10
  • 使用Get方式提交數(shù)據(jù)到Tomcat服務(wù)器的方法

    使用Get方式提交數(shù)據(jù)到Tomcat服務(wù)器的方法

    這篇文章將介紹向服務(wù)器發(fā)送數(shù)據(jù),并且服務(wù)器將數(shù)據(jù)的處理結(jié)果返回給客戶端,本文給大家介紹使用Get方式向服務(wù)器發(fā)送數(shù)據(jù),感興趣的朋友一起學(xué)習(xí)吧
    2016-04-04
  • SpringBoot快速遷移至Quarkus的方法步驟

    SpringBoot快速遷移至Quarkus的方法步驟

    這篇文章主要介紹了SpringBoot快速遷移至Quarkus的方法步驟。文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Java中的事件處理機(jī)制詳細(xì)解讀

    Java中的事件處理機(jī)制詳細(xì)解讀

    這篇文章主要介紹了Java中的事件處理機(jī)制詳細(xì)解讀,ava事件處理是采取"委派事件模型",當(dāng)事件發(fā)生時(shí),產(chǎn)生事件的對(duì)象會(huì)把此"信息"傳遞給"事件的監(jiān)聽(tīng)者"處理,需要的朋友可以參考下
    2024-01-01
  • 詳解SpringBoot讀取resource目錄下properties文件的常見(jiàn)方式

    詳解SpringBoot讀取resource目錄下properties文件的常見(jiàn)方式

    這篇文章主要介紹了SpringBoot讀取resource目錄下properties文件的常見(jiàn)方式,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02

最新評(píng)論

芦山县| 滦平县| 内江市| 长子县| 宜丰县| 固阳县| 铁岭县| 綦江县| 东城区| 吉林省| 宁波市| 西青区| 丁青县| 临汾市| 合肥市| 夏邑县| 津市市| 梁平县| 潮州市| 九寨沟县| 滨海县| 淮南市| 千阳县| 襄城县| 洪湖市| 新泰市| 集安市| 湖南省| 杭州市| 百色市| 浦江县| 中阳县| 肥城市| 隆子县| 梁山县| 江城| 乌什县| 万源市| 余姚市| 崇阳县| 土默特右旗|