目录
(1)服务提供方Provider80写超时方法(controller)
(2)服务消费者Consumer83添加远程调用方法(Service)
(1)配置服务消费者Consumner83的application.yml
一、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秒后访问成功