日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

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

發(fā)布時間:2023/11/16 javascript 82 coder
生活随笔 收集整理的這篇文章主要介紹了 微服务系列-Spring Boot使用Open Feign 微服务通信示例 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

公眾號「架構(gòu)成長指南」,專注于生產(chǎn)實踐、云原生、分布式系統(tǒng)、大數(shù)據(jù)技術(shù)分享。

前言

在前幾個教程中我們已經(jīng)看到:

使用 RestTemplate 的 Spring Boot 微服務(wù)通信示例

使用 WebClient 的 Spring Boot 微服務(wù)通信示例

在本教程中,我們將學(xué)習(xí)如何使用 Spring Cloud Open Feign庫在多個微服務(wù)之間進行 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à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ù) 進行 REST API 調(diào)用 ,以獲取特定的用戶部門。

基礎(chǔ)配置

參考以下教程創(chuàng)建 部門服務(wù) 和 用戶服務(wù) 微服務(wù):
使用 RestTemplate 的 Spring Boot 微服務(wù)通信示例。

第一步:將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步:創(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ù)是強制的,而使用 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)在運行兩個微服務(wù)并進行測試。

測試:啟動兩個微服務(wù)

首先啟動部門服務(wù)項目,然后啟動用戶服務(wù)項目。
一旦兩個項目都啟動并在不同的端口上運行。接下來,我們調(diào)用 Get User REST API 來測試 user-service REST API 對Department-service 的 調(diào)用 。

獲取用戶 REST API:

請注意,響應(yīng)結(jié)果包含用戶的部門。 這表明我們已成功使用APIClient從用戶服務(wù) 到 部門服務(wù)進行 REST API 調(diào)用 。

結(jié)論

在本教程中,我們學(xué)習(xí)了如何使用 Spring Cloud Open Feign在多個微服務(wù)之間進行 REST API 調(diào)用(同步通信)。

源碼下載:github gitee

總結(jié)

以上是生活随笔為你收集整理的微服务系列-Spring Boot使用Open Feign 微服务通信示例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。