一、Feign简介
Feign是一个声明式的Web服务客户端。这使得Web服务客户端的写入更加方便 要使用Feign创建一个界面并对其进行注释。它具有可插入注释支持,包括Feign注释和JAX-RS注释。Feign还支持可插拔编码器和解码器。Spring Cloud增加了对Spring MVC注释的支持,并使用Spring Web中默认使用的HttpMessageConverters
。Spring Cloud集成Ribbon和Eureka以在使用Feign时提供负载均衡的http客户端。
- Feign 采用的是基于接口的注解
- Feign 整合了ribbon,具有负载均衡的能力
- 整合了Hystrix,具有熔断的能力
二、创建一个注册中心(feign-server)和一个服务消费者(feign-client)
具体创建方式和上篇的“SpringCloud——服务的注册与发现Eureka”,请参考:
地址:https://blog.csdn.net/typ1805/article/details/82621881
项目结构如图:
三、建一个服务消费者(service-feign)
1、所依赖的pom.xml文件:
<?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>
<groupId>com.example.demo.feign</groupId>
<artifactId>service-feign</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>service-feign</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.example.demo</groupId>
<artifactId>springcloud-feign</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<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-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2、配置文件application.yml如下:
server:
port: 8083
eureka:
client:
service-url:
defaultZone: http://localhost:8081/eureka/
spring:
application:
name: service-feign
在配置文件指定服务的注册中心地址为http://localhost:8081/eureka/,程序名称为 service-feign,程序端口为8083
3、启动类添加注解@EnableFeignClients注解开启Feign的功能
package com.example.demo.feign;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableFeignClients
public class ServiceFeignApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceFeignApplication.class, args);
}
}
4、定义一个feign接口,通过@ FeignClient(“服务名”),来指定调用哪个服务。比如在代码中调用了feign-client服务的“/holle”接口,代码如下:
package com.example.demo.feign.service;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
/**
* 路径:com.example.demo.feign.service
* 类名:
* 功能:《用一句描述一下》
* 备注:
* 创建人:typ
* 创建时间:2018/9/11 22:03
* 修改人:
* 修改备注:
* 修改时间:
*/
@FeignClient(value = "feign-client")
public interface TestService {
@RequestMapping(value = "/holle",method = RequestMethod.GET)
public String getByClientOne(@RequestParam(value = "name")String name);
}
5、在controller层,对外暴露一个”/test”的API接口,通过定义的Feign客户端TestService来消费服务。代码如下:
package com.example.demo.feign.controller;
import com.example.demo.feign.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 路径:com.example.demo.feign.controller
* 类名:
* 功能:《用一句描述一下》
* 备注:
* 创建人:typ
* 创建时间:2018/9/11 22:06
* 修改人:
* 修改备注:
* 修改时间:
*/
@RestController
public class TestController {
@Autowired
private TestService testService;
@GetMapping("/test")
public String test(String name){
return testService.getByClientOne(name);
}
}
启动项目,多次访问http://localhost:8083/test?name=张三,浏览器交替显示:
张三--------8082
张三--------8084
源码下载:https://download.csdn.net/download/typ1805/10660625