一、什么是Feign
Feign是一个声明式的web service客户端,它的出现使开发web service客户端变得简单、方便。使用Feign开发只需要在对应的接口加上注解即可,比如:FeignClient注解。Feign支持编码器与解码器,spring cloud open Feign 对Feign进行增强支持spring MVC注解,可以像spring web一样使用。Feign也是声明式、模板化的HTTP客户端。在spring cloud 中使用Feign可以使用HTTP请求访问远程服务。就像调用本地方法一样,使开发者完成感知不到在调用。
二、实例
1、搭建注册中心:
关于注册中心的搭建这里就不做详细的说明了,可以看我上一篇文章spring cloud搭建注册中心
2、调用客户端实例(我这里还整合了swagger2)新建producer-service项目
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</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-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.8.0</version>
</dependency>
</dependencies>
application.properties配置
#端口号
server.port=2000
##系统名称
spring.application.name=producer-service
#主机名,不配置的时候讲根据操作系统的主机名来获取
eureka.instance.hostname=127.0.0.1
##注册中心注册地址
eureka.client.service-url.defaultZone=http://127.0.0.1:1000/eureka/
eureka.instance.prefer-ip-address=true
ribbon.eureka.enabled=true
#开启健康检查
eureka.client.healthcheck.enabled=true
#租期到期时间,默认90秒
eureka.instance.lease-expiration-duration-in-seconds=30
#租赁更新时间间隔,默认30,即30秒发送一次心跳
eureka.instance.lease-renewal-interval-in-seconds=10
#虚拟主机名
eureka.instance.virtual-host-name=consumer-service
eureka.instance.instance-id=127.0.0.1:${server.port}
#访问swagger地址配置
eureka.instance.status-page-url=http://127.0.0.1:${server.port}/swagger-ui.html#
启动类:
@EnableFeignClients
@SpringBootApplication
public class ProducerServerApplication {
public static void main(String[] args) {
SpringApplication.run(ProducerServerApplication.class, args);
}
}
swagger2配置:
@Configuration
@EnableSwagger2
public class Swagger2Config {
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.cn.producerserver.controller"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("test 接口")
.description("test")
.termsOfServiceUrl("http://mychinalife.com.hk/")
.contact("test")
.version("1.0")
.build();
}
}
@RestController
@RequestMapping("/producer")
public class ProducerController {
@Autowired
private ConsumerServerFeignClient consumerServerFeignClient;
@ApiOperation(value = "传单个参数")
@GetMapping(value = "/findByName")
public String findByName(String name) {
return consumerServerFeignClient.findByName(name);
}
@ApiOperation(value = "对象参数")
@PostMapping(value = "/addUser")
public String addUser(@RequestBody User user){
return consumerServerFeignClient.addUser(user);
}
@ApiOperation(value = "上传文件")
@PostMapping(value = "/uploadFile")
public String uploadFile(MultipartFile file){
return consumerServerFeignClient.uploadFile(file);
}
}
/**
* @author zhouzenghui
* @title: ConsumerServerFeignClient
* @description: TODO 消费者 feign接口
* @date 2020/6/4 16:01
*/
@FeignClient(value = "CONSUMER-SERVICE")
public interface ConsumerServerFeignClient {
@GetMapping(value = "/consumer/findByName")
String findByName(@RequestParam("name") String name);
@PostMapping(value = "/consumer/addUser")
String addUser(@RequestBody User user);
@RequestMapping(method = RequestMethod.POST, value = "/consumer/uploadFile",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
String uploadFile(@RequestPart(value = "file") MultipartFile file);
}
public class User {
private String name;
private Integer age;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
2、服务提供实例新建producer-service项目
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</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-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.16</version>
</dependency>
</dependencies>
application.properties配置
server.port=6000
#系统名称
spring.application.name=consumer-service
#主机名,不配置的时候讲根据操作系统的主机名来获取
eureka.instance.hostname=127.0.0.1
##注册中心注册地址
eureka.client.service-url.defaultZone=http://127.0.0.1:1000/eureka/
eureka.instance.prefer-ip-address=true
ribbon.eureka.enabled=true
#开启健康检查
eureka.client.healthcheck.enabled=true
#租期到期时间,默认90秒
eureka.instance.lease-expiration-duration-in-seconds=30
#租赁更新时间间隔,默认30,即30秒发送一次心跳
eureka.instance.lease-renewal-interval-in-seconds=10
#虚拟主机名
eureka.instance.virtual-host-name=consumer-service
eureka.instance.instance-id=127.0.0.1:${server.port}
#访问swagger地址配置
eureka.instance.status-page-url=http://127.0.0.1:${server.port}/swagger-ui.html#
@SpringBootApplication
public class ConsumerServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerServerApplication.class, args);
}
}
@Slf4j
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@GetMapping(value = "/findByName")
public String findByName(String name) {
log.info("============={}==============", name);
return "成功";
}
@PostMapping(value = "/addUser")
public String addUser(@RequestBody User user) {
log.info("{}", user.toString());
return "成功";
}
@PostMapping(value = "/uploadFile")
public String uploadFile(@RequestPart("file") MultipartFile file) {
if (file == null) {
return "失败";
}
log.info("文件名:{},大小size={}", file.getOriginalFilename(), file.getSize());
return "成功";
}
}
以上是Feign的一些简单使用