当前位置: 首页 > news >正文

Spring Cloud学习笔记-007

声明式服务调用:Spring Cloud Feign

  Feign基于Netflix Feign实现,整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两者的强大功能之外,它还提供了一种声明式的Web服务客户端定义方式。

  在使用Spring Cloud Ribbon时,通常都会利用它对RestTemplate的请求拦截来实现对依赖服务的接口调用,而RestTemplate已经实现了对HTTP请求的封装处理,形成了一套模板化的调用方法。在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口被多处调用,所以通常都会针对各个微服务自行封装一些客户端类来包装这些依赖服务的调用。Spring Cloud Feign在RestTemplate的基础上做了进一步的封装,由它来帮助我们定义和实现依赖服务接口的定义。在Spring Cloud Feign的实现下,我们只需创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定,简化了在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发量。

1. 启动注册中心和demo-member实例,创建demo-customer-feign工程,骨架选择quickstart。

2. 加入相关依赖:

3. 编写启动类:

4. 定义MemberService接口,通过@FeignClient注解指定服务名来绑定服务(注:这里的服务名不区分大小写),然后再使用Spring MVC的注解来绑定具体该服务提供的REST接口。

5. 创建MemberController来实现对Feign客户端的调用。使用@Autowired直接注入上面定义的MemberService实例,并在getMember方法中调用这个绑定了member-service服务接口的客户端来向该服务发起/member接口的调用。

6. 在src/main/resources目录下创建application.yml文件:

7. 启动服务进行验证:

参数绑定

  现实系统中的各种业务接口要复杂很多,HTTP的各个位置会传入各种不同类型的参数,并且在返回请求响应的时候也可能是一个复杂的对象结构。

1. 首先扩展一下服务提供方demo-member。增加下面这些接口定义,其中包含带有Request参数的请求、带有Header信息的请求、带有RequestBody的请求以及请求响应体重是一个对象的请求(注:User对象自定义,只有两个字段,String name和Integer age,此外,User中必须提供默认的构造方法,不然Spring Cloud Feign根据JSON字符串转换User对象时会抛出异常)。

2. 然后在demo-customer-feign应用中实现上述新增的请求的绑定:

  • 首先在demo-customer-feign中创建与上述一样的User类。
  • 然后,在MemberService接口中增加对上述三个新增接口的绑定声明:

  

3. 最后,在MemberController中新增一个/getMember2接口,来对新增的声明进行调用:

4. 启动项目,测试结果:

转载于:https://www.cnblogs.com/Oven5217/p/8830096.html

相关文章:

  • Reverse Integer
  • W650DC_DD_CFL_Win64(刷八代CPUBios)
  • Resource 的 IsSealed 问题
  • Machine Learning 第三周
  • React Native报错undefined is not an object(evaluating ‘_reactnative.propTypes’)解决办法...
  • Vue.js 子组件的异步加载及其生命周期控制
  • BZOJ 1283 序列 费用流 网络流 线性规划
  • kafka知识体系-kafka leader选举
  • 数据概述
  • winform控件大全
  • C#如何在VS2015 2017版本中编写WPF UI界面引入第三方SVG图形
  • 设计模式体会
  • 函数参数选项的处理getopt getopt_long getopt_long_only
  • eclipse 配置多个tomcat
  • io流2
  • C# 免费离线人脸识别 2.0 Demo
  • HTTP那些事
  • JavaScript 一些 DOM 的知识点
  • leetcode388. Longest Absolute File Path
  • npx命令介绍
  • vue-router 实现分析
  • 不上全站https的网站你们就等着被恶心死吧
  • 产品三维模型在线预览
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 理解在java “”i=i++;”所发生的事情
  • 前端存储 - localStorage
  • 前端技术周刊 2019-02-11 Serverless
  • 区块链共识机制优缺点对比都是什么
  • 使用 @font-face
  • 使用agvtool更改app version/build
  • 网络应用优化——时延与带宽
  • 学习笔记:对象,原型和继承(1)
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 自定义函数
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • #pragma once
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (安卓)跳转应用市场APP详情页的方式
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (已解决)什么是vue导航守卫
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET 事件模型教程(二)
  • .NET多线程执行函数
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • @Autowired和@Resource的区别
  • @Transient注解
  • [ NOI 2001 ] 食物链
  • [].slice.call()将类数组转化为真正的数组
  • [ACTF2020 新生赛]Include