使用Spring Cloud Open Feign的Spring Boot微服务通信示例

x33g5p2x  于2022-10-12 转载在 Spring  
字(6.8k)|赞(0)|评价(0)|浏览(422)

Spring Cloud Open Feign概览

Feign通过可插拔注解支持(包括Feign注解和JAX-RS注解)使编写web服务客户端更加容易。此外,Spring Cloud还添加了对Spring MVC注解的支持,以及对使用与Spring Web中相同的HttpMessageConverters的支持。
使用Feign的一个好处是,除了接口定义之外,我们不必编写任何代码来调用服务。

例如:

package net.javaguides.userservice.service;

import net.javaguides.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") Long departmentId);
}

我们将做什么?

我们将创建两个微服务,例如部门服务和用户服务,并使用e1d1e从用户服务到部门服务进行REST API调用,以获取特定的用户部门。

步骤1:将Spring cloud open-feign-Maven依赖项添加到User Service

打开pom。用户服务项目的xml文件并添加以下依赖项:

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

确保添加spring云依赖项及其版本。
以下是添加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.4</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>net.javaguides</groupId>
	<artifactId>user-service</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>user-service</name>
	<description>user-service</description>
	<properties>
		<java.version>17</java.version>
		<spring-cloud.version>2021.0.4</spring-cloud.version>
	</properties>
	<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>mysql</groupId>
			<artifactId>mysql-connector-java</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>
	<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>

	<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启用假客户端

package net.javaguides.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注解允许组件扫描声明为外部客户端的接口。

步骤3:创建外部API客户端

之后,我们需要一个具有必要方法、请求和响应的外部API客户端。
让我们创建一个名为de1d4d的接口,并添加以下代码:

package net.javaguides.userservice.service;

import net.javaguides.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") Long departmentId);
}

我们使用@FeignClient注解声明了一个Feign客户端:

@FeignClient(value = "DEPARTMENT-SERVICE")

@FeignClient注解中传递的值参数是一个强制的、任意的客户端名称,而通过URL参数,我们可以指定API基URL。

@FeignClient(value = "DEPARTMENT-SERVICE", url = "http://localhost:8080")

此外,由于这个接口是一个Feign客户端,我们可以使用SpringWeb注解来声明我们想要接触的API。

步骤4:更改getUser方法以调用APIClient

首先,注射1d7d,然后使用:

DepartmentDto departmentDto = apiClient.getDepartmentById(user.getDepartmentId());

以下是使用Feign客户端的UserServiceImpl的完整代码,供您参考:

package net.javaguides.userservice.service.impl;

import lombok.AllArgsConstructor;
import net.javaguides.userservice.dto.DepartmentDto;
import net.javaguides.userservice.dto.ResponseDto;
import net.javaguides.userservice.dto.UserDto;
import net.javaguides.userservice.entity.User;
import net.javaguides.userservice.repository.UserRepository;
import net.javaguides.userservice.service.APIClient;
import net.javaguides.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;
    }
}

就是这样。现在运行两个微服务,让我们测试一下。

演示:启动两个微服务

首先,启动部门服务项目,然后启动用户服务项目。
一旦这两个项目都启动并在不同的端口上运行。接下来,让我们调用Get User REST API来测试对部门服务的用户服务REST API调用。

获取用户REST API:

请注意,响应中包含用户的部门。这表明我们已经成功地使用WebClient从用户服务调用了RESTAPI到部门服务。

结论

在本教程中,我们学习了如何使用Spring Cloud Open Feign库在多个微服务之间进行REST API调用(同步通信)。

相关文章