SpringCloud之声明式服务调用 Feign(三)
一 Feign简介
Feign是一种声明式、模板化的HTTP客户端,也是netflix公司组件。使用feign可以在远程调用另外服务的API,如果调用本地API一样。
我们知道,阿里巴巴的doubbo采用二进制的RPC协议进行底层通讯,客户端可以使用类似本地方法一样调用。那么,虽然Feign同样可以有这种效果,但是底层还是通过HTTP协议调取restful的API的方式。
通过Feign, 我们能把HTTP远程调用对开发者完全透明,得到与调用本地方法一致的编码体验。
在实际开发中,对于服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以我们通常会针对各个微服务自行封装一些客户端类来包装这些依赖服务的调用,Spring Cloud Feign 在此基础上做了进一步的封装,由他来帮助我们定义和实现依赖服务接口的定义,我们只需要创建一个接口并用注解的方式来配置他,即可完成对服务提供方的接口绑定,简化了在使用 Spring Cloud Ribbon 时自行封装服务调用客户端的开发量。
搭建声明式服务Feign(feign-client)
接到上篇“SpringCloud之实现客户端的负载均衡Ribbon(二)”
继续在springcloud工程中添加模块feign-client,也是通过start.spring.io提供的模板创建
新的目录
生成的pom.xml文件为
<?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"><modelVersion>4.0.0</modelVersion><groupId>com.xuan</groupId><artifactId>feign-client</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>feign-client</name><description>Demo project for Spring Boot</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.3.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Finchley.RELEASE</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
修改启动文件FeignClientApplication.java,增加相关注解。
package com.xuan.feignclient;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class FeignClientApplication {public static void main(String[] args) {SpringApplication.run(FeignClientApplication.class, args);} }
增加 @FeignClient 注解的接口来绑定具体的服务,增加服务HelloService.java
package com.xuan.feign;import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping;@FeignClient(value = "eureka-client") public interface HelloService {@RequestMapping(value = "/hello")String hello(); }
@FeignClient可以使用name和url来绑定。 以前使用@FeignClient
注解的时候使用url
参数的使用就不需要使用name
属性了,现在不然,需要在url
属性的基础上也要使用name
属性,此时的name属性只是一个标识。
比较有用的四个注解 name
, url
, fallback
, path
- name 指定微服务的实例名称,唯一,必填,通过实例名称可以得到实例对应的访问地址
- fallback 配置熔断
- url 配置一个绝对的地址访问,默认为空字符串,当其不空时,则使用该地址访问
- path 配置一个所有方法级别的mappings 相当于在类上加 requestMapping, 例如上面的
UserServiceAPI
所有访问地址为 /user/xxx
增加测试的消费接口ConsumerController.java
package com.xuan.feign;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController;@RestController public class ConsumerController {@AutowiredHelloService helloService;@RequestMapping(value = "feign-consumer", method = RequestMethod.GET)public String helloConsumer(){return helloService.hello();} }
修改配置文件”application.properties“,找到注册中心和定义自身的服务名和端口,
spring.application.name=feign-consumer server.port=9991 eureka.client.service-url.defaultZone=http://localhost:8080/eureka/
添加完成后工程的目录结构为
分别启动模块了:
1.EurekaServerApplication
2.EurekaClientApplication,EurekaClientApplication1,EurekaClientApplication2
3.FeignClientApplication
启动后打开http://localhost:8080/显示如图:
访问Feign模块提供的接口http://localhost:9991/feign-consumer,刷新一次也会访问到不同的提供者上面去,原因是feign内部也使用了ribbon做负载均衡。
源码地址:https://gitee.com/xuantest/SpringCloud-Feign
转载于:https://www.cnblogs.com/grasp/p/9305218.html
SpringCloud之声明式服务调用 Feign(三)相关推荐
- Spring Cloud Feign 1(声明式服务调用Feign 简介)
Spring Cloud Feign基于Netflix Feign 同时整合了Spring Cloud Ribbon和Spring Cloud Hytrix,除了提供两者的强大功能外,它还提供了一种声 ...
- 声明式服务调用feign原理图解
https://www.cnblogs.com/crazymakercircle/p/11965726.html
- SpringCloud Feign声明式服务调用
SpringCloud Feign声明式服务调用 1. 加入pom依赖 2. Application.java上声明@EnableFeignClients 3. @FeignClient声明接口调用服 ...
- SpringCloud实战5-Feign声明式服务调用
SpringCloud实战5-Feign声明式服务调用 在前面的文章中可以发现当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还 ...
- 两个子集pom互相调用_声明式服务调用组件Feign
什么是Feign? Feign是SpringCloud组件中的一个轻量级RESTful的HTTP服务客户端.Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务. 什么是 ...
- 04.声明式服务调用:Spring Cloud Feign(Greenwich.SR2)
1.Feign是什么 Feign是整合了Ribbon与Hystrix外,还提供了声明式的Web服务客户端定义方式.采用了声明式API接口的风格,将Java Http客户端绑定到它的内部.Feign的首 ...
- feign和ajax,SpringCloud-feign 声明式服务调用
以前学习java,一般就一个后端,都要学习如何在容器中运行,如tomcat,weblogic,现在微服务颠覆了这一切,一个系统要被拆分成多个服务,服务与服务间需要通信,让我想到了前端的ajax,jav ...
- 05_SpringCloud整合声明式HTTP客户端-Feign
SpringCloud整合声明式HTTP客户端-Feign 文章目录 一.Feign介绍 1. 什么是Feign? 2. Feign组件: 二.基于Feign实现微服务远程调用 2.1. 引入feig ...
- Spring Cloud微服务之Feign——声明式服务间调用
目录 写在前面 服务间调用常见的方案 方案一:HttpClient 方案二:RestTemplate 方案三:Feign 框架版本问题及可能遇到的坑 搭建服务注册中心 搭建服务1--service-a ...
最新文章
- 古朴西安:乘汽船去机场
- Opengl-基本概念-纹理(单纯的颜色太单调弄张图显示不是更好)
- 成功解决SyntaxError: encoding problem: utf8 with BOM
- linux查询关键词上下行_Linux:从文件中搜索关键字并显示行数(cat,grep函数)
- 硬件工程师面试经历2015---笔试篇
- 像素/厘米与像素/英寸区别_像素/体素艺术入门指南
- 漫反射 高光反射_如何有效地使用反射
- Qt开发技巧:编写.pro文件,在构建流程中加入命令行的方法
- 动态规划LeetCode70爬楼梯
- Django之form组件is_valid校验机制
- excel粘贴为图片不完整_excel转PDF不完整?办公大神的压箱绝技来了!
- 数据库SQL语言学习--上机练习3(插入 更新 删除)
- 计算机网络超详细笔记(六):传输层
- java网上订餐系统开题报告_网上订餐系统的设计与实现
- 内外网同时上怎么设置
- PHP 快递地图模式,使用D3.js创建物流地图的步奏详解
- EASE:一种融合实体信息的句子嵌入对比学习方法
- GitHub上最火的两份Java面试小册,Star已经超百万
- 西澳大学诚招计算机视觉/机器学习方向博士研究生
- baxter仿真操作简单命令
热门文章
- Linux下的Vsftpd配置篇
- oct玻璃体后脱离图像
- Unchecked call to ‘mapoPair(PairFunction<T,K2,V2>)‘ as a member of raw type
- genymotion无法安装apk的问题
- python2.x和python3.x-matplotlib中文显示为方块-中文不显示-故障原理研究与解决
- 09_Fibonacci
- 大话数据结构 : 二叉排序树
- 数据结构:静态查找动态查找
- java登录中用户类型分类_基于用户登陆的struts2中action的分类详解
- 合作式智能运输系统 车用通信系统应用层及应用数据交互标准(第二阶段)_携手推进汽车与信息通信标准化融合发展,CSAE与CCSA签署标准化工作备忘录...