远程调用框架OpenFeign
2023-01-09 15:03:53 0 举报
AI智能生成
远程调用框架OpenFeign的整个学习思路导图,从入门到精通,不怕学不会就怕没思路。
作者其他创作
大纲/内容
了解概念
OpenFeign是一个显示声明式的WebService客户端
OpenFeign的设计宗旨式简化Java Http客户端的开发
OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解,如 @RequesMapping/@GetMappering等
它的作用
使用OpenFeign能让编写Web Service客户端更加简单。使用时只需定义服务接口,然后在上面添加注解即可
在OpenFeign的协助下,我们只需创建一个接口并使用注解的方式进行配置
(类似于Dao接口上面的Mapper注解)即可完成对服务提供方的接口绑定,调用远程接口像调用本地方法一样
(类似于Dao接口上面的Mapper注解)即可完成对服务提供方的接口绑定,调用远程接口像调用本地方法一样
OpenFeign集成了Ribbon,利用ribbon维护了服务列表,并且通过ribbon实现了客户端的负载均衡
OpenFeign的使用
创建服务提供者
引入jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 添加 Nacos 支持 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 添加 Nacos 支持 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
添加配置文件
spring:
application:
name: springcloud-openfeign-provider # 项目名称(nacos 注册的服务名)
cloud:
nacos:
discovery:
username: nacos # nacos 登录用户名
password: nacos # nacos 密码
server-addr: 127.0.0.1:8848 # nacos 服务端地址
server:
port: 8082 # 项目启动端口号
application:
name: springcloud-openfeign-provider # 项目名称(nacos 注册的服务名)
cloud:
nacos:
discovery:
username: nacos # nacos 登录用户名
password: nacos # nacos 密码
server-addr: 127.0.0.1:8848 # nacos 服务端地址
server:
port: 8082 # 项目启动端口号
添加服务方法
@SpringBootApplication
@RestController
public class OpenFeignProviderApplication {
public static void main(String[] args) {
SpringApplication.run(OpenFeignProviderApplication.class, args);
}
/**
* 为客户端提供可调用的接口
*/
@RequestMapping("/call/{name}")
public String call(@PathVariable String name) {
return LocalTime.now() + "——服务提供者:" + name;
}
}
@RestController
public class OpenFeignProviderApplication {
public static void main(String[] args) {
SpringApplication.run(OpenFeignProviderApplication.class, args);
}
/**
* 为客户端提供可调用的接口
*/
@RequestMapping("/call/{name}")
public String call(@PathVariable String name) {
return LocalTime.now() + "——服务提供者:" + name;
}
}
创建服务消费者
引入jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 添加 nacos 框架依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 添加 openfeign 框架依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 添加 nacos 框架依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 添加 openfeign 框架依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
添加配置文件
spring:
application:
name: springcloud-openfeign-consumer # 项目名称(nacos 注册的服务名)
cloud:
nacos:
discovery:
username: nacos # nacos 登录用户名
password: nacos # nacos 密码
server-addr: 127.0.0.1:8848 # nacos 服务端地址
server:
port: 8091 # 项目启动端口号
member-provider.requesturl: 127.0.0.1:8081
application:
name: springcloud-openfeign-consumer # 项目名称(nacos 注册的服务名)
cloud:
nacos:
discovery:
username: nacos # nacos 登录用户名
password: nacos # nacos 密码
server-addr: 127.0.0.1:8848 # nacos 服务端地址
server:
port: 8091 # 项目启动端口号
member-provider.requesturl: 127.0.0.1:8081
开启 OpenFeign
@SpringBootApplication
@EnableFeignClients // 启用 OpenFeign
public class OpenFeignCustomerApplication {
public static void main(String[] args) {
SpringApplication.run(OpenFeignCustomerApplication.class, args);
}
}
@EnableFeignClients // 启用 OpenFeign
public class OpenFeignCustomerApplication {
public static void main(String[] args) {
SpringApplication.run(OpenFeignCustomerApplication.class, args);
}
}
创建 OpenFeign
与服务提供者的调用接口
与服务提供者的调用接口
/**
* 通过 OpenFeigen 实现远程调用的三种方式
*/
@Component
//@FeignClient("springcloud-openfeign-provider") // 1.通过注册中心服务发现实现远程调用
//@FeignClient(name = "member",url = "127.0.0.1:8082")//2.指定url地址,不经过Ribbon的服务选择,直接请求服务
@FeignClient(name = "member",url = "${member-provider.requesturl}",contextId = "dynamicUrl")//动态url地址,不经过Ribbon的服务选择,直接请求服务
public interface SpringCloudOpenFeignProviderClient {
@GetMapping("/call/{name}") // 使用 get 方式,调用服务提供者的 /call/{name} 接口
String call(@PathVariable(value = "name") String name);
}
* 通过 OpenFeigen 实现远程调用的三种方式
*/
@Component
//@FeignClient("springcloud-openfeign-provider") // 1.通过注册中心服务发现实现远程调用
//@FeignClient(name = "member",url = "127.0.0.1:8082")//2.指定url地址,不经过Ribbon的服务选择,直接请求服务
@FeignClient(name = "member",url = "${member-provider.requesturl}",contextId = "dynamicUrl")//动态url地址,不经过Ribbon的服务选择,直接请求服务
public interface SpringCloudOpenFeignProviderClient {
@GetMapping("/call/{name}") // 使用 get 方式,调用服务提供者的 /call/{name} 接口
String call(@PathVariable(value = "name") String name);
}
使用远程服务接口
@RestController
public class ConsumerController {
@Resource
private SpringCloudOpenFeignProviderClient openFeignProviderClient; // 加载 openfeign client
@GetMapping("/consumer")
public String consumer(@RequestParam String name) {
// 向调用本地方法一样,调用 openfeign client 中的方法
return openFeignProviderClient.call(name);
}
}
public class ConsumerController {
@Resource
private SpringCloudOpenFeignProviderClient openFeignProviderClient; // 加载 openfeign client
@GetMapping("/consumer")
public String consumer(@RequestParam String name) {
// 向调用本地方法一样,调用 openfeign client 中的方法
return openFeignProviderClient.call(name);
}
}
远程调用的三种方式
1.通过注册中心服务发现实现远程调用
2.指定url地址,不经过Ribbon的服务选择,直接请求服务
3.动态url地址,不经过Ribbon的服务选择,直接请求服务
通过配置文件,配置url地址
通过配置文件,配置url地址
日志配置
描述
Feign 提供了日志打印功能,可以通过配置来调整日志级别,从而对 Feign 接口的 调用情况进行监控和输出
日志级别
NONE∶默认的,不显示任何日志
BASIC∶仅记录请求方法、URL、响应状态码及执行时间;
HEADERS∶除了 BASIC中定义的信息之外,还有请求和响应的头信息;
FULL∶除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据。
BASIC∶仅记录请求方法、URL、响应状态码及执行时间;
HEADERS∶除了 BASIC中定义的信息之外,还有请求和响应的头信息;
FULL∶除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据。
应用实例
代码示例
@Configuration
public class OpenFeignConfig {
/**
* 指定日志级别
* @return
*/
@Bean
public Logger.Level logLevel(){
return Logger.Level.FULL;
}
}
public class OpenFeignConfig {
/**
* 指定日志级别
* @return
*/
@Bean
public Logger.Level logLevel(){
return Logger.Level.FULL;
}
}
yml配置
logging:
# openfeign接口远程调用过程打印信息 级别-Debug
level:
com.jesonking.openfeigncustomer.SpringCloudOpenFeignProviderClient: debug
# openfeign接口远程调用过程打印信息 级别-Debug
level:
com.jesonking.openfeigncustomer.SpringCloudOpenFeignProviderClient: debug
超时时间
默认超时时间
openfeign默认超时时间为1秒,即调用得到响应的时间超出1秒则会超时抛出异常
设置超时时间
1.设置Ribbon的超时时间(不推荐)
2.设置openFeign的超时时间(推荐)
OpenFeign的实现原理
OpenFeign通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务
原理图
底层实现
源码
源码
源码实现结构图
结构图
源代码地址
https://github.com/spring-cloud/spring-cloud-openfeign
收藏
0 条评论
下一页