SpringCloud(五)Feign——更好用的通信方式

在微服务架构中,我们经常需要和其他服务进行通信实现数据交互,常用的方式有两种:一是RPC((Romote Procedure Call),另一种是HTTP。SpirngCloud 中,默认是使用HTTP进行微服务间通信,其中最常用的有两种实现形式也有两种:一RestTemplate,二是Feign,前者的用法我们在上一篇文章中已经见识过了。接下来我们就来看看feign是怎么回事呢!

源码托管地址:https://github.com/cddofficial/SpringCloudRepo

目录

1 Feign概述

1. Feign简介

2.与RestTemplate的区别

2 实战

2.1 复制得到eureka-client-coke-feign

2.2 修改代码

2.2.1 添加Feign依赖

2.2.2 修改启动类

2.3 测试

2.3.1 启动服务

2.3.2 发请求测试

3 参考资料


1 Feign概述

1. Feign简介

Feign is a declarative web service client. It makes writing web service clients easier. To use Feign create an interface and annotate it. It has pluggable annotation support including Feign annotations and JAX-RS annotations. Feign also supports pluggable encoders and decoders. Spring Cloud adds support for Spring MVC annotations and for using the same HttpMessageConverters used by default in Spring Web. Spring Cloud integrates Ribbon and Eureka to provide a load balanced http client when using Feign.

上面是Spring官网给出的Feign的解释,官网地址:https://cloud.spring.io/spring-cloud-static/Finchley.SR4/single/spring-cloud.html#netflix-feign-starter 

我用谷歌翻译过来大概是:

Feign是声明性Web服务客户端。它使编写Web服务客户端更加容易。要使用Feign,请创建一个接口并对其进行注释。它具有可插入的注释支持,包括Feign注释和JAX-RS注释。Feign还支持可插拔编码器和解码器。Spring Cloud添加了对Spring MVC注释的支持,并支持使用HttpMessageConvertersSpring Web中默认使用的注释。当使用Feign时,Spring Cloud集成了Ribbon和Eureka以提供负载平衡的http客户端。

我们使用Feign组件来调用其他微服务的接口,就如同调用自己服务的接口一样,这是我使用feign后的体会。

2.与RestTemplate的区别

在SpringWeb里面,已经原生支持了 RestTemplate。Feign是由netflix支持的。

使用RestTemplate时,URL参数是以编程方式构造的,数据被发送到其他服务。在更复杂的情况下,我们将不得不RestTemplate深入到更低级别的API提供的甚至是API 的细节。

Feign是Spring Cloud Netflix库,用于在基于REST的服务调用上提供更高级别的抽象。Spring Cloud Feign在声明性原则上工作。使用Feign时,我们在客户端编写声明式REST服务接口,并使用这些接口来编写客户端程序。开发人员不用担心这个接口的实现。这将在运行时由Spring动态配置。通过这种声明性的方法,开发人员不需要深入了解由HTTP提供的HTTP级别API的细节的RestTemplate

总之,Feign比RestTemplate更好用,功能更强大。

2 实战

2.1 复制得到eureka-client-coke-feign

首先复制微服务eureka-client-coke重命名为eureka-client-coke-feign(至于如何复制这里不再赘述,请看eureka——实战中的 “2.4.1 创建可乐微服务” 的 “复制得到eureka-client-coke),我们在这个新复制的微服务上来应用Feign组件来实战。

导入到STS(Spring Tools Suite4,一种集成了Spirng插件的类似eclipse的IDE工具)中,项目结构如下图:

2.2 修改代码

2.2.1 添加Feign依赖

再pom文件中添加feign组件相关依赖,如下图:

代码如下:

<?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.0.7.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>

	<groupId>com.cdd.cloud</groupId>
	<artifactId>eureka-client-coke-feign</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>eureka-server-service-discover</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencies>
		<!-- feign组件依赖 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-openfeign</artifactId>
		</dependency>

		<!-- eureka client依赖 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>

		<!-- web依赖 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<!-- 连接mysql所需依赖 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>

		<!-- 测试需要依赖 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<!-- 引入spring cloud的依赖,不能少,主要用来管理Spring Cloud生态各组件的版本 -->
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Finchley.SR2</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<!-- 添加spring-boot的maven插件,不能少,打jar包时得用 -->
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

2.2.2 修改启动类

把启动类名称改为EurekaClientCokeFeignApplication,在该类上打@EnableFeignClients。代码如下:

package com.cdd.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableEurekaClient  //eureka client 注解
@EnableFeignClients  //启用feign组件注解
public class EurekaClientCokeFeignApplication {

	public static void main(String[] args) {
		SpringApplication.run(EurekaClientCokeFeignApplication.class, args);
	}
}

2.3 测试

2.3.1 启动服务

1. 先启动服务发现微服务eureka-server-service-discover

2. 启动用户微服务

(1)修改用户微服务eureka-client-user的端口为8002,修改applicatioin.yml文件,截图如图(其他地方不变):

启动用户微服务,查看控制台日志,以8002端口启动,时间为下午2:49:01,这个时间点启动的是端口为8002用户微服务实例,截图如下:

(2)(1)修改用户微服务eureka-client-user的端口为8001,修改applicatioin.yml文件,截图如图(其他地方不变):

启动用户微服务,查看控制台日志,以8001端口启动,时间为下午2:52:30,这个时间点启动的是端口为8001用户微服务实例,截图如下:

3 启动eureka-client-coke-feign微服务。

2.3.2 发请求测试

1. 先查看服务注册列表

浏览器器输入:http://localhost:8761/ ,响应页面如下,可以看到可乐微服务一个实例,用户微服务2个实例都已经注册上了。

2. 测试feign组件

先清掉控制台用户微服务两个实例的日志,在浏览器中输入:http://localhost:9001/coke/2,连续刷新4次,响应页面如下:

再来看用户微服务两个实例控制台打印的日志信息。

启动时间为下午2:49:01的用户微服务实例端口为8002,执行处理了2次(打印的sql有两条),如下图:

启动时间为下午2:52:30的用户微服务实例端口为8001,执行处理了2次(打印的sql有两条),如下图:

到这里是不是充分说明实现了微服务间通信,并且也实现了负载均衡,是不是比RestTemplate+Ribbon好用多了呢!

其实上面我们也不必记录时间,以时间来标志哪个用户微服务,其他方法也行(比如配置一个别名什么的,随你)。只是让大家清晰明了看到的确实现了微服务间通信和负载均衡。

3 参考资料

feign与RestTemplate的区别:https://www.cnblogs.com/EasonJim/p/8321355.html

发布了45 篇原创文章 · 获赞 28 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_41968788/article/details/103233770