springcloud-feign组件实现声明式的调用
11.使用feign实现声明式的调用
使用RestTemplate+ribbon已经可以完成对服务端负载均衡的调用,为什么还要使用feign?
@RequestMapping("/hi")
public String hi(String name) {
String restTemplateForObject = restTemplate.getForObject("http://HI-SERVICE/test/test?name=" + name, String.class);
return restTemplateForObject;
}
上述代码采用url拼接参数的形式发送请求,如果要发送多个请求参数那么代码就会变得很低效并且难以维护。例如
http://localhost:8762/hi/hi?name=dd&password=123456&age=18
如果使用字符串拼接的方式,那么代码可以编排为:
@RequestMapping("/hi")
public String hi(String name, String password, Integer age) {
Map<Object, Object> map = new HashMap<>();
map.put("name", name);
map.put("password", password);
map.put("age", age);
String restTemplateForObject = restTemplate.getForObject("http://HI-SERVICE/test/test?name={name}&password={password}&age={age}", String.class, map);
return restTemplateForObject;
}
在这里url仅仅包含三个参数,如果url为10个参数那么代码会变的更加难以维护。
1.feign简介
Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注入。它具有可插拔的注解特性(可以使用springmvc的注解),可使用Feign 注解和JAX-RS注解。Feign支持可插拔的编码器和解码器。Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果并且springcloud为feign添加了springmvc注解的支持。
2.为消费者整合feign
1.引入feign的相关依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
2.入口类开启feign支持
@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients
public class HiApplication {
public static void main(String[] args) {
SpringApplication.run(HiApplication.class, args);
}
}
3.创建feign接口
@FeignClient(serviceId = "EUREKA-PROVIDER")
public interface feignTest {
@RequestMapping("/test/test1")
public String sayHi(String name);
}
注:feign会对serviceId与RequestMapping提供的地址进行拼接,远程调用方法。
建议:feign接口与服务者被调用的方法名最好保持一致,调用清晰明了。
4.控制器
@RequestMapping("/hi")
public String hi(String name) {
final String s = feignTest.sayHi(name);
System.out.println(s);
return s;
}
5.服务者控制器
@RestController
@RequestMapping("/test")
public class TestController {
@RequestMapping("/test1")
public String sayHi(String name){
return "xixixi 8763 :"+name;
}
}
测试结果:
单参数调用是没有任何问题的。在这里,你可以开启服务者集群,测试是否实现了负载均衡。经过我的测试时可以的,可以在client的配置文件中修改ribbon的实现类修改负载均衡为其他策略。
3.feign日志
很多的场景下,需要了解feign处理请求的具体细节,如何满足这种需求呢?
feign对日志的处理非常灵活可为每个feign客户端指定日志记录策略,每个客户端都会创建一个logger默认情况下logger的名称是feign的全限定名需要注意的是,feign日志的打印只会DEBUG级别做出响应。
我们可以为feign客户端配置各自的logger.lever对象,告诉feign记录那些日志logger.lever有以下的几种值
- NONE 不记录任何日志
- BASIC 仅仅记录请求方法,url,响应状态代码及执行时间
- HEAdERS 记录Basic级别的基础上,记录请求和响应的header
- FULL 记录请求和响应的header,body和元数据
1.java配置核心日志类
@Configuration
public class FeignLogConf {
@Bean
public Logger.Level feignConfiguration() {
return Logger.Level.FULL;
}
}
2.配置feign客户端的日志级别
logging.level.com.nyist.feign.FeignLogConf=debug
4.feign构造多参数请求
多参数情况下的feign调用会直接报错,比如两个String参数feign是无法识别的,必须要参数绑定,我想这就是可插拔注解:RequestParam是springmvc的。
1.错误方式
feign的注意事项
1.多参数传输的时候 必须要在feign接口上进行参数的绑定
public String testFeign(@RequestParam("name") String name, @RequestParam("password") String password, @RequestParam("age") Integer age);
2.以对象格式为参数进行数据传输时 必须设置feign的请求形式为post
3.在服务方接收对象参数时需在形参上加入@RequestBody的注解
public interface feignPost {
@RequestMapping(value = "/test/test1", method = RequestMethod.GET)
public User sayHi(User user);
}
错误日志信息
feign.FeignException: status 405 reading feignPost#sayHi(User); content:
{"timestamp":1546852876890,"status":405,"error":"Method Not Allowed","exception":"org.springframework.web.HttpRequestMethodNotSupportedException","message":"Request method 'POST' not supported","path":"/test/test1"}
由异常信息可知,尽管指定了get的方法,feign依然会使用post发送请求(对象传输时)。正确的方式如下:
2.get
@RequestMapping("/test/test",method = RequestMethod.GET)
public String sayHi(@RequestParam("name") String name,@RequestParam("password")String password);
3.post
feign配置
@FeignClient(serviceId = "HI-SERVICE")
public interface feignPost {
@RequestMapping(value = "/test/test1", method = RequestMethod.POST)
public User sayHi(User user);
}
但换个电脑测试时,GET请求是正常的。。。。
服务者
@RequestMapping("/test1")
public User test1(@RequestBody User user) {
return user;
}
2019-08-07补充内容:
springcloud-feign组件实现声明式的调用的更多相关文章
- Spring Cloud Feign 1(声明式服务调用Feign 简介)
Spring Cloud Feign基于Netflix Feign 同时整合了Spring Cloud Ribbon和Spring Cloud Hytrix,除了提供两者的强大功能外,它还提供了一种声 ...
- SpringCloud开发学习总结(七)—— 声明式服务调用Feign(一)
在实践的过程中,我们会发现在微服务架构中实现客户端负载均衡的服务调用技术Spring Cloud Ribbon<SpringCloud开发学习总结(四)—— 客户端负载均衡Ribbon> ...
- SpringCloud 源码系列(6)—— 声明式服务调用 Feign
SpringCloud 源码系列(1)-- 注册中心 Eureka(上) SpringCloud 源码系列(2)-- 注册中心 Eureka(中) SpringCloud 源码系列(3)-- 注册中心 ...
- SpringCloud实战-Feign声明式服务调用
在前面的文章中可以发现当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率 ...
- SpringCloud学习笔记(3):使用Feign实现声明式服务调用
简介 Feign是一个声明式的Web Service客户端,它简化了Web服务客户端的编写操作,相对于Ribbon+RestTemplate的方式,开发者只需通过简单的接口和注解来调用HTTP API ...
- SpringCloud系列-利用Feign实现声明式服务调用
上一篇文章<手把手带你利用Ribbon实现客户端的负载均衡>介绍了消费者通过Ribbon调用服务实现负载均衡的过程,里面所需要的参数需要在请求的URL中进行拼接,但是参数太多会导致拼接字符 ...
- SpringCloud(四):使用Feign实现声明式服务调用
一.Feign介绍Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单.使用Feign,只需要创建一个接口并注解.它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解 ...
- 【Dalston】【第三章】声明式服务调用(Feign)
当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率低下,并且显得好傻.那 ...
- ②SpringCloud 实战:引入Feign组件,完善服务间调用
这是SpringCloud实战系列中第二篇文章,了解前面第一篇文章更有助于更好理解本文内容: ①SpringCloud 实战:引入Eureka组件,完善服务治理 简介 Feign 是一个声明式的 RE ...
随机推荐
- MyBatis探究-----核心配置文件mybatis-config.xml中配置mappers的几种方式
1.package name="映射文件所在包名" 必须保证接口名(例如IUserDao)和xml名(IUserDao.xml)相同,还必须在同一个包中 例如:<packag ...
- CentOS7 安装 MySQL8.0
[1]安装步骤过程 (1)yum仓库下载MySQL 命令:yum localinstall https://repo.mysql.com//mysql80-community-release-el7- ...
- python format()用法
转自 https://www.cnblogs.com/gide/p/6955895.html python2.6开始,新增了一种格式化字符串的函数str.format(),此函数可以快速处理各种字符串 ...
- java中的函数
1.函数:定义在类中的具有特定功能的一段独立小程序.函数也称之为方法. 为了提高代码的复用性,对代码进行抽取. 将这个部分定义成一个独立的功能.方便使用. java中对功能的定义通过函数来实现的.2函 ...
- python中List append()、extend()和insert()的区别
Python中向列表增加更多数据时,有append().extend()和insert()等方法 其中最常用的是list.append(obj) 向列表的尾部添加一个新的元素. 需要一次性添加多个元素 ...
- spring mvc 配置之 context:annotation-config vs component-scan
<context:annotation-config/> spring的注解@Resource.@Autowire, @Required and @Qualifier 等注解只是一个提示, ...
- 遗传算法(Genetic Algorithm, GA)及MATLAB实现
遗传算法概述: • 遗传算法(Genetic Algorithm,GA)是一种进化算法,其基本原理是仿效生物界中的“物竞天择.适者生存”的演化法则,它最初由美国Michigan大学的J. Hollan ...
- zigbee 安全通信加密链接密钥
---恢复内容开始--- #define KEY_TYPE_TC_MASTER 0 // Trust Center Master Key信任中心主密钥#define KEY_TYPE_ ...
- java线程学习之Sleep方法
sleep方法是在线程中常用到的一个方法,它是一个静态方法. sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度 ...
- 获取某个元素第一次出现在数组(json数组)的索引
function firstIndex(arr, text) { // 若元素不存在在数组中返回-1 let firstVal = -1; for (let i = 0; i < arr.len ...