天天看點

SpringCloud學習[6]-OpenFeign元件服務間通信

使用RestTemplate+ribbon已經可以完成對服務間的調用,為什麼還要使用feign?

String getResult = restTemplate.getForObject(“http://{{服務ID}}/{{url}}”, String.class);
  • 存在問題
  1. 每次調用服務都需要寫這些代碼,存在大量的代碼備援
  2. 服務位址如果修改,維護成本增高
  3. 不能自動轉換響應結果為對應對象
  4. 必須內建ribbon實作負載均衡

OpenFeign元件

一、簡介

1. 發展

Feign元件 ------> OpenFiegn元件

Feign(Netflix)元件後期進入維護狀态,因為Feign提供了非常好的服務間調用思想,但是由于進入了維護,後續feign元件的狀态也沒人管理,開發人員也享受不到feign元件的特性。springcloud作為最高提出微服務的大佬,總得給廣大開發人員提出微服務的解決方案,是以springcloud團隊開始吸收開源feign元件的精華,封裝了OpenFeign元件。為了減輕開發人員的學習成本,并未對feign進行大改造,僅僅吸收了feign元件的精華。OpenFeign(Spring)和Feign(Netflix)元件特性使用方式一緻的。

2. 介紹

官方網址:https://cloud.spring.io/spring-cloud-openfeign/reference/html/

Declarative REST Client: Feign

Feign is a declarative web service client. It makes writing web service clients easier. To use Feign create an interface and annotate it. It has pluggable annotation support including Feign annotations and JAX-RS annotations. Feign also supports pluggable encoders and decoders. Spring Cloud adds support for Spring MVC annotations and for using the same HttpMessageConverters used by default in Spring Web. Spring Cloud integrates Eureka, as well as Spring Cloud LoadBalancer to provide a load-balanced http client when using Feign.

譯:Feign是一個聲明式 Web 服務用戶端。它使編寫 Web 服務用戶端變得更容易。要使用 Feign 建立一個接口并對其進行注釋。它具有可插入的注釋支援,包括 Feign 注釋和 JAX-RS 注釋。Feign 還支援可插拔的編碼器和解碼器。Spring Cloud 添加了對 Spring MVC 注解的支援,并支援使用HttpMessageConvertersSpring Web 中預設使用的注解。Spring Cloud 內建了 Eureka,以及 Spring Cloud LoadBalancer,在使用 Feign 時提供負載均衡的 http 用戶端。

OpenFeign和RestTemplate作用一緻,都是一個http用戶端

  • RestTemplate:Spring架構封裝HttpClient對象
  • OpenFeign:僞HttpClient對象(可借鑒代理伺服器了解)它可以使服務間通信更簡單

二、使用

1. 建立兩個springboot應用

FriendApplication 調用 ShareApplication

<!--springboot-->
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
           

2. 注冊到consul注冊中心

引入consul依賴

<!--引入consul依賴-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>

        <!--健康檢查依賴-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
           

修改配置檔案,向consul注冊服務

# 注冊到consul
spring.cloud.consul.host=192.168.0.133
spring.cloud.consul.port=8500

# 指定注冊服務的服務名稱,預設${spring.application.name}
spring.cloud.consul.discovery.service-name=${spring.application.name}

# 注冊時按我的ip位址注冊
spring.cloud.consul.discovery.prefer-ip-address=true
spring.cloud.consul.discovery.ip-address=192.168.0.119
           

3. 入口類加入服務注冊client注解

@SpringBootApplication
@EnableDiscoveryClient
public class FriendsApplication {

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

}
           

4. 啟動檢視consul web端

SpringCloud學習[6]-OpenFeign元件服務間通信

5. 使用OpenFeign進行服務調用

在服務調用方引入openfeign依賴

<!--openfeign依賴-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
           

在服務調用方入口類加入注解,開啟openfeign調用支援

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class FriendApplication {

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

}
           

在調用方開發需要調用的服務用戶端接口

/**
 * 調用Share服務的接口
 */
@FeignClient(value = "SHARE") // value=調用服務的ID
public interface ShareClients {

    /**
     * 調用Share服務 share接口
     * @return
     */
    @GetMapping("shareConApi/share")
    public String share();

}
           

FriendController

@RestController
@RequestMapping("friendConApi")
public class FriendController {

    private static Logger log = LoggerFactory.getLogger(FriendController.class);
    @Resource
    private ShareClients shareClients;

    @GetMapping("invokeShare")
    public String invokeShare() {
        String share = shareClients.share();
        log.info("invokeShare success={}", share);
        return "invokeShare success " + share;
    }
}
           
SpringCloud學習[6]-OpenFeign元件服務間通信
SpringCloud學習[6]-OpenFeign元件服務間通信

預設輪詢的負載均衡政策

三、OpenFeign服務間調用之參數傳遞

https://blog.csdn.net/qq_31832209/article/details/118384828?spm=1001.2014.3001.5501

四、OpenFeign服務間調用之響應處理

繼續閱讀