通过接口上面添加注解 可以实现服务的RPC远程调用,面向微服务接口调用。
两个要点 绑定服务 面向微服务接口
首先创建一个用Feign实现接口调用的服务
cloud-feign-consumer-83
pom中引入OpenFeign
<?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>cloud2021</artifactId>
<groupId>com.liuxu</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-feign-consumer-83</artifactId>
<dependencies>
<!--引入comm工程-->
<dependency>
<groupId>com.liuxu</groupId>
<artifactId>cloud-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--eurekaClient-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--OpenFeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--springboot 必须有的-->
<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>
<!--热启动-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>
启动类开Feign
package liuxu;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* @author liuxu
* @date 2021/10/27 21:45
*/
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class EurekaFeignClient83 {
public static void main(String[] args) {
SpringApplication.run(EurekaFeignClient83.class,args);
}
}
编写yml文件
server:
port: 83 #端口号
spring:
application:
name: cloud-cinsumer-83 #服务名
eureka:
client:
# 是否从Eureka抓取注册信息 单节点情况下无用 集群情况下才能配合robbion使用负载均衡
fetch-registry: true
# 注册如Eureka 用 true
register-with-eureka: true
service-url:
# 设置与eureka server交互的地址查询和注册服务都需要这个地址 向注册中心注册
defaultZone: http://localhost:7001/eureka/
ribbon:
ReadTimeout: 5000 #等待服务响应的时间 默认1s
ConnectTimeout: 5000 #等待服务连接的时间 默认1s
编写与远程服务接口路径相同对应的接口
package liuxu.feign;
import com.liuxu.result.CommResult;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author liuxu
* @date 2021/10/29 21:06
*/
@FeignClient("cloud-provider") //指定要调用的服务名 可以在eureka客户端看到 也可以在8001
//8002 服务提供方配置文件中找到 不区分大小写
public interface Providers {
@RequestMapping("/provider/ok")//会访问路径 到8001 或者8002 找对应路径的接口 mvc内容
public CommResult ok();
@RequestMapping("/provider/port")
public CommResult getPort();
@RequestMapping("/provider/timeOut")
public CommResult timeOut();
}
8001 8002 中添加可以供远程调用的接口
package com.liuxu.controller;
import com.liuxu.result.CommResult;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.TimeUnit;
/**
* @author liuxu
* @date 2021/10/27 22:00
*/
@RestController
@RequestMapping("/provider")
public class MyController {
@Value("${server.port}")
private String port;
@RequestMapping("/ok")
public CommResult ok(){
CommResult commResult = new CommResult();
commResult.setCode("200");
commResult.setMsg("8001正常返回");
return commResult;
}
@RequestMapping("/port")
public CommResult getPort(){
CommResult commResult = new CommResult();
commResult.setCode("200");
commResult.setMsg("8001正常返回port是:"+port);
return commResult;
}
@RequestMapping("/timeOut")
public CommResult timeOut(){
try{
TimeUnit.SECONDS.sleep(3);
}catch (Exception e){
e.printStackTrace();
}
CommResult commResult = new CommResult();
commResult.setMsg("3s等待后远程调用成功");
commResult.setCode("500");
return commResult;
}
}
此时启动 注册中心 7001 ,服务提供者8001 8002 ,服务消费者Feign客户端83
通过访问
http://localhost:83/feign/getService
可以看到 轮询调用了8001 8002
访问http://localhost:83/feign/getTimeOut
如果配置文件配置了超时时间小于 8001 或者 8002 服务的程序等待时间 就会报超时错误
如果配置的是5000ms 大于 3s等待时间 则会3s后正常返回
此外OpenFeingn有增强日志功能。可以自行研究
下一篇介绍断路器相关内容
本文介绍了如何利用OpenFeign在Spring Cloud中实现微服务间的RPC远程调用,包括在`pom.xml`中引入依赖,启动类启用Feign和Eureka客户端,以及编写Feign接口来调用远程服务。同时,文章还展示了服务提供者的接口实现,并提及了超时配置和OpenFeign的日志增强功能。最后,预告了接下来将讨论的断路器相关内容。
5516

被折叠的 条评论
为什么被折叠?



