OpenFeign用戶端
- OpenFeign用戶端
-
- 建構微服務項目
-
- 父工程依賴pom.xml
- provider-service-api
- provider-service-impl
-
- application.yml
- ProviderServiceImpl
- 主啟動類
- consumer-service-impl
-
- ConsumerServiceFeign
- ConsumerService
- 主啟動類
OpenFeign用戶端
OpenFeign是一個Web聲明式的Http用戶端調用工具,提供接口和注解形式調用。
建構微服務項目
以下子產品都是空Maven項目
openfeign-parent—父工程(隻需要添加依賴即可)
- service-api----微服務Api接口層(空項目)
- provider-service-api
- service-impl----微服務Api實作層(空項目)
- provider-service-impl
- consumer-service-impl
父工程依賴pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
</dependencies>
provider-service-api
public interface ProviderService {
/**
* 提供我們釋出的接口
* 這裡可以試一下不加注解 @RequestParam,必定報錯
* @param userId
* @return
*/
@GetMapping("/getUser")
String getUser(@RequestParam("userId") Integer userId);
}
provider-service-impl
application.yml
server:
port: 8080
spring:
application:
name: provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
ProviderServiceImpl
@RestController
@CrossOrigin //解決跨域問題,我後面的文章會寫到由網關統一解決跨域問題
public class ProviderServiceImpl implements ProviderService {
@Value("${server.port}")
private String serverPort;
/**
* 這裡不需要加注解 @GetMapping("/getUser")
* 因為父類已經繼承過來了
*
* @param userId
* @return
*/
@Override
public String getUser(Integer userId) {
return "我是提供者服務:" + serverPort;
}
}
主啟動類
@SpringBootApplication
public class AppProvider {
public static void main(String[] args) {
SpringApplication.run(AppProvider.class, args);
}
}
啟動provider-service-impl項目測試即可 http://localhost:8080/getUser?userId=1
現在開始進入正題
consumer-service-impl
openfeign使用起來也非常簡單,與feign一樣,是面向接口,是以我們寫一個接口
ConsumerServiceFeign
@FeignClient("provider") //自動從注冊中心擷取服務名
public interface ConsumerServiceFeign {
//這裡的方法和provider裡面的方法是一樣的
//方法名可以不一樣,但是參數必須保持一緻
@GetMapping("/getUser")
String getUser(@RequestParam("userId") Integer userId);
}
ConsumerService
@RestController
public class ConsumerService {
@Autowired
private ConsumerServiceFeign providerServiceFeign;
/**
* 基于我們Feign用戶端形式實作 RPC 遠端調用
*
* @return
*/
@RequestMapping("/consumerFeignToProvider")
public String consumerFeignToProvider() {
String result = providerServiceFeign.getUser(1);
return "我是消費者調用提供者的接口:傳回結果:" + result;
}
}
主啟動類
@SpringBootApplication
@EnableFeignClients //加上注解
public class AppConsumer {
public static void main(String[] args) {
SpringApplication.run(AppConsumer.class, args);
}
}
啟動項目通路 http://localhost:8090/consumerFeignToProvider 即可
OpenFeign也支援叢集,隻需要再啟動一個 provider-service-impl 項目即可,改變端口,預設的負載均衡也是為輪詢算法