博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
springcloud-feign组件实现声明式的调用
阅读量:5364 次
发布时间:2019-06-15

本文共 4093 字,大约阅读时间需要 13 分钟。

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
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的相关依赖
org.springframework.cloud
spring-cloud-starter-feign
2.入口类开启feign支持
@EnableDiscoveryClient@SpringBootApplication@EnableFeignClientspublic 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配置核心日志类
@Configurationpublic 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的请求形式为post3.在服务方接收对象参数时需在形参上加入@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;    }

转载于:https://www.cnblogs.com/mzc1997/p/10252416.html

你可能感兴趣的文章
html5 相同形状的图形进行循环
查看>>
springboot中文官方文档
查看>>
ThreadLocal实现线程范围内共享
查看>>
多校HDU5723 最小生成树+dfs回溯
查看>>
ASP.NET MVC分页实现之改进版-增加同一个视图可设置多个分页
查看>>
关于ASP.NET MVC开发设计中出现的问题与解决方案汇总 【持续更新】
查看>>
关于Entity Framework中的Attached报错的完美解决方案终极版
查看>>
Selenium之Web页面滚动条滚操作
查看>>
组合数据类型练习,英文词频统计实例上
查看>>
Uber回馈开源的一些软件
查看>>
day 3 修改haproxy.cfg 作业
查看>>
UIScrollView —— 缩放实现案例(二)
查看>>
【Qt】Qt Linguist介绍【转】
查看>>
sim usim Uim 区别
查看>>
网页中插入透明Flash的方法和技巧
查看>>
动态内存申请函数选择(realloc、malloc 、alloca、 calloc)
查看>>
获取元素属性get_attribute
查看>>
视觉设计师的进化
查看>>
Python/jquery
查看>>
【BZOJ】【2132】圈地计划
查看>>