一点睛
Feign是Netflix开发的声明性、模板化的HTTP客户端,有助于更快、更优雅地调用HTTPAPI。
在SpringCloud中,您可以使用Feign非常简单的——创建一个接口,并在该接口中添加注释,然后完成代码。 Feign支持各种各样的注释,如Feign附带的注释和JAX-RS注释等。
SpringCloud增强了Feign,Feign支持SpringMVC注释,并将Ribbon和Eureka集成在一起,提高了Feign的易用性。
Spring Cloud Feign基于Netflix feign的实现,将SpringCloudRibbon和SpringCloudHystrix集成在一起,除了提供强大的功能外,还提供了一种声明性的Web服务客户端定义方法。
SpringCloudFeign有助于定义和实现依赖服务接口。 在SpringCloud feign实现中,只需创建一个接口并在注释中设置它,即可完成服务提供者接口的绑定,并在使用SpringCloudRibbon时自行封装服务调用
SpringCloudFeign提供了可插入的注释支持,支持Feign注释、JAX-RS注释和SpringMVC注释。
二创建项目microservice-consumer-movie-feign
三添加Feign依赖
? XML版本=' 1.0 '编码=' utf-8 '? project xmlns=' http://maven.Apache.org/POM/4.0.0 ' xmlns : xsi=' http://www.w3.org/2001/XML schema-ins TTS maven-4.0.0.xsd ' model version4.0.0/modelversiongroupidcom.it groupidartifactidmicroservice-consumer-movie 依赖versionpackagingjar/packaging spring boot部署--- parentgroupidorg.spring framework.boot/groupidartifactidspring-boot artifact parentpropertiesproject.build.sourceencodingutf-8/project.build.sourceencodingjava.version 1.8/Java.ven version propertiesdependenciesdependencygroupidorg.spring framework.boot/groupidartifactidspring-boot-starter-web/artifaccer ependencydependencygroupidorg.spring framework.boot/groupidartifactidspring-boot-starter-actuator/artior ependencydependencygroupidorg.spring framework.cloud/groupidartifactidspring-cloud-starter-eureka/artifact id/dud
lt;/groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> </dependencies> <!-- 引入spring cloud的依赖 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Camden.SR4</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <!-- 添加spring-boot的maven插件 --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>四 创建一个Feign接口,并添加@FeignClient注解
package com.itmuch.cloud.study.user.feign;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.itmuch.cloud.study.user.entity.User;@FeignClient(name = "microservice-provider-user")public interface UserFeignClient { @RequestMapping(value = "/{id}", method = RequestMethod.GET) public User findById(@PathVariable("id") Long id);}五 修改Controller代码,让其调用Feign接口
package com.itmuch.cloud.study.user.controller;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;import com.itmuch.cloud.study.user.entity.User;import com.itmuch.cloud.study.user.feign.UserFeignClient;@RestControllerpublic class MovieController { @Autowired private UserFeignClient userFeignClient; @GetMapping("/user/{id}") public User findById(@PathVariable Long id) { return this.userFeignClient.findById(id); }}六 修改启动类,为其添加@EnableFeignClients注解
package com.itmuch.cloud.study;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;import org.springframework.cloud.netflix.feign.EnableFeignClients;@EnableDiscoveryClient@SpringBootApplication@EnableFeignClientspublic class ConsumerMovieApplication { public static void main(String[] args) { SpringApplication.run(ConsumerMovieApplication.class, args); }}七 测试
1 启动eureka
2 启动2个user实例
3 启动feign
4 多次访问http://localhost:8010/user/1
发现两个微服务实例都会打印如下日志:
Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.balance as balance3_0_0_, user0_.name as name4_0_0_, user0_.username as username5_0_0_ from user user0_ where user0_.id=?