1. 程式人生 > 其它 >11.OpenFeign服務介面呼叫

11.OpenFeign服務介面呼叫

OpenFeign是什麼?

1.Feign是一個宣告式的Web服務客戶端,讓編寫Web服務客戶端變得非常容易,只需建立一個介面並在介面上添加註解即可

2.Feign旨在使編寫Java Http客戶端變得更容易。

3.前面在使用Ribbon+RestTemplate時,利用RestTemplate對http請求的封裝處理,形成了一套模版化的呼叫方法。
但是在實際開發中,由於對服務依賴的呼叫可能不止一處,往往一個介面會被多處呼叫,
所以通常都會針對每個微服務自行封裝一些客戶端類來包裝這些依賴服務的呼叫。
所以,Feign在此基礎上做了進一步封裝,由他來幫助我們定義和實現依賴服務介面的定義。
在Feign的實現下,我們只需建立一個介面並使用註解的方式來配置它(以前是Dao介面上面標註Mapper註解,現在是一個微服務介面上面標註一個Feign註解即可),
即可完成對服務提供方的介面繫結,簡化了使用Spring cloud Ribbon時,自動封裝服務呼叫客戶端的開發量。
openfeign與feign區別:
openfign feign
Feign是Spring Cloud元件中的一個輕量級RESTful的HTTP服務客戶端Feign內建了Ribbon,用來做客戶端負載均衡,去呼叫服務註冊中心的服務。Feign的使用方式是:使用Feign的註解定義介面,呼叫這個介面,就可以呼叫服務註冊中心的服務 OpenFeign是Spring Cloud 在Feign的基礎上支援了SpringMVC的註解,如@RequesMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping註解下的介面,並通過動態代理的方式產生實現類,實現類中做負載均衡並呼叫其他服務。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>

spring cloud整合openfeign

1.新建cloud-consumer-feign-order80模組

2.修改pom檔案,新增以下依賴。

<dependencies>
    <!--openfeign-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    <!--eureka client-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <!--web-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <!--一般基礎通用配置-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>cn.com.springcloud</groupId>
        <artifactId>common</artifactId>
        <version>${project.version}</version>
    </dependency>
</dependencies>

3.新增配置檔案application.yml

server:
  port: 80


eureka:
  client:
    #表示是否將自己註冊進EurekaServer預設為true。
    register-with-eureka: true
    #是否從EurekaServer抓取已有的註冊資訊,預設為true。單節點無所謂,叢集必須設定為true才能配合ribbon使用負載均衡
    fetchRegistry: true
    service-url:
      #單機版
      #defaultZone: http://localhost:7001/eureka
      # 叢集版
      defaultZone: http://eureka7001:7001/eureka,http://eureka7002:7002/eureka
  instance:
    instance-id: feign-userConsumer80
    prefer-ip-address: true
spring:
  application:
    name: feign-customer-user

4.springboot啟動類程式碼:(重點1:@EnableFeignClients標籤的使用,開啟openfeign)

@SpringBootApplication
//重點1:@EnableFeignClients標籤的使用,開啟openfeign
@EnableFeignClients
public class FeigbApplication80 {
    public static void main(String[] args) {
        SpringApplication.run(FeigbApplication80.class,args);
    }
}

5.寫介面程式碼(重要點2:@FeignClient("PRODUCER-USER-API")繫結遠端服務端的對外能力)

解釋:繫結服務提供端的請求
原理:當控制層呼叫該介面的queryUserById方法時,會去eureka的註冊中心找到PRODUCER-USER-API的服務,
然後呼叫拼接/producer/queryUserById/{id}的路徑,即呼叫的是服務端/producer/queryUserById/{id}的方法
@FeignClient("PRODUCER-USER-API")
@Component
public interface FeignService {
    @GetMapping("/producer/queryUserById/{id}")
    public CommResult queryUserById(@PathVariable("id") int id);
}
原理解釋:
    1.在springboot啟動類上加上@EnableFeignClients註解,開啟OpenFeign功能
    2.在介面上加上註解@FeignClient("PRODUCER-USER-API")繫結遠端服務
    3.當請求http://localhost/feign/queryUserById/6時,會呼叫到該介面上,openFeign會先根據@FeignClient註解找到遠端服務
    在呼叫遠端服務的/producer/queryUserById/{id}請求並返回

如圖所示:openfeign的包裡包含了ribbon的包,所以openfeign本身具有負載均衡的能力,預設是輪詢!

OpenFeign超時控制

openfeign如果呼叫遠端服務超時怎麼辦?openfeign底層是ribbion呼叫遠端,ribbon遠端呼叫超時時間預設是1秒鐘
如果故意在服務側執行緒休眠導致超時,呼叫會報錯!
可以看到報錯了,報的是超時異常。
有時我們處理業務的時間超過了1s,所以我們要設定一下超時等待的時間。
在applicaiton.yml中進行配置:
server:
  port: 80

eureka:
  client:
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
      
#設定feign客戶端超時時間(OpenFeign預設支援ribbon)
ribbon:
  #指的是建立連線所用的時間,適用於網路狀況正常的情況下,兩端連線所用的時間
  ReadTimeout: 5000
  #指的是建立連線後從伺服器讀取到可用資源所用的時間
  ConnectTimeout: 5000

openfeign的日誌級別

如果openfeign經常性呼叫,想檢視openfeign傳送的到底是什麼東西,可以配置openfeign的日誌級別!
級別
    1.NONE:預設,不顯示任何日誌
    2.BASIC:僅記錄請求方法、URL、響應狀態碼及執行時間等
    3.HEADERS:除了BASIC中定義的資訊外,還有請求和響應的頭資訊
    4.FULL:除了HEADERS中定義的資訊外,還有請求和響應的正問和元資料等
做法:
    1.寫個自己的配置類:
        @Configuration
        public class Myconfig {
            @Bean
            public Logger.Level feignLoggerLevel(){
                return Logger.Level.FULL;
            }
        }
    2.application.yml中配置
        logging:
          level:
            # feign日誌以什麼級別監控哪個介面
            cn.com.cloud.feignConsumer.service.FeignService : debug
    3. 控制檯輸出:
: [FeignService#queryUserById] <--- HTTP/1.1 200 (391ms)
: [FeignService#queryUserById] connection: keep-alive
: [FeignService#queryUserById] content-type: application/json
: [FeignService#queryUserById] date: Mon, 19 Jul 2021 09:29:29 GMT
: [FeignService#queryUserById] keep-alive: timeout=60
: [FeignService#queryUserById] transfer-encoding: chunked
: [FeignService#queryUserById] 
: [FeignService#queryUserById] {"status":200,"message":"成功!serverPort:8001","result":{"id":6,"name":"吳孟達","pwd":"123123"}}
: [FeignService#queryUserById] <--- END HTTP (101-byte body)