在上一篇文章中,介绍了【RestTemplate的常见请求方式】,这篇文章我们就来讲讲Feign服务调用的使用方法。
Feign是Netflix开发的声明式、模板化的HTTP客户端,可帮助我们更加便捷、优雅的调用HTTP API。而且Feign通过注解来使用,而且和客户端负载均衡Ribbon以及断路器Hystrix能很好的整合使用,这是RestTemplate无法比拟的优势了。
好了,废话不多说了,直接上代码。
——————————————————————————————————————————————————————
Feign的使用
1、环境搭建
使用我们上一篇文章中搭建的项目spring-cloud-example,就不重新搭建项目了。
这是我搭建的一个maven多模块的测试项目,如果不知道IDEA如何创建多模块项目的可以看一下【IntelliJ IDEA创建Maven多模块项目】这篇文章。
此项目中,commons是公共类模块,存放实体类、工具类等,是一个普通的java项目,consumers是消费者,这里我创建两个模块分别是移动端和pc端这两个消费者,providers是提供者,同样也创建了用户以及订单两个提供者。
eureka-server则是服务注册中心,这个就不过多讲解了可以看之前的几篇文章。
这里提供者和消费者都需要引入commons模块的依赖
2、添加依赖
在消费者consumer-mobile中,添加如下依赖
<?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 http://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.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.clarezhou.example</groupId>
<artifactId>consumer-mobile</artifactId>
<version>1.0-SNAPSHOT</version>
<name>consumer-mobile</name>
<description>移动端</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR3</spring-cloud.version>
</properties>
<dependencies>
<!-- 服务调用 Feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 公共模块 实体类 工具类 -->
<dependency>
<groupId>com.clarezhou.example</groupId>
<artifactId>commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- eureka 客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3、添加注解
在主入口程序添加@EnableFeignClients注解,在项目启动时,会进行包扫描,扫描所有带有@FeignClient的注解进行处理。
package com.clarezhou.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* @author clarezhou
*/
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerMobileApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerMobileApplication.class, args);
}
}
4、属性配置
server:
port: 8101
spring:
application:
name: consumer-mobile
security:
user:
name: admin
password: 123456
eureka:
client:
serviceUrl:
defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@localhost:8081/eureka
5、声明服务
创建HelloService接口,添加@FeignClient注解
package com.clarezhou.example.service;
import main.java.com.clarezhou.example.entity.UserInfoEntity;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* @author clarezhou
* @date 2019/7/30 14:15
**/
@FeignClient(name="PROVIDER-USER")
public interface HelloService {
@RequestMapping(value = "/hello/getUserInfo",method = RequestMethod.GET)
UserInfoEntity getUserInfo();
}
@FeignClient指定提供者进行绑定服务,name后面是服务名称。
提供者是上一篇文章中写的一个例子。
@RequestMapping("getUserInfo")
public UserInfoEntity getUserInfo(){
UserInfoEntity user = new UserInfoEntity();
user.setUsername("张三");
user.setPassword("123456");
user.setEmail("132456789@qq.com");
user.setMobilePhone("13888888888");
return user;
}
6、调用服务
创建controller,在controller中使用@Autowired注解注入FeignClient。
package com.clarezhou.example.controller;
import com.clarezhou.example.service.HelloService;
import main.java.com.clarezhou.example.entity.UserInfoEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author clarezhou
* @date 2019/7/30 14:23
**/
@RestController
@RequestMapping("hello")
public class MobileHelloController {
@Autowired
private HelloService helloService;
@RequestMapping("getUserInfo")
public UserInfoEntity getUserInfo(){
return helloService.getUserInfo();
}
}
7、测试
这样,一个简单的Feign服务调用就完成了。
8、参数传递
服务调用当然离不开参数的传递,接下来看看Feign常用的传参方式
首先,提供者提供以下三个接口
@RequestMapping(value = "sayHello1",method = RequestMethod.GET)
public String sayHello1(@RequestParam("name") String name){
return " Hello "+name;
}
@RequestMapping(value = "sayHello2",method = RequestMethod.POST)
public String sayHello2(@RequestBody UserInfoEntity user){
return user.toString();
}
@RequestMapping(value = "sayHelloByName",method = RequestMethod.GET)
public String sayHello(String name){
return " Hello "+name;
}
再者,在consumer-mobile中添加FeignClient接口
@RequestMapping(value = "/hello/sayHelloByName", method = RequestMethod.GET)
String sayHelloByName(@RequestParam("name") String name);
@RequestMapping(value = "/hello/sayHello1",method = RequestMethod.GET)
String sayHello1(@RequestParam("name") String name);
@RequestMapping(value = "/hello/sayHello2",method = RequestMethod.POST)
String sayHello2(@RequestBody UserInfoEntity user);
最后,添加controller调用
@RequestMapping(value = "/sayHelloByName", method = RequestMethod.GET)
String sayHelloByName(String name){
return helloService.sayHelloByName(name);
}
@RequestMapping(value = "sayHello1",method = RequestMethod.GET)
String sayHello1(String name){
return helloService.sayHello1(name);
}
@RequestMapping(value = "sayHello2",method = RequestMethod.GET)
String sayHello2(){
UserInfoEntity user = new UserInfoEntity();
user.setUsername("赵六");
user.setPassword("123456");
user.setMobilePhone("13999999999");
user.setEmail("11111111@qq.com");
return helloService.sayHello2(user);
}
运行结果如下:
feign的简单应用就讲到这里了。