1,在上篇博文中,已经实现了feign 客户端来远程调用接口的功能,因为feign 客户端在springcloud 开发过程中是比较常用的方式

https://www.cnblogs.com/pickKnow/p/11385656.html

2,上一篇博文中的架构,比较简单,直接使用feign 客户端没有重构的话,代码比较冗余。例如,member 服务中调用FeignMember 中的 getOrder 接口,FeignOrder 中的接口的具体实现在order 服务中的getOrder 中来实现

这样的代码比较冗余,如果有很多方法,就得写好多的接口。。。

@FeignClient(name = "app-aiyuesheng-order")
public interface OrderFeign { @RequestMapping("/getOrder")
public String getOrder();
。。。。
。。。。
如果有好多接口,这边得写很多,代码很冗余
}

3,springcloud 项目中,重构feign 客户端

项目的最终的目录结构

-----eureka: 单独的项目,eureka 注册中心

-----springcloud-parents: 父项目,里面是共同的依赖,maven project 的打包类型选择pom

----------springcloud-api-service     :子moduel.也是pom 类型,api 接口,没有实现

---------------springcloud-api-member-service: 子module:jar 类型,具体的member 的接口

---------------springcloud-api-order-service:   子module:jar 类型,具体的order 的接口

----------springcloud-api-member-impl-service: 子module,jar 类型,member api 的具体实现

----------springcloud-api-order-impl-service: 子module,jar 类型,order api 的具体实现

第一步:

springcloud-parents:

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<!-- 管理依赖 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.M7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- SpringBoot整合Web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- SpringBoot整合eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- SpringBoot整合fegnin客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency> </dependencies>
<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>

第二步:

springcloud-api-order-service: order 服务的api 接口, @RequestMapping("/getOrder") 是为了Feign 客户端来调用

public interface IOrderService {

    @RequestMapping("/getOrder")
public Order getOrder(String orderId);
}

第三步:

springcloud-api-order-impl-service: order 服务的api 接口的具体实现,因为在不同的项目里面,所以要在maven里面把springcloud-api-order-service 的依赖加进去

<!--把order的接口引入过来 -->
<dependencies>
<dependency>
<groupId>com.aiyuesheng</groupId>
<artifactId>springcloud-api-order-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>

开始写接口的实现:

@RestController
public class OrderServiceImpl implements IOrderService { @RequestMapping("/getOrder")
public Order getOrder(String orderId) {
Order order = new Order();
order.setOrderId(orderId);
order.setOrderName("订单名称");
return order;
} }

第四步:在springcloud-api-member-impl-service 里面开始掉用order 服务,使用feign 客户端,

创建了 OrderServiceFeign,指定需要调用的服务名称

@RestController
public class MemberServiceImpl { @Autowired
private OrderServiceFeign orderServiceFeign;
//通过feign 客户端来实现远程调用
@RequestMapping("/getOrder")
public Order getOrder(String orderId){
Order order = orderServiceFeign.getOrder(orderId);
return order;
} }

指定了调用的服务别名:app-aiyuesheng-order

@FeignClient(value = "app-aiyuesheng-order")
public interface OrderServiceFeign extends IOrderService { }

同时继承了IOrderService,相当于这部分代码不用写了,写出来就是冗余的代码

    @RequestMapping("/getOrder")
public Order getOrder(String orderId);

但是需要在maven 里面加入依赖:

<dependencies>
<dependency>
<groupId>com.aiyuesheng</groupId>
<artifactId>springcloud-api-order-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>

这样,就完成了代码的重构,以及用Feign 客户端实现远程调用

主要Feign 客户端是默认支持Ribbon 客户端负载均衡器的,所以,当服务集群的时候,也能够轮询式的访问

如果使用Feign 客户端远程调用接口的时间过长怎么处理呢?可以加入超时时间的配置:

###设置feign客户端超时时间
ribbon:
###指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间。
ReadTimeout: 5000
###指的是建立连接后从服务器读取到可用资源所用的时间。
ConnectTimeout: 5000

Feign客户端的重构,新建springcloud架构的更多相关文章

  1. Springcloud 整合Hystrix 断路器,支持Feign客户端调用

    1,在这篇博文中,已经大致说过了Springcloud服务保护框架 Hystrix在服务隔离,服务降级,以及服务熔断中的使用 https://www.cnblogs.com/pickKnow/p/11 ...

  2. Spring Cloud之Feign客户端调用工具

    feign介绍 Feign客户端是一个web声明式http远程调用工具,提供了接口和注解方式进行调用. Spring Cloud 支持 RestTemplate  Fetin Feign客户端实际开发 ...

  3. Spring Boot使用Feign客户端调用远程服务时出现:timed-out and no fallback available,failed and no fallback available的问题解决

    timed-out and no fallback available: 这个错误基本是出现在Hystrix熔断器,熔断器的作用是判断该服务能不能通,如果通了就不管了,调用在指定时间内超时时,就会通过 ...

  4. Feign客户端实现RPC 调用

    1,springcloud 中支持http调用的两种方式,RestTemplate,Feign客户端 2,Feign 客户端是一个声明式(注解方式)http 远程调用工具 3,实现方式如下: 第一步: ...

  5. 《重构网络-SDN架构与实现》阅读随笔

    <重构网络-SDN架构与实现>: SDNLAB <重构网络-SDN架构与实现>新书有奖试读活动 资源下载 随笔 有幸拜读了李呈前辈和杨泽卫杨老师的作品<重构网络-SDN架 ...

  6. Spring Cloud之Feign客户端超时时间配置

    关于雪崩效应: 默认情况下tomcat只有一个线程去处理客户端发送的所有请求.高并发情况下,如果客户端请求都在同一接口,tomcat的所有线程池去处理,导致其他接口服务访问不了,等待. Tomcat有 ...

  7. Feign 客户端调用错误

    1.@RequestBody 必须要写在实现接口中 2.Feign 客户端调用的时候如果有参数的话,默认是发送post请求 3.服务接口中的请求参数必须要加上@RequestParam("r ...

  8. Feign 客户端的使用 二

    一.Feign的使用(客户端调用 json/xml格式的接口) 1.服务端接口编写 <parent> <groupId>org.springframework.boot< ...

  9. Android重构篇——项目架构篇

    版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/6823777.html 前言 大家好,我是Cavalier ...

随机推荐

  1. AI:深度学习用于文本处理

    同本文一起发布的另外一篇文章中,提到了 BlueDot 公司,这个公司致力于利用人工智能保护全球人民免受传染病的侵害,在本次疫情还没有引起强烈关注时,就提前一周发出预警,一周的时间,多么宝贵! 他们的 ...

  2. idea导入 spring framework项目

    准备的环境:gradle,idea 注意:gradle版本不一致会报各种错误,那么怎么查找依赖的版本呢? 首先在git上把spring framework项目拉取下来, 步骤一:复制URL路径 步骤二 ...

  3. 简单说 用CSS做一个魔方旋转的效果

    说明 魔方大家应该是不会陌生的,这次我们来一起用CSS实现一个魔方旋转的特效,先来看看效果图! 解释 我们要做这样的效果,重点在于怎么把6张图片,摆放成魔方的样子,而把它们摆放成魔方的样子,重点在于用 ...

  4. npm发布包的那些事

    npm发包的那些事 最近一直在研习关于node的知识,发布包虽然是最基础的一点,但由于一些地方的不注意很容易发生错误,我整理了我可能出现过的一些发布包的过程中的一些error,现在分享给大家: 正确的 ...

  5. 原生js中的常用方法的写法

    1.js深度克隆的方法 //第一种 function deepClone(obj){ var str,newObj = obj instanceof Array? [] : {}; if(typeof ...

  6. FreeSql 插入数据,如何返回自增值

    FreeSql是一个功能强大的 .NET ORM 功能库,支持 .NetFramework 4.0+..NetCore 2.1+.Xamarin 等支持 NetStandard 所有运行平台. 以 M ...

  7. Typora[MarkDown编辑器]+(PicGo+Github+JsDelivr)[个人图床] ,开启你的高效创作

    使用Typora搭配Picgo开启你的高效创作 0x00 一切都要从MarkDown说起 富文本语言的弊端 平常我们最常用的写作工具,无非是富文本编辑器中的代表--微软家的Office Word.这种 ...

  8. django使用户名和邮箱都能登录

    为了能够让邮箱也能登录,需要重新定义认证功能,需要把email添加成username用于认证 定义的class继承ModelBackend,使用Q方法并集 然后在settings.py里面添加 这样既 ...

  9. OpenGL 实践之贝塞尔曲线绘制

    说到贝塞尔曲线,大家肯定都不陌生,网上有很多关于介绍和理解贝塞尔曲线的优秀文章和动态图. 以下两个是比较经典的动图了. 二阶贝塞尔曲线: 三阶贝塞尔曲线: 由于在工作中经常要和贝塞尔曲线打交道,所以简 ...

  10. java面试汇总一

    第一部分 Java SE基础(1) 1.1 java的8种基本数据类型 装箱  拆箱 1.1.1  8种基本的数据类型 1.1.2装箱  拆箱 自动装箱是 Java 编译器在基本数据类型和对应的对象包 ...