SpringCloud系列六:Feign接口转换调用服务(Feign 基本使用、Feign 相关配置)
1、概念:Feign 接口服务
2、具体内容
现在为止所进行的所有的 Rest 服务调用实际上都会出现一个非常尴尬的局面,例如:以如下代码为例:
Dept dept = this.restTemplate
.exchange(DEPT_GET_URL + id, HttpMethod.GET,
new HttpEntity<Object>(this.headers), Dept.class)
.getBody();
所有的数据的调用和转换都必须由用户自己来完成,而我们本身不擅长这些,我们习惯的编程模式是:通过接口来实现业务的操作,而不是通过具体的 Rest 数据。
2.1、Feign 基本使用
为了方便起见现在将“microcloud-consumer-80”模块复制为了“microcloud-consumer-feign”模块。
1、 【microcloud-consumer-feign】为了可以使用到 feign 支持,需要修改 pom.xml 配置文件,引入相关依赖包:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
feign 包含了 Ribbon 支持,所以导入了以上的依赖包之后就表示项目之中已经存在有了 ribbon 相关支持库。
2、 【microcloud-service】建立一个新的模块,这个模块专门负责客户端接口的定义;
3、 【microcloud-service】修改 pom.xml 配置文件,引用“microcloud-api”模块,这样就可以使用到 VO 类了;
<dependency>
<groupId>cn.study</groupId>
<artifactId>microcloud-api</artifactId>
</dependency>
4、 【microcloud-service】此时如果要通过 Feign 进行远程 Rest 调用,那么必须要考虑服务的认证问题。
· 此时可以删除原始的 RestConfig 进行的配置处理,然后添加feign的认证配置类
package cn.study.commons.config; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import feign.auth.BasicAuthRequestInterceptor;
@Configuration
public class FeignClientConfig {
@Bean
public BasicAuthRequestInterceptor getBasicAuthRequestInterceptor() {
return new BasicAuthRequestInterceptor("studyjava", "hello");
}
}
5、 【microcloud-service】建立一个 IDeptClientService 接口;
package cn.study.service; import java.util.List; import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import cn.study.commons.config.FeignClientConfig;
import cn.study.vo.Dept;
/**
* 通过注解@FeignClient添加接口对应的远程微服务名称value="MICROCLOUD-PROVIDER-DEPT"和
* 服务的认证configuration=FeignClientConfig.class
*
*/
@FeignClient(value="MICROCLOUD-PROVIDER-DEPT",configuration=FeignClientConfig.class)
public interface IDeptClientService {
@RequestMapping(method=RequestMethod.GET,value="/dept/get/{id}")
public Dept get(@PathVariable("id") long id) ;
@RequestMapping(method=RequestMethod.GET,value="/dept/list")
public List<Dept> list() ;
@RequestMapping(method=RequestMethod.POST,value="/dept/add")
public boolean add(Dept dept) ;
}
6、 【microcloud-consumer-feign】修改 pom.xml 配置文件,引入 microcloud-service 开发包:
<dependency>
<groupId>cn.study</groupId>
<artifactId>microcloud-service</artifactId>
</dependency>
7、 【microcloud-consumer-feign】修改 ConsumerDeptController 控制器程序类;
package cn.study.microcloud.controller; import javax.annotation.Resource; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import cn.study.service.IDeptClientService;
import cn.study.vo.Dept; @RestController
public class ConsumerDeptController {
@Resource
private IDeptClientService deptService ;
@RequestMapping(value = "/consumer/dept/get")
public Object getDept(long id) {
return this.deptService.get(id);
}
@RequestMapping(value = "/consumer/dept/list")
public Object listDept() {
return this.deptService.list();
}
@RequestMapping(value = "/consumer/dept/add")
public Object addDept(Dept dept) throws Exception {
return this.deptService.add(dept);
}
}
8、 【microcloud-consumer-feign】修改程序启动主类,追加操作处理。
package cn.study.microcloud; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages={"cn.study.service"})//进行接口IDeptClientService的扫描生成使得可以注入到ConsumerDeptController里面
public class Consumer_80_StartSpringCloudApplication {
public static void main(String[] args) {
SpringApplication.run(Consumer_80_StartSpringCloudApplication.class,
args);
}
}
9、 启动测试:http://client.com/consumer/dept/get?id=1
· 可以发现 Feign 在处理的时候自带有负载均衡的配置项
2.2、Feign 相关配置
1、 【microcloud-consumer-feign】Feign 之中最为核心的作用就是将 Rest 服务的信息转换为接口,但是在实际的使用之中也需要考虑到一些配置情况,例如:数据压缩,Rest 的核心本质在于:JSON 数据传输(XML、文本),于是就必须思考一种情况,如果用户发送的数据很大,这个时候可以考虑修改 application.yml 配置文件对传输数据进行压缩;
feign:
compression:
request:
mime-types: # 可以被压缩的类型
- text/xml
- application/xml
- application/json
min-request-size: 2048 # 超过2048的字节进行压缩
2、 如果有需要则可以在项目之中开启 feign 的相关日志信息(默认不开启):
· 【microcloud-consumer-feign】修改 application.yml 配置文件,追加日志追踪:
logging:
level:
cn.study.service: DEBUG
· 【microcloud-service】修改 FeignClientConfig,开启日志的输出:
package cn.study.commons.config; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import feign.Logger;
import feign.auth.BasicAuthRequestInterceptor;
@Configuration
public class FeignClientConfig {
@Bean
public Logger.Level getFeignLoggerLevel() {
return feign.Logger.Level.FULL ;
}
@Bean
public BasicAuthRequestInterceptor getBasicAuthRequestInterceptor() {
return new BasicAuthRequestInterceptor("studyjava", "hello");
}
}
再次运行程序现在可以观察到如下的流程:
· 当使用 Feign 要通过接口的方法访问 Rest 服务的时候会根据设置的服务类型发出请求,这个请求是发送给 Eureka(地址: “http://MICROCLOUD-PROVIDER-DEPT/dept/list”);
· 随后由于配置了授权处理,所以继续发送授权信息(“Authorization”);
· 在进行服务调用的时候 Feign 融合了 Ribbon 技术,所以也支持有负载均衡的处理;
总结:Feign = RestTempate + HttpHeader + Ribbon + Eureka 综合体 = 业务接口的自动实例化
SpringCloud系列六:Feign接口转换调用服务(Feign 基本使用、Feign 相关配置)的更多相关文章
- WCF系列教程之WCF客户端调用服务
1.创建WCF客户端应用程序需要执行下列步骤 (1).获取服务终结点的服务协定.绑定以及地址信息 (2).使用该信息创建WCF客户端 (3).调用操作 (4).关闭WCF客户端对象 二.操作实例 1. ...
- WCF系列教程之客户端异步调用服务
本文参考自http://www.cnblogs.com/wangweimutou/p/4409227.html,纯属读书笔记,加深记忆 一.简介 在前面的随笔中,详细的介绍了WCF客户端服务的调用方法 ...
- SpringCloud系列(一):Eureka 服务注册与服务发现
上一篇,我们介绍了服务注册中心,光有服务注册中心没有用,我们得发服务注册上去,得从它那边获取服务.下面我们注册一个服务到服务注册中心上去. 我们创建一个 hello-service 的 spring ...
- SpringCloud系列六:Eureka的自我保护模式、IP选择、健康检查
1. 回顾 前面讲了很多Eureka的用法,比如Eureka Server.Eureka Server的高可用.Eureka Server的用户认证(虽然未完全实现).元数据等, 这章将讲解剩下的自我 ...
- springcloud系列六 整合security
一 Eureka注册中心认证: Eureka自带了一个管理界面,如果不加密,所有人都可以进行访问这个地址,这样安全问题就来了,所以需要对其进行加密认证: 那么该如何进行整合呢: 1 在注册中心模块添加 ...
- [Unity2d系列教程] 004.Unity如何调用ios的方法(SDK集成相关)
和上一篇类似,我们同样希望Unity能够直接调用IOS底层的代码,那么我们就需要研究怎么去实现它.下面让我来带大家看一个简单的例子 1.创建.h和.m文件如下 .h // // myTest.m // ...
- 跟我学SpringCloud | 第三篇:服务的提供与Feign调用
跟我学SpringCloud | 第三篇:服务的提供与Feign调用 上一篇,我们介绍了注册中心的搭建,包括集群环境吓注册中心的搭建,这篇文章介绍一下如何使用注册中心,创建一个服务的提供者,使用一个简 ...
- 微服务架构 | 4.2 基于 Feign 与 OpenFeign 的服务接口调用
目录 前言 1. OpenFeign 基本知识 1.1 Feign 是什么 1.2 Feign 的出现解决了什么问题 1.3 Feign 与 OpenFeign 的区别与对比 2. 在服务消费者端开启 ...
- 白话SpringCloud | 第四章:服务消费者(RestTemple+Ribbon+Feign)
前言 上两章节,介绍了下关于注册中心-Eureka的使用及高可用的配置示例,本章节开始,来介绍下服务和服务之间如何进行服务调用的,同时会讲解下几种不同方式的服务调用. 一点知识 何为负载均衡 实现的方 ...
随机推荐
- Python练习四
1.任意输入一串文字加数字,统计出数字的个数,数字相连的视为一个,如:12fd2表示两个数字,即12为一个数字. content = input("请输入内容:") for i i ...
- [原] RTTI 为什么type_info 有比较操作
The lifetime of the object returned by typeid extends to the end of the program. 根据C++标准, typeid()返回 ...
- 关于定时器setTimeout()方法的实践--巧解bug
_使用开发环境:UAP:_ _框架:JQuery.MX:_ 最近的开发的页面中,有一处需要在提交的 datagrid里启用行编辑,就会发生奇怪的bug,编辑过程中如图所示不移开焦点直接点保存,那么已输 ...
- xc笔记
2019-03-20正式开始准备 --言语理解与表达------------------------------------------------------- 分为 1.逻辑填空 2.片段阅读 ...
- servlet_4
过滤器入门 过滤器的概念及执行基本流程 过滤器的使用场景 过滤器的实现及基本配置 过滤器链 过滤器链的配置 使用注解的方式无法保证过滤器链的执行顺序,所以只能使用web.xml的配置 按照出现在web ...
- 提取excel表数据成json格式的以及对图片重命名
开发那边的需求 1.功夫熊猫以及阿狸布塔故事集都是属于剧集的.意思就是有很多集,这里称他们为tv最下面这几行第一列没名字的都是单集的,这里称它们为mv需要统计所有工作表里面的数据把tv放一个大的jso ...
- python 基础之自动类型转换和强制类型转换
一:自动类型转换 自动类型转换注意针对Number数据类型来说的 当2个不同类型的数据进行运算的时候,默认向更高精度转换 数据类型精度从低到高:bool int float complex #关于bo ...
- C# .net mvc web api 返回 json 内容,过滤值为null的属性
在WebApiConfig.Register 中增加一段 #region 过滤值为null的属性 //json 序列化设置 GlobalConfiguration.Configuration.Form ...
- 【C++】类中this指针的理解
转自 苦涩的茶https://www.cnblogs.com/liushui-sky/p/5802981.html C++类中this指针的理解 先要理解class的意思.class应该理解为一种类型 ...
- Orchard-官方文档翻译1 Orchard的工作方式
开发一个CMS(内容管理系统)程序,与开发一个普通的应用程序很大情况下是不同的,CMS程序更像是一个应用程序的管理器系统.当我们在设计这个系统的时候,第一考虑的是它的扩展性,这是一个非常有挑战的开放式 ...