06.SpringCloud OpenFeign
OpenFeign介绍
OpenFeign是什么
Feign和OpenFeign区别
Feign
OpenFeign
OpenFeign-应用实例
需求分析/图解
创建服务消费模块-通过OpenFeigen实现远程调用
创建e-commerce-consumer-openfeign-80 服务
修改e-commerce-consumer-openfeign-80 的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">
<parent>
<artifactId>e-commerce-center</artifactId>
<groupId>com.hspedu.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>e-commerce-consumer-openfeign-80</artifactId>
<!-- 引入相关的依赖-->
<dependencies>
<!-- 引入openfeign-starter 就是场景启动器 使用版本仲裁-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 引入eureka-client 场景启动器starter 使用版本仲裁-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- 引入web-starter 我们指定版本仲裁(从父项目继承了版本)-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 说明:starter-actuator 是springboot程序的监控系统,可以实现系统的监控检测
可以通过http://localhost:10000/actuator 看到相关的连接,和信息
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- 引入e_commerce_center-common-api-->
<dependency>
<groupId>com.hspedu.springcloud</groupId>
<artifactId>e_commerce_center-common-api</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
创建application.yml
server:
port: 82
spring:
application:
name: e-commerce-consumer-openfeign-80
#配置eureka-client
eureka:
client:
register-with-eureka: true # 将自己注册到 Eureka-server
# 表示从 Eureka-server 抓取注册信息
# 如果是单节点,是可以不配置的,但是如果是一个集群,则必须配置true
# 才能配合Ribbon使用负载均衡
fetch-registry: true
service-url:
# defaultZone: http://localhost:9001/eureka/
# 表示将自己注册到哪个eureka-server
# 将本微服务注册到多个eureka-server,只有逗号间隔即可
defaultZone: http://eureka9001.com:9001/eureka/,http://eureka9002.com:9002/eureka/
创建MemberConsumerOpenfeignApplication 主启动类
package com.hspedu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class MemberConsumerOpenfeignApplication {
public static void main(String[] args) {
SpringApplication.run(MemberConsumerOpenfeignApplication.class,args);
}
}
MemberConsumerOpenfeignApplication添加注解
// 启动IpenFeignClient
@EnableFeignClients
public class MemberConsumerOpenfeignApplication {
创建MemberFeignService
@Component
//MEMBER-SERVICE-PROVIDER 就是服务提供方在Eureka Server 注册的服务
@FeignClient(value = "MEMBER-SERVICE-PROVIDER")
public interface MemberFeignService {
// 这里定义方法-就是远程调用的接口
/**
* 1.远程调用的方式是get
* 2.远程调用的url http://MEMBER-SERVICE-PROVIDER/member/get/{id}
* 3.MEMBER-SERVICE-PROVIDER 就是服务提供方在Eureka Server 注册的服务
* 4.openfeign 会根据负载均衡来决定调用 -默认是轮询
* 5.因为openfeign好处是支持springmvc注解 + 接口解耦
*/
@GetMapping("/member/get/{id}")
public Result getMemberById(@PathVariable("id") Long id);
}
创建MemberConsumerFeignController
@RestController
public class MemberConsumerFeignController {
// 装配MemberFeignService
@Resource
private MemberFeignService memberFeignService;
@GetMapping("/member/consumer/openfeign/get/{id}")
public Result getMemberById(@PathVariable("id") Long id){
return memberFeignService.getMemberById(id);
}
}
测试
http://localhost:82/member/consumer/openfeign/get/2
日志配置
基本介绍
配置日志-应用实例
在e-commerce-consumer-openfeign-80 创建 OpenFeignConfig.java
@Configuration
public class OpenFeignConfig {
@Bean
public Logger.Level loggerLevel(){
return Logger.Level.FULL;
}
}
在e-commerce-consumer-openfeign-80 修改application.yml
logging:
level:
# 对MemberFeignService 接口调用过程打印信息-Debug
com.hspedu.springcloud.service.MemberFeignService: debug
OpenFeign超时
模拟超时
在member-service-provider-10000 和member-service-provider-10002
的MemberController.getMemberById() 方法添加延时5秒
// 查询接口
@GetMapping("member/get/{id}")
public Result getMemberById(@PathVariable("id") Long id) {
// 模拟超时,休眠5秒
try {
TimeUnit.MILLISECONDS.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Member member = memberService.queryMemberById(id);
if (member != null) {
return Result.success("查询会员成功 member-service-provider-10000", member);
} else {
return Result.error("402", "ID=" + id + "不存在");
}
}
访问http://localhost:82/member/consumer/openfeign/get/2 超时
原因分析 :OpenFeign 默认超时时间1秒钟,即等待返回结果1秒
设置超时时间
在 e-commerce-consumer-openfeign-80 的yml 添加
ribbon:
# 1.设置feign客户端超时时间(openfeign默认支持ribbon)
# 2. ReadTimeout 建立连接从服务提供方获取可用资源的所用的全部时间
# 3. 时间单位是毫秒
ReadTimeout: 8000
# 两端连接所用的时间
ConnectionTimeout: 8000