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. P1102 A-B 数对

    P1102题库链接:https://www.luogu.org/problem/P1102 难度:普及- 算法标签:模拟,数论,排序,HASH,概率论,二分查找 1.朴素 O(n^2) 得分76 将输 ...

  2. 从0开始搭建一个阿里云java部署环境

    一.购买服务器 https://www.aliyun.com/daily-act/ecs/activity_selection?spm=5176.8112568.738194.8.674c9ed53Y ...

  3. day06可变与不可变类型,if判断,运算符

    1:可变不可变类型 2.什么是条件?什么可以当做条件?为何要要用条件? 显式布尔值:True.False 隐式布尔值:所有数据类型,其中0.None.空为假 3:逻辑运算符:用来 # not. and ...

  4. vue中v-if和v-show的区别

    v-if.v-show顾名思义就是用来判断视图层展示效果的.  v-if 指令用于条件性地渲染一块内容.这块内容只会在指令的表达式返回真值的时候被渲染. v-show 指的是单纯的切换元素的样式dis ...

  5. Python实现对excel的操作

    1.操作excel使用第三方库openpyxl安装:pip install openpyxy引入:import openpyxl2.常用简单操作1)打开excel文件获取工作簿wb = openpyx ...

  6. Pocket+Evernote 打造个人知识库体系

    俗话说巧妇难为无米之炊,还是那个不太恰当的例子. 写作就好比人类的消化系统,想要持续的输出...那么就要持续的输入... 今天就来说一说如何进行持续有效的输入. 信息处理过程 先放一张图,这是我的整个 ...

  7. AspNetCore3.1_Secutiry源码解析_1_目录

    文章目录 AspNetCore3.1_Secutiry源码解析_1_目录 AspNetCore3.1_Secutiry源码解析_2_Authentication_核心项目 AspNetCore3.1_ ...

  8. 2020年IOS超级签最新实现原理详解

    相信2019年最火的应该就是这个东西了,我也是摸着石头过河,勉强混进了这个行业! 超级签这个东西吧,说白了就是用个人账号分发应用,大致分成以下几个步骤吧 一.使用配置文件获取UDID 苹果公司允许开发 ...

  9. react 脚手架装后 运行eject报错 的 正确运行方式

    git init git add . git commit -m 'init' npm run eject 或者 cnpm run eject

  10. 2016 Multi-University Training Contest 4 T9

    http://acm.hdu.edu.cn/showproblem.php?pid=5772 最大权闭合子图. 得到价值w[i][j]的条件是选了i,j这两个位置的字符.选择位置的i字符花费为 第一次 ...