介绍

服务间通信简介

一个系统可以由不同的微服务构成,比如一个电商系统可以由订单服务、商品服务、用户服务等共同组成。 这些服务相互独立,但又相互依赖。由于它们相互依赖,所以需要通过通信的方式来进行相互调用。

服务间通信方式主要有两种:

(1) 基于HTTP的REST(SpringCloud)

(2) RPC(Dubbo)

SpringCloud服务间调用方式有两种:

(1) RestTemplate

(2) FeignClient

这两种方式都是通过REST接口调用服务的http接口

SpringCloud搭建各种微服务之后,服务间通常存在相互调用的需求,SpringCloud提供了@FeignClient 注解非常优雅的解决了这个问题,Feign的中文名称翻译过来是伪装。

实战中使用Feign进行服务间通信

1. 增加依赖(WKD项目中使用)

  1. 1 <dependency>
  2. 2 <groupId>org.springframework.cloud</groupId>
  3. 3 <artifactId>spring-cloud-starter-openfeign</artifactId>
  4. 4 </dependency>

说明:依赖有分feign和openfeign

(1) Feign本身不支持Spring MVC的注解,它有一套自己的注解;

(2) Spring Cloud OpenFeign是在Feign的基础上扩展了对Spring MVC注解的支持,如@RequesMapping等等,同时还整合了Ribbon和Eureka来提供均衡负载的HTTP客户端实现。

2、增加注解@EnableFeignClients

(1) 在Application启动类上增加注解@EnableFeignClients

(2)写在一个专门的配置文件中

说明:FeignClinentConfig 外部Restful接口引入:

如果Feignclien是外部包引入的,可能需要指定扫描路径,在注解@EnableFeignClients中指定

@EnableFeignClients(/*basePackages={"package.contains.fegin.clients"}*/)手写的Feigclient 在 .assemble.fegin 中通过组件@FeignClient 引入,就是说你需要加上你可能要调用中心的API的包路径,好比你的找个配置文件在库存中心inventory,你可能要调用到基础数据中心data,那你得加上扫描路径(类似com.xxx.center.data.api)。

3、新建一个feign接口

参数说明:

name:指定FeignClient的名称(微服务的名称),name属性会作为微服务的名称,用于服务发现(如果使用Nacos实现服务注册发现,name与服务的名称一致,使用eureka也一样);

url: url一般用于调试,可以手动指定@FeignClient调用的地址;

path: 定义当前FeignClient所有方法的requestMapping的统一前缀,,类似与controller类上的requestMapping;

4、调用feign

假如应用中心stock调用库存中心inventory,实现类中注入inventory中心的Api接口,直接调用。

  1. 1 @Service
  2. 2 public class BandServiceImpl implements IBandService {
  3. 3
  4. 4 @Resource
  5. 5 private IBandQueryApi bandQueryApi;
  6. 6
  7. 7 ......
  8. 8
  9. 9 @Override
  10. 10 public RestResponse<BandRespDto> queryBandById(Long id) {
  11. 11   //调用库存中心
  12. 12 return bandQueryApi.queryBandById(id);
  13. 13 }
  14. 14 }

FeignClient原理简述

(1)当程序启动时,会进行包扫描,扫描所有包下有@FeignClient注解的类,并将这些类注入到Spring IOC容器中。

(2)当定义的Feign接口中的方法被调用时,Feign通过JDK的动态代理为每个接口方法创建一个RequestTemplate对象。这个RequestTemplate对象中包含请求的所有信息,如请求参数,请求URL等。

(3)然后RequestTemplate生成Request,将Request交给Client处理,这个Client默认是JDK的HTTPUrlConnection,也可以是OKhttp、Apache的HTTPClient等。

(4)最后Client被封装成LoadBaLanceClient类,这个类结合Ribbon负载均衡发起服务之间的调用。

参考/好文

Spring Cloud中的服务间通信(RestTemplate和Feign)

https://blog.csdn.net/zhaohongfei_358/article/details/83148623

Feign的工作原理

https://juejin.im/post/5ccbe82851882544da5008ce

SpringCloud --服务调用Feign的更多相关文章

  1. SpringCloud 源码系列(6)—— 声明式服务调用 Feign

    SpringCloud 源码系列(1)-- 注册中心 Eureka(上) SpringCloud 源码系列(2)-- 注册中心 Eureka(中) SpringCloud 源码系列(3)-- 注册中心 ...

  2. SpringCloud之声明式服务调用 Feign(三)

    一 Feign简介 Feign是一种声明式.模板化的HTTP客户端,也是netflix公司组件.使用feign可以在远程调用另外服务的API,如果调用本地API一样.我们知道,阿里巴巴的doubbo采 ...

  3. SpringCloud开发学习总结(七)—— 声明式服务调用Feign(一)

    在实践的过程中,我们会发现在微服务架构中实现客户端负载均衡的服务调用技术Spring Cloud Ribbon<SpringCloud开发学习总结(四)—— 客户端负载均衡Ribbon> ...

  4. springCloud中的服务调用feign

    springCloud中的服务调用(要在调用端写) 前提进行了服务注册 流程: 1.在服务模块中添加依赖 <!--服务调用--> <dependency> <groupI ...

  5. 四、springcloud之服务调用Feign(二)

    一.Fegin的常见应用 Feign的Encoder.Decoder和ErrorDecoder Feign将方法签名中方法参数对象序列化为请求参数放到HTTP请求中的过程,是由编码器(Encoder) ...

  6. 【Dalston】【第三章】声明式服务调用(Feign)

    当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率低下,并且显得好傻.那 ...

  7. 客户端负载均衡Feign之一:申明式服务调用Feign入门示例

    Spring Cloud提供了Ribbon和Feign作为客户端的负载均衡. 前面使用了Ribbon做客户端负载均衡,使用Hystrix做容错保护,这两者被作为基础工具类框架被广泛地应用在各个微服务的 ...

  8. SpringCloud服务调用源码解析汇总

    相信我,你会收藏这篇文章的,本篇文章涉及Ribbon.Hystrix.Feign三个组件的源码解析 Ribbon架构剖析 这篇文章介绍了Ribbon的基础架构,也就是下图涉及到的6大组件: Ribbo ...

  9. Spring Cloud 声明式服务调用 Feign

    一.简介 在上一篇中,我们介绍注册中心Eureka,但是没有服务注册和服务调用,服务注册和服务调用本来应该在上一章就应该给出例子的,但是我觉得还是和Feign一起讲比较好,因为在实际项目中,都是使用声 ...

随机推荐

  1. 常见的HTML元素及常见检查点

    1.<select>标签,可创建单选或多选菜单 检查点:下拉列表数据的正确性.数据被选中是否正确.是否变形.是否只读.多选/单选是否正确 2.<label>标签,相当于一个展示 ...

  2. deepFM(原理和pytorch理解)

    参考(推荐):https://blog.csdn.net/w55100/article/details/90295932 要点: 其中的计算优化值得注意 K代表隐向量维数 n可以代表离散值one-ho ...

  3. 精品软件-OfficeBox办公神器

    办公文档office处理套件,非常齐全,小巧! 官方地址:http://www.wofficebox.com/

  4. 查看java程序中对象占用空间大小

    需要引入的jar包: <dependency> <groupId>com.carrotsearch</groupId> <artifactId>java ...

  5. 自定义radio、checkbox的样式

    input标签中的radio和checkbox是很表单中常用的类型,大多时候,默认样式并不能满足我们的需求,所以有了此篇. 自定义样式,由此开启: html: <div class=" ...

  6. 11g RAC开启归档模式

    1.关闭集群数据库 [oracle@rac01-+ASM1 ~]$ srvctl stop database -d rac 2.开启节点一数据库到mount状态 SQL> startup mou ...

  7. CSRF学习

    前提环境:网站存在CSRF漏洞(也就是过于相信访问请求,只判断了用户是否存在cookie,并未判断请求的发起者) CSRF攻击原理,用户A需要转账,用户A正常向银行网站发送请求登录,登录成功后银行网站 ...

  8. angular8 大地老师学习笔记---第六课

    export class TodolistComponent implements OnInit { public keyword:string; public todolist:any[]=[]; ...

  9. 第四章 Sentinel--服务容错

    我们接着承接上篇继续讲下去 : 第三章 Nacos Discovery–服务治理,开始第四篇的学习 第四章 Sentinel–服务容错 4.1 高并发带来的问题 在微服务架构中,我们将业务拆分成一个个 ...

  10. yum提示错误: error: rpmdb: BDB0113 Thread/process 9866/140290246137664 failed:

    错误如下: 解决办法:重新构建rpm数据库