目录
一、OpenFeign介绍
1、概念
2、作用
3、架构图
二、OpenFeign案例
1、案例说明
2、搭建Eureka服务端
(1)创建maven工程
(2)导入依赖
(3)配置application.yml
(4)创建主启动类
(5)启动Eureka注册中心
3、搭建服务提供者Provider80
(1)创建maven工程
(2)导入依赖
(3)配置application.yml
(4)创建启动类
(5)创建controller
4、搭建服务提供者Provider81(复制80端口)
(1)点击下方service
(2)复制端口
(3)测试服务Provider81
5、搭建服务消费者Consumer83(重点)
(1)创建maven工程
(2)导入依赖
(3)配置application.yml
(4)创建主启动类
(5)创建远程调用服务接口
(6)创建controller
6、测试案例
三、OpenFeign超时控制
1、超时控制概念
2、模拟超时报错
(1)服务提供方Provider80写超时方法(controller)
(2)服务消费者Consumer83添加远程调用方法(Service)
(4)测试
3、Feign通过配置文件可以控制超时时间
(1)配置服务消费者Consumner83的application.yml
(2)测试
一、OpenFeign介绍
1、概念
Feign是一个声明式web服务客户端,只需要创建一个接口并添加注解,即可实现远程调用服务。
2、作用
①服务消费者在远程调用时,只需通过编写一个接口,并表上注解进行配置,即可实现对服务提供方接口的绑定。
②Feign集成Ribbon,Feign利用Ribbon维护服务提供方列表,实现轮询调用服务提供者。
3、架构图
二、OpenFeign案例
1、案例说明
一个Eureka注册中心,两个服务提供者Provider80、Provider81,实现同一功能,一个服务消费者Consumer82,如下图:
2、搭建Eureka服务端
(1)创建maven工程
(2)导入依赖
导入Eureka服务端、web模块依赖
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
(3)配置application.yml
①服务端口为7001;
②Eureka服务端主机名;
③Eureka客户端:
register-with-eureka:是否在服务中心注册
fetchRegistry:是否可以在注册中心被发现
service-url:服务中心url地址
server:
port: 7001
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetchRegistry: false
service-url:
defaultZone: http://localhost:7001/eureka
(4)创建主启动类
@EnableEurekaServer:Eureka服务端注解
@SpringBootApplication
@EnableEurekaServer
public class Eureka7001 {
public static void main(String[] args) {
SpringApplication.run(Eureka7001.class,args);
}
}
(5)启动Eureka注册中心
访问http://localhost:7001
3、搭建服务提供者Provider80
(1)创建maven工程
(2)导入依赖
导入Eureka客户端、web模块、监控依赖
<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.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
(3)配置application.yml
①配置服务端口号为80;
②配置服务应用名称;
③配置Eureka注册中心,开启注册,指明注册中心地址。
server:
port: 80
spring:
application:
name: provider
eureka:
client:
register-with-eureka: true
fetchRegistry: true
service-url:
defaultZone: http://localhost:7001/eureka
(4)创建启动类
@EnableEurekaClient:指明该服务为Eureka客户端
@SpringBootApplication
@EnableEurekaClient
public class Provider80 {
public static void main(String[] args) {
SpringApplication.run(Provider80.class,args);
}
}
(5)创建controller
@RestController
public class FeignController {
@Value("${server.port}")
private String port;
@GetMapping("/provider")
public String hello(){
return "访问端口号为:"+port;
}
}
4、搭建服务提供者Provider81(复制80端口)
由于Provider81服务和Provider8005服务内容一样,我们可以直接通过复制端口启动80服务,这就是上方controller为什么返回端口号原因,具体步骤如下:
(1)点击下方service
若下方没有service,可以到View打开,如下图:
(2)复制端口
-Dserver.port指明复制后的端口号
(3)测试服务Provider81
访问http://localhost:81/provider
5、搭建服务消费者Consumer83(重点)
(1)创建maven工程
(2)导入依赖
引入OpenFeign、Eureka、web,服务监控依赖
<dependencies>
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</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.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
(3)配置application.yml
①配置服务·端口号为83;
②配置服务名称为:Consumer83;
③配置Eureka客户端,开启注册。配置注册中心地址。
server:
port: 83
spring:
application:
name: consumer83
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:7001/eureka
(4)创建主启动类
开启Eureka客户端,远程条用Feign客户端
@EnableEurekaClient
@SpringBootApplication
@@EnableFeignClients
public class Consumer83 {
public static void main(String[] args) {
SpringApplication.run(Consumer83.class,args);
}
}
(5)创建远程调用服务接口
①@FeignClient注解,指定远程调用的服务名称,服务提供者Provider80、Provider81对应名称为:provider。
②接口中方法为:调用服务的controller方法。
@Component
@FeignClient(value = "PROVIDER")
public interface FeignService {
//调用远程接口
@GetMapping("/provider")
public String hello();
}
(6)创建controller
通过远程接口调用服务。
@RestController
public class FeignController {
//调用远程服务接口
@Autowired
private FeignService feignService;
@GetMapping("consumer")
public String hello(){
//调用接口
return feignService.hello();
}
}
6、测试案例
①启动Eureka7001;
②启动服务提供者Provider80,Provider81
③启动服务消费者Consumer83
访问http://localhost:83/consumer,默认轮询策略
第一次请求
第二次请求
三、OpenFeign超时控制
1、超时控制概念
默认情况下,Feign客户端只等待一秒钟,一秒后服务提供者未作出响应,服务消费者则会报错。
2、模拟超时报错
(1)服务提供方Provider80写超时方法(controller)
调用TimeUnit让进程睡眠3秒,模拟超时
@GetMapping("timeout")
public String timeout(){
try {
//睡眠3秒
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "hello";
}
(2)服务消费者Consumer83添加远程调用方法(Service)
@GetMapping("timeout")
public String timeout();
(3)服务消费者Consumer83添加远程调用方法(Controller)
@GetMapping("time")
public String time(){
return feignService.timeout();
}
(4)测试
依次启动Eureka7001、Provider80、Consumer83;
访问http://localhost:83/time;
发现超时报错
3、Feign通过配置文件可以控制超时时间
(1)配置服务消费者Consumner83的application.yml
设置客户端超时时间为4秒
ribbon:
ReadTimeout: 4000
ConnectTimeout: 4000
MaxAutoRetries: 1 #同一台实例最大重试次数,不包括首次调用
MaxAutoRetriesNextServer: 1 #重试负载均衡其他的实例最大重试次数,不包括首次调用
OkToRetryOnAllOperations: false #是否所有操作都重试
(2)测试
访问:http:localhost:83/time
等待3秒后访问成功