天天看點

springcloud學習之Open Feign (聲明式的僞RPC遠端調用)1. Open Feign 是什麼?2. Ribbon與OpenFeign3.Open Feign 的簡單使用4. Open Feign 的原理

1. Open Feign 是什麼?

Feign,假裝、僞裝。OpenFeign可以使消費者将提供者提供的服務名僞裝為接口進行消費,消費者隻需使用“Service接口 + 注解”的方式即可直接調用Service接口方法,而無需再使用RestTemplate了

2. Ribbon與OpenFeign

Ribbon是Netflix公司的一個開源的負載均衡項目,是一個用戶端負載均衡器,運作在消費者端。

OpenFeign也是運作在消費者端的,使用Ribbon進行負載均衡,是以OpenFeign直接内置了Ribbon。即在導入OpenFeign依賴後,無需再專門導入Ribbon依賴了

3.Open Feign 的簡單使用

引入jar包,這裡需要注意的一點是:OpenFeign内置了Ribbon,是以不需要引入Ribbon的jar包

pom.xml

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>2.2.3.RELEASE</version>
</dependency>
           

建立一個接口類

package com.xhc.example.userservice;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

/**
 * @author xuehuichen
 * @version V1.0
 * @Package com.xhc.example.userservice
 * @date 2021/3/20 下午5:24
 */
@FeignClient("order-service")
public interface OrderServiceFeignClient {

	// 這裡聲明的是服務提供方的接口,類似于dubbo一樣的使用方法
    @GetMapping("/orders")
    public String getAllOrder();

}
           

PS:其實正常情況下都是把這個接口統一的定義為一個單獨的子產品

在主方法中添加開啟OpenFeign的注解

@EnableFeignClients
@SpringBootApplication
public class UserServiceApplication {

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

}
           

建立一個Controller

@RestController
public class OpenFeignController {
    @Autowired
    OrderServiceFeignClient orderServiceFeignClient;

    @GetMapping("/test")
    public String test(){
        return orderServiceFeignClient.getAllOrder();
    }
}
           

服務消費者的代碼完畢,接下來是服務提供者代碼(另外建立一個微服務項目)

@RestController
public class OrderService {

    @Value("${server.port}")
    private int port;

    @GetMapping("/orders")
    public String getAllOrder(){
        System.out.println("port"+port);
        return "Return all order";
    }
}
           

application.properties

# 應用名稱
spring.application.name=order-service
# 應用服務 WEB 通路端口
server.port=8080
           

至此,一個使用Open Feign的簡單例子就已經寫完!這個簡單的例子已經實作了Feign遠端調用和Ribbon用戶端負載均衡,是不是很簡單?

4. Open Feign 的原理

4.1 思考Feign要做的事情

  • 參數的解析和裝載
  • 針對指定的feignClient,生成動态代理
  • 針對FeignClient中的方法描述進行解析
  • 組裝出一個Request對象,發起請求

繼續閱讀