首页 > 其他分享 >微服务系列-Spring Boot使用Open Feign 微服务通信示例

微服务系列-Spring Boot使用Open Feign 微服务通信示例

时间:2023-11-14 10:11:05浏览次数:34  
标签:Feign 示例 Spring springframework user import org cloud

公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。

前言

在前几个教程中我们已经看到:

使用 RestTemplate 的 Spring Boot 微服务通信示例

使用 WebClient 的 Spring Boot 微服务通信示例

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

Spring Cloud Open Feign 概述

Feign通过可插拔的注解支持(包括Feign注解和JAX-RS注解)使编写Web服务客户端变得更加容易。此外,Spring Cloud还添加了对Spring MVC注解的支持,并使用与Spring Web中使用的相同的HttpMessageConverters。

使用Feign的一个很大的优点是,我们除了接口定义之外,不需要编写任何调用服务的代码。

例如

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);
}

我们将构建什么?

下面将创建两个微服务,例如部门服务用户服务,并且我们将使用 Spring Cloud Open Feign用户服务部门服务 进行 REST API 调用 ,以获取特定的用户部门。

基础配置

参考以下教程创建 部门服务 和 用户服务 微服务:
使用 RestTemplate 的 Spring Boot 微服务通信示例。

第一步:将Spring cloud open feign Maven依赖添加到User-Service中

打开 user-service项目 的 pom.xml文件 并添加以下依赖项:

	<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步:创建feign API客户端

让我们创建一个名为 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 参数是强制的,而使用 URL 参数时,我们指定了 API的URL。

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

此外,由于该接口是 Feign 客户端,因此我们可以使用 Spring Web注解来声明我们想要访问的 API。

第4步:更改getUser方法以调用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;
    }
}

现在运行两个微服务并进行测试。

测试:启动两个微服务

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

获取用户 REST API:

请注意,响应结果包含用户的部门。 这表明我们已成功使用APIClient从用户服务 到 部门服务进行 REST API 调用 。

结论

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

源码下载:github gitee

标签:Feign,示例,Spring,springframework,user,import,org,cloud
From: https://www.cnblogs.com/waldron/p/17831011.html

相关文章

  • 在`tomlkit`库中,`parse`函数用于将TOML格式的字符串解析为一个`Document`对象¹。以下
    #parse与节点(.)importtomlkit#TOML格式的字符串toml_str="""[tool.poetry]name="my-package"version="0.1.0"description="Mypackagedescription"authors=["Me<[email protected]>"]"&qu......
  • VCR库代码示例
    首先,我们需要在代码中添加对VCR库的引用:require'vcr'require'rest-client'然后,我们需要创建一个VCR录制器,以便我们可以记录实际的HTTP请求和响应:VCR.use_cassette('download_video',record::new_episodes)do#下载代码将在这里end接下来,我们需要设置:proxy={然后,我们可......
  • TypeScript 和 needle 库代码示例
    TypeScript和needle库编写的爬虫程序。import*asneedlefrom'needle';import{Request}from'http';constproxyHost='www.duoip.cn';constproxyPort=8000;//创建一个HTTP请求对象constreq=newRequest(',{headers:{&......
  • httrOAuth库代码示例
    #导入httr和httrOAuth库library(httr)library(httrOAuth)#设置服务器,主机为proxy_host<-proxy_port<-proxy_url<-"#设置httrOAuth的客户端ID和客户端密钥consumer_key<-"your_consumer_key"consumer_secret<-"your_consumer_secret"......
  • isomorphic-fetch库代码示例
    isomorphic-fetch库的爬虫程序。//引入isomorphic-fetch库importfetchfrom'isomorphic-fetch';//设置constproxy=;//定义视频URLconsturl=';//使用fetch获取视频数据fetch(url,{method:'GET',headers:{'Accept':'appl......
  • Fetch库代码示例
    importFetch._importFetch.{FetchException,FetchProxyException,FetchTimeoutException}//创建对象valproxy=newFetchProxy)//创建Fetch对象,并传入对象valfetch=newFetch(proxy)//创建请求对象,并传入视频的URLvalrequest=newFetchRequest("")//进......
  • 简单地聊一聊Spring Boot的构架
    本文由葡萄城技术团队发布。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。前言本文小编将详细解析SpringBoot框架,并通过代码举例说明每个层的作用。我们将深入探讨SpringBoot的整体架构,包括展示层、业务逻辑层和数据访问层。通过......
  • Intellij Idea搭建Spring环境-xml方式
    本篇博客介绍适合使用xml配置Spring环境和SpringMVC环境。①首先我们使用maven新建一个普通的javaweb工程(包含WEB-INF/web.xml),然后在pom文件中相关的依赖maven创建的web工程标准目录结构一般为:|--root|--pom.xml|--src/|--main/|--java/Java源代码目录......
  • SpringBoot3
    1>实例Demo1正文idea创建空项目springboot3.1File>>New >>Project...>>EmptyProject2项目springboot3,右键新建Model,boot3-01-demo<!--所有的springboot项目都必须集成spring-boot-starter-parent--><parent><groupId>org.springframework......
  • FTDI的MPSSE使用示例(SPI协议背景知识简介及其FT4232H配成USB to SPI使用实例)
    MPSSEApplicationExample:http://ftdichip.cn/Support/SoftwareExamples/MPSSE.htmMPSSE:AN_129FTDIUSBToJTAGTAPExampleMPSS:AN_114FTDIUSBtoSPIExampleMPSSE:AN_113FTDIUSBtoI2CExampleMPSS:AN_114FTDIUSBtoSPIExampleFTDIMPSSE(Multi-Pr......