国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

SpringCloud實戰之Feign聲明式服務調用

2024-07-14 08:40:51
字體:
來源:轉載
供稿:網友

在前面的文章中可以發現當我們通過RestTemplate調用其它服務的API時,所需要的參數須在請求的URL中進行拼接,如果參數少的話或許我們還可以忍受,一旦有多個參數的話,這時拼接請求字符串就會效率低下,并且顯得好傻。

那么有沒有更好的解決方案呢?答案是確定的有,Netflix已經為我們提供了一個框架:Feign。

Feign是一個聲明式的Web Service客戶端,它的目的就是讓Web Service調用更加簡單。Feign提供了HTTP請求的模板,通過編寫簡單的接口和插入注解,就可以定義好HTTP請求的參數、格式、地址等信息。

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

總起來說,Feign具有如下特性:

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

這看起來有點像我們springmvc模式的Controller層的RequestMapping映射。這種模式是我們非常喜歡的。Feign是用@FeignClient來映射服務的。

首先第一步,在原來的基礎上新建一個Feign模塊,接著引入相關依賴,引入Feign依賴,會自動引入Hystrix依賴的,如下:

    <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: 8083spring: application:  name: feign-consumereureka: client:  service-url:   defaultZone: http://localhost:8888/eureka/,http://localhost:8889/eureka/

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

/** * Created by cong on 2018/5/8. */@RestControllerpublic class HelloController {  @RequestMapping("/hello")  public String hello(){    System.out.println("訪問來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類,代碼如下:

/** * Created by cong 2017/12/2. */public class User {  private String name;  private Integer age;  //序列化傳輸的時候必須要有空構造方法,不然會出錯  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;  }}

接下來用Feign的@FeignClient(“服務名稱”)映射服務調用。代碼如下:

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 這個類配置Hystrix的一些精確屬性//value=“你用到的服務名稱”@FeignClient(value = "hello-service",fallback = FeignFallBack.class)public interface FeignService {  //服務中方法的映射路徑  @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這個接口,進行遠程服務調用,代碼如下:

/** * Created by cong on 2018/5/17. */@RestControllerpublic 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模塊的啟動類哪里打上Eureka客戶端的注解@EnableDiscoveryClient  Feign客戶端的注解

@EnableFeignClients,代碼如下:@SpringBootApplication@EnableDiscoveryClient@EnableFeignClientspublic class FeignApplication {  public static void main(String[] args) {    SpringApplication.run(FeignApplication.class, args);  }}

接著啟動啟動類,瀏覽器上輸入localhost:8083/consumer  運行結果如下:

SpringCloud,聲明式服務調用,Feign

SpringCloud,聲明式服務調用,Feign

可以看到負載均衡輪詢出現hello1,hello2。

接著繼續在瀏覽器上輸入localhost:8083/consumer2,運行結果如下:

SpringCloud,聲明式服務調用,Feign

接下來我們進行Feign聲明式調用服務下的,服務降級的使用,那么我們就必須新建一個FeignFallBack類來繼承FeiService,代碼如下:

package hjc;import org.springframework.stereotype.Component;/** * Created by cong on 2018/5/17. */@Componentpublic class FeignFallBack implements FeignService{  //實現的方法是服務調用的降級方法  @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";  }}

接著我們再把那兩個服務提供模塊provider1,provider2模塊進行停止,運行結果如下所示:

SpringCloud,聲明式服務調用,Feign

可以看到我們這幾個調用,都進行了服務降級了。

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

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

hystrix: command:  default:   execution:    isolation:     thread:      timeoutinMilliseconds: 5000ribbon: connectTimeout: 500 #如果想對單獨的某個服務進行詳細配置,如下hello-service: ribbon:  connectTimeout: 500

這里滿足了我們大部分場景的調用,但是有寫精細場景,還是要用原生的Hystrix,跟我們之前的Hystrix用法一下,不要走Feign客戶端調用就行了,如下:

/** * 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;  }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阳高县| 广丰县| 萨嘎县| 资中县| 湟中县| 黄冈市| 西盟| 望谟县| 泰来县| 商水县| 顺平县| 新乡县| 平原县| 武胜县| 辰溪县| 南阳市| 永川市| 普洱| 江城| 马山县| 扬中市| 杭锦旗| 色达县| 白城市| 永城市| 清新县| 乌苏市| 汝州市| 雅江县| 玛纳斯县| 海阳市| 渝北区| 宽甸| 专栏| 盐津县| 星子县| 遂溪县| 祁连县| 拜城县| 若羌县| 托里县|