简介
本篇的 Feign 和 上一篇的 Ribbon 都是用于调用其他服务,但是调用的方式不同,Ribbon 需要搭配 RestTemplate 进行 Http 请求,步骤较为繁琐;Feign 是 Ribbon 的改进,整合了 Ribbon 和 Hystrix,不需要构建 Http 请求,并且采用接口的方式声明即可调用。
实例
1、创建 maven 工程
创建 maven 工程,添加核心的父 maven 依赖,所有子 pom 文件继承这个父 pom 文件。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</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>
2、搭建服务注册中心 eureka-server
添加 maven 依赖
<parent>
<groupId>com.hly</groupId>
<artifactId>03-spring-cloud-feign</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</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.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
application.yml
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
spring:
application:
name: eureka-server
SpringBoot 启动类
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
3、搭建服务提供者 eureka-client
添加 maven 依赖
<parent>
<groupId>com.hly</groupId>
<artifactId>03-spring-cloud-feign</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</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.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
添加配置信息 application.yml
server:
port: 8762
spring:
application:
name: eureka-client
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
SpringBoot 启动类
@SpringBootApplication
@RestController
@EnableEurekaClient
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
@Value("${server.port}")
String port;
@RequestMapping("/hello")
public String home(@RequestParam(value = "name", defaultValue = "hly") String name) {
return "hi " + name + " ,i am from port:" + port;
}
}
4、搭建服务消费者 feign 客户端
添加 maven 依赖
<parent>
<groupId>com.hly</groupId>
<artifactId>03-spring-cloud-feign</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</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.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>
</dependencies>
添加 application.yml 配置
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
server:
port: 8765
spring:
application:
name: service-feign
# 设置feign客户端超时时间
ribbon:
# 建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间。
ReadTimeout: 5000
# 建立连接后从服务器读取到可用资源所用的时间。
ConnectTimeout: 5000
# feign:
# hystrix:
#enabled : true
SpringBoot 启动类
@SpringBootApplication
@EnableEurekaClient
//让注册中心扫描到,EnableEurekaClient只适用于 eureka,@EnableDiscoveryClient 可以是其他注册中心
@EnableDiscoveryClient
@EnableFeignClients
public class EurekaFeignApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaFeignApplication.class, args);
}
}
服务层接口
//服务名指定调用哪个服务
@FeignClient(value = "eureka-client")
public interface ServiceHi {
//这里的映射名和需要调用的服务的映射名一样
@RequestMapping(value = "/hello",method = RequestMethod.GET)
String sayHiFromClientOne(@RequestParam(value = "name") String name);
}
控制层
@RestController
public class HiController {
@Autowired
ServiceHi serviceHi;
/**
* 消费服务
* 访问:http://localhost:8765/hi?name=hly 交替输出响应两个服务
* @param name
* @return
*/
@GetMapping(value = "/hi")
public String sayHi(@RequestParam String name) {
return serviceHi.sayHiFromClientOne( name );
}
}
演示
1、依次启动 注册中心 eureka-server ,启动两个 eureka-client(启动一个后,修改application.yml 配置文件的端口,再次启动一次),接着启动 Feign 客户端,访问:
http://localhost:8765/hi?name=hly ,刷新浏览器,实现负载均。
思维导图
代码下载
03-spring-cloud-feign:https://github.com/huangliangyun/Spring-Cloud-Finchley
关于
我的 Github:Github
CSDN: CSDN
个人网站: sirius 的博客
E-mail: [email protected]