SpringCloud十五、Feign是什么。Feign工程构建。

①Feign是什么?

官网解释:
http://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign
 
 Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。

 Feign是一个声明式的Web服务客户端,使得编写Web服务客户端变得非常容易,
只需要创建一个接口,然后在上面添加注解即可。

参考官网:https://github.com/OpenFeign/feign 

什么叫Feign:就是接口加注解的声明式的Web服务调用。声明式的接口加注解Web服务客户端的调用。
 
 Feign能干什么
Feign旨在使编写Java Http客户端变得更容易。
前面在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,Feign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在Feign的实现下,我们只需创建一个接口并使用注解的方式来配置它(以前是Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),即可完成对服务提供方的接口绑定,简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量。
 
 
Feign集成了Ribbon
利用Ribbon维护了MicroServiceCloud-Dept的服务列表信息,并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用
 

②Feign工程构建。

第一步:参考microservicecloud-consumer-dept-80,新建microservicecloud-consumer-dept-feign。


 
 

第二步:修改主启动类名字为DeptConsumer80_Feign_App.java。

第三步:microservicecloud-consumer-dept-feign工程pom.xml修改,主要添加对feign的支持。

pom文件需要添加以下内容:

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

pom文件的完整内容是:

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.lss.springcloud</groupId>
		<artifactId>microservicecloud</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<artifactId>microservicecloud-consumer-dept-feign</artifactId>
	<dependencies>
		<dependency><!-- 自己定义的api -->
			<groupId>com.lss.springcloud</groupId>
			<artifactId>microservicecloud-api</artifactId>
			<version>${project.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!-- 修改后立即生效,热部署 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>springloaded</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
		</dependency>

		<!-- Ribbon相关 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-ribbon</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-config</artifactId>
		</dependency>








		<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-core -->
		<dependency>
			<groupId>com.amazonaws</groupId>
			<artifactId>aws-java-sdk-core</artifactId>
			<version>1.11.125</version>
		</dependency>

		<dependency>
			<groupId>com.amazonaws</groupId>
			<artifactId>aws-java-sdk-autoscaling</artifactId>
			<version>1.11.125</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-bom -->
		<dependency>
			<groupId>com.amazonaws</groupId>
			<artifactId>aws-java-sdk-bom</artifactId>
			<version>1.11.125</version>
			<type>pom</type>
		</dependency>

		<dependency>
			<groupId>com.amazonaws</groupId>
			<artifactId>aws-java-sdk-ec2</artifactId>
			<version>1.11.125</version>
		</dependency>
		<!-- <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-pom</artifactId> 
			<version>1.11.125</version> </dependency> -->
		<dependency>
			<groupId>com.amazonaws</groupId>
			<artifactId>aws-java-sdk-sts</artifactId>
			<version>1.11.125</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.jdom/jdom2 -->
		<dependency>
			<groupId>org.jdom</groupId>
			<artifactId>jdom2</artifactId>
			<version>2.0.6</version>
		</dependency>









		<dependency>
			<groupId>org.apache.maven.shared</groupId>
			<artifactId>maven-dependency-tree</artifactId>
			<version>3.0.1</version>
		</dependency>
		<dependency>
			<groupId>org.vafer</groupId>
			<artifactId>jdependency</artifactId>
			<version>2.1.1</version>
		</dependency>
		<dependency>
			<groupId>org.ow2.asm</groupId>
			<artifactId>asm</artifactId>
			<version>7.0-beta</version>
		</dependency>
		<dependency>
			<groupId>org.ow2.asm</groupId>
			<artifactId>asm-analysis</artifactId>
			<version>7.0-beta</version>
		</dependency>
		<dependency>
			<groupId>org.ow2.asm</groupId>
			<artifactId>asm-tree</artifactId>
			<version>7.0-beta</version>
		</dependency>
		<dependency>
			<groupId>org.ow2.asm</groupId>
			<artifactId>asm-commons</artifactId>
			<version>7.0-beta</version>
		</dependency>
		<dependency>
			<groupId>org.ow2.asm</groupId>
			<artifactId>asm-util</artifactId>
			<version>7.0-beta</version>
		</dependency>







		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-loader-tools</artifactId>
			<version>2.2.4.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>4.3.13.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.apache.maven.shared</groupId>
			<artifactId>maven-shared-utils</artifactId>
			<version>3.2.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
			<version>3.9</version>
		</dependency>
		<dependency>
			<groupId>org.apache.maven</groupId>
			<artifactId>maven-core</artifactId>
			<version>3.3.9</version>
		</dependency>
		<dependency>
			<groupId>org.apache.maven</groupId>
			<artifactId>maven-repository-metadata</artifactId>
			<version>3.3.9</version>
		</dependency>
		<dependency>
			<groupId>org.eclipse.aether</groupId>
			<artifactId>aether-util</artifactId>
			<version>1.0.2.v20150114</version>
		</dependency>
		<dependency>
			<groupId>com.google.inject</groupId>
			<artifactId>guice</artifactId>
			<version>4.0</version>
		</dependency>
		<dependency>
			<groupId>org.codehaus.plexus</groupId>
			<artifactId>plexus-archiver</artifactId>
			<version>3.7.0</version>
		</dependency>
		<dependency>
			<groupId>org.ow2.asm</groupId>
			<artifactId>asm-commons</artifactId>
			<version>7.0</version>
		</dependency>
		<dependency>
			<groupId>com.google.guava</groupId>
			<artifactId>guava</artifactId>
			<version>19.0</version>
		</dependency>


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

	</dependencies>
	<!-- <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> 
		<version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> 
		</configuration> </plugin> <plugin> <artifactId> maven-assembly-plugin </artifactId> 
		<configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> 
		</descriptorRefs> <archive> <manifest> <mainClass>com.lss.springcloud.EurekaServer7001_App</mainClass> 
		</manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> 
		<phase>package</phase> <goals> <goal>single</goal> </goals> </execution> 
		</executions> </plugin> </plugins> </build> -->

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<executions>
					<execution>
						<goals>
							<goal>repackage</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>







</project>

然后再update一下。

第四步:修改microservicecloud-api工程。

pom文件需要更改:

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

microservicecloud-api的pom文件完整内容是:

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<parent><!-- 子类里面显示声明才能有明确的继承表现,无意外就是父类的默认版本否则自己定义 -->
		<groupId>com.lss.springcloud</groupId>
		<artifactId>microservicecloud</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>

	<artifactId>microservicecloud-api</artifactId><!-- 当前Module我自己叫什么名字 -->

	<dependencies><!-- 当前Module需要用到的jar包,按自己需求添加,如果父类已经包含了,可以不用写版本号 -->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
		</dependency>

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



	</dependencies>



</project>

新建DeptClientService接口并新增注解@FeignClient

DeptClientService接口的内容是:

package com.lss.springcloud.service;

import java.util.List;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.lss.springcloud.entities.Dept;

@FeignClient(value = "MICROSERVICECLOUD-DEPT")
public interface DeptClientService {

	@RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)
	public Dept get(@PathVariable("id") long id);

	@RequestMapping(value = "/dept/list", method = RequestMethod.GET)
	public List<Dept> list();

	@RequestMapping(value = "/dept/add", method = RequestMethod.POST)
	public boolean add(Dept dept);

}

然后maven clean,maven install

第五步:microservicecloud-consumer-dept-feign工程修改Controller,添加上一步新建的DeptClientService接口。

DeptController_Consumer.java的完整内容是:

package com.lss.springcloud.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import com.lss.springcloud.entities.Dept;
import com.lss.springcloud.service.DeptClientService;

@RestController
public class DeptController_Consumer {

	/*******
	 * // private static final String REST_URL_PREFIX = "http://localhost:8001";
	 * private static final String REST_URL_PREFIX =
	 * "http://MICROSERVICECLOUD-DEPT";
	 * 
	 * @Autowired private RestTemplate restTemplate;
	 * 
	 *            /* 使用: 使用restTemplate访问restful接口非常的简单粗暴无脑。 (url, requestMap,
	 *            ResponseBean.class)这三个参数分别代表  REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。
	 */
	/********
	 * @RequestMapping(value = "/consumer/dept/add") public boolean add(Dept dept) {
	 *                       return restTemplate.postForObject(REST_URL_PREFIX +
	 *                       "/dept/add", dept, Boolean.class); }
	 * 
	 * @RequestMapping(value = "/consumer/dept/get/{id}") public Dept
	 *                       get(@PathVariable("id") Long id) { return
	 *                       restTemplate.getForObject(REST_URL_PREFIX +
	 *                       "/dept/get/" + id, Dept.class); }
	 * 
	 * 						@SuppressWarnings("unchecked")
	 * @RequestMapping(value = "/consumer/dept/list") public List<Dept> list() {
	 *                       return restTemplate.getForObject(REST_URL_PREFIX +
	 *                       "/dept/list", List.class); }
	 * 
	 *                       // 测试@EnableDiscoveryClient,消费端可以调用服务发现
	 * @RequestMapping(value = "/consumer/dept/discovery") public Object discovery()
	 *                       { return restTemplate.getForObject(REST_URL_PREFIX +
	 *                       "/dept/discovery", Object.class); }
	 **/

	@Autowired
	private DeptClientService service = null;

	@RequestMapping(value = "/consumer/dept/get/{id}")
	public Dept get(@PathVariable("id") Long id) {
		return this.service.get(id);
	}

	@RequestMapping(value = "/consumer/dept/list")
	public List<Dept> list() {
		return this.service.list();
	}

	@RequestMapping(value = "/consumer/dept/add")
	public Object add(Dept dept) {
		return this.service.add(dept);
	}

}

第六步:microservicecloud-consumer-dept-feign工程修改主启动类。

DeptConsumer80_Feign_App.java增加的内容是:

@EnableFeignClients(basePackages= {"com.lss.springcloud"})
@ComponentScan("com.lss.springcloud")

DeptConsumer80_Feign_App.java的完整内容是: 

package com.lss.springcloud;

import java.util.List;
import java.lang.Object;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.context.annotation.ComponentScan;


@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages= {"com.lss.springcloud"})
@ComponentScan("com.lss.springcloud")
public class DeptConsumer80_Feign_App {

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

}

第七步:启动3个eureka集群,再启动服务提供者,再启动的feign服务消费者。

http://192.168.10.115:83/consumer/dept/list

小结:Feign通过接口的方法调用Rest服务(之前是Ribbon+RestTemplate),
该请求发送给Eureka服务器(http://MICROSERVICECLOUD-DEPT/dept/list),
通过Feign直接找到服务接口,由于在进行服务调用的时候融合了Ribbon技术,所以也支持负载均衡作用。

发布了155 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/lbh19630726/article/details/104143017
今日推荐