javascript
微服务系列-Spring Boot使用Open Feign 微服务通信示例
公眾號「架構(gòu)成長指南」,專注于生產(chǎn)實(shí)踐、云原生、分布式系統(tǒng)、大數(shù)據(jù)技術(shù)分享。
前言
在前幾個教程中我們已經(jīng)看到:
使用 RestTemplate 的 Spring Boot 微服務(wù)通信示例
使用 WebClient 的 Spring Boot 微服務(wù)通信示例
在本教程中,我們將學(xué)習(xí)如何使用 Spring Cloud Open Feign庫在多個微服務(wù)之間進(jìn)行 REST API 調(diào)用(同步通信)。
Spring Cloud Open Feign 概述
Feign通過可插拔的注解支持(包括Feign注解和JAX-RS注解)使編寫Web服務(wù)客戶端變得更加容易。此外,Spring Cloud還添加了對Spring MVC注解的支持,并使用與Spring Web中使用的相同的HttpMessageConverters。
使用Feign的一個很大的優(yōu)點(diǎn)是,我們除了接口定義之外,不需要編寫任何調(diào)用服務(wù)的代碼。
例如
package io.wz.userservice.service;
import io.wz.userservice.dto.DepartmentDto;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(value = "DEPARTMENT-SERVICE", url = "http://localhost:8080")
public interface APIClient {
@GetMapping(value = "/api/departments/{id}")
DepartmentDto getDepartmentById(@PathVariable("id") String departmentId);
}
我們將構(gòu)建什么?
下面將創(chuàng)建兩個微服務(wù),例如部門服務(wù) 和 用戶服務(wù),并且我們將使用 Spring Cloud Open Feign從用戶服務(wù)到部門服務(wù) 進(jìn)行 REST API 調(diào)用 ,以獲取特定的用戶部門。
基礎(chǔ)配置
參考以下教程創(chuàng)建 部門服務(wù) 和 用戶服務(wù) 微服務(wù):
使用 RestTemplate 的 Spring Boot 微服務(wù)通信示例。
第一步:將Spring cloud open feign Maven依賴添加到User-Service中
打開 user-service項(xiàng)目 的 pom.xml文件 并添加以下依賴項(xiàng):
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
這是添加Spring cloud open feign依賴后的完整pom.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.17</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>io.wz</groupId>
<artifactId>user-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>user-service</name>
<description>user-service</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2021.0.4</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</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>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
第2步:使用@EnableFeignClients啟用Feign Client
package io.wz.userservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
請注意,@EnableFeignClients 注解啟用組件掃描聲明它們是 Feign 客戶端的接口。
第3步:創(chuàng)建feign API客戶端
讓我們創(chuàng)建一個名為 APIClient的接口 并添加以下代碼:
package io.wz.userservice.service;
import io.wz.userservice.dto.DepartmentDto;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(value = "DEPARTMENT-SERVICE", url = "http://localhost:8080")
public interface APIClient {
@GetMapping(value = "/api/departments/{id}")
DepartmentDto getDepartmentById(@PathVariable("id") String departmentId);
}
我們使用@FeignClient注解聲明一個Feign客戶端
@FeignClient(value = "DEPARTMENT-SERVICE")
@FeignClient注解中傳遞的 value 參數(shù)是強(qiáng)制的,而使用 URL 參數(shù)時,我們指定了 API的URL。
@FeignClient(value = "DEPARTMENT-SERVICE", url = "http://localhost:8080")
此外,由于該接口是 Feign 客戶端,因此我們可以使用 Spring Web注解來聲明我們想要訪問的 API。
第4步:更改getUser方法以調(diào)用APIClient
首先注入 APIClient 然后使用它:
DepartmentDto departmentDto = apiClient.getDepartmentById(user.getDepartmentId());
下面是使用Feign客戶端的UserServiceImpl的完整代碼,供大家參考:
package io.wz.userservice.service.impl;
import lombok.AllArgsConstructor;
import io.wz.userservice.dto.DepartmentDto;
import io.wz.userservice.dto.ResponseDto;
import io.wz.userservice.dto.UserDto;
import io.wz.userservice.entity.User;
import io.wz.userservice.repository.UserRepository;
import io.wz.userservice.service.APIClient;
import io.wz.userservice.service.UserService;
import org.springframework.stereotype.Service;
@Service
@AllArgsConstructor
public class UserServiceImpl implements UserService {
private UserRepository userRepository;
private APIClient apiClient;
@Override
public User saveUser(User user) {
return userRepository.save(user);
}
@Override
public ResponseDto getUser(Long userId) {
ResponseDto responseDto = new ResponseDto();
User user = userRepository.findById(userId).get();
UserDto userDto = mapToUser(user);
DepartmentDto departmentDto = apiClient.getDepartmentById(user.getDepartmentId());
responseDto.setUser(userDto);
responseDto.setDepartment(departmentDto);
return responseDto;
}
private UserDto mapToUser(User user){
UserDto userDto = new UserDto();
userDto.setId(user.getId());
userDto.setFirstName(user.getFirstName());
userDto.setLastName(user.getLastName());
userDto.setEmail(user.getEmail());
return userDto;
}
}
現(xiàn)在運(yùn)行兩個微服務(wù)并進(jìn)行測試。
測試:啟動兩個微服務(wù)
首先啟動部門服務(wù)項(xiàng)目,然后啟動用戶服務(wù)項(xiàng)目。
一旦兩個項(xiàng)目都啟動并在不同的端口上運(yùn)行。接下來,我們調(diào)用 Get User REST API 來測試 user-service REST API 對Department-service 的 調(diào)用 。
獲取用戶 REST API:
請注意,響應(yīng)結(jié)果包含用戶的部門。 這表明我們已成功使用APIClient從用戶服務(wù) 到 部門服務(wù)進(jìn)行 REST API 調(diào)用 。
結(jié)論
在本教程中,我們學(xué)習(xí)了如何使用 Spring Cloud Open Feign在多個微服務(wù)之間進(jìn)行 REST API 調(diào)用(同步通信)。
源碼下載:github gitee
總結(jié)
以上是生活随笔為你收集整理的微服务系列-Spring Boot使用Open Feign 微服务通信示例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: final关键字的作用
- 下一篇: NLP文本生成全解析:从传统方法到预训练