feign调用https接口_SpringCloudFeign远程调用
String user = this.restTemplate.getForObject("http://service-provider/user/" + id, String.class);
如果就学到这里,你可能以后需要编写类似的大量调用代码,格式基本相同,无非参数不一样。有没有更优雅的方式,来对这些代码再次优化呢?这就是我们接下来要讲的Feign的功能了。
一、简介——什么是Feign
Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller调用service一样,你不用再使用传统的restTemplate构造请求、解析返回数据等等操作,一切都交给Feign去做。(用过Dubbo的同学可以将其形成一个联系与对比。)
项目主页:https://github.com/OpenFeign/feign简单画了一个调用图
二、实操——代码演示
1.导入openfeign依赖
<dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-starter-openfeignartifactId> dependency>
2.启动类开启feign功能
@SpringBootApplication@EnableFeignClients //开启feign客户端public class ConApp { public static void main(String[] args) { SpringApplication.run(ConApp.class,args); }}
3.编写feign客户端UserClient接口
@FeignClient(value = "service-provider")public interface UserClient { @GetMapping("user/{id}") User selectById(@PathVariable("id") int id);}
首先这是一个接口,Feign会通过动态代理,帮我们生成实现类。这点跟mybatis的mapper很像
@FeignClient,声明这是一个Feign客户端,类似@Mapper注解。同时通过value属性指定服务名称
接口中的定义方法,完全采用SpringMVC的注解,Feign会根据注解帮我们生成URL,并访问获取结果
service-provider的调用接口
4.使用UserClient调用
@RestController@RequestMapping("/consumer")public class ConsuController { @Autowired public UserClient userClient; @GetMapping("/{id}") public User selectById(@PathVariable("id") int id){ User user = userClient.selectById(id); return user; }}
5.启动测试
访问成功!6.对Ribbon和hystrix的支持
Feign中本身已经集成了Ribbon依赖和自动配置;也有对Hystrix的集成,只不过熔断功能默认情况下是关闭的。我们需要通过下面的参数来开启:(在service-consumer工程添加配置内容)
feign: hystrix: enabled: true # 开启Feign的熔断功能
我们要定义一个类UserClientFallback,实现刚才编写的UserClient,作为fallback的处理类。
@Componentpublic class UserClientFallback implements UserClient{ public User selectById(int id) { User user = new User(); user.setName("服务器繁忙,请稍后再试!"); return user; }}
然后在UserClient中,指定刚才编写的实现类
@FeignClient(value = "service-provider",fallback = UserClientFallback.class)public interface UserClient { @GetMapping("user/{id}") User selectById(@PathVariable("id") int id);}
重启测试
三、请求压缩与日志级别
1.请求压缩Spring Cloud Feign 支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。通过下面的参数即可开启请求与响应的压缩功能:
feign: compression: request: enabled: true # 开启请求压缩 response: enabled: true # 开启响应压缩
同时,我们也可以对请求的数据类型,以及触发压缩的大小下限进行设置:
feign: compression: request: enabled: true # 开启请求压缩 mime-types: text/html,application/xml,application/json # 设置压缩的数据类型 min-request-size: 2048 # 设置触发压缩的大小下限
注:上面的数据类型、压缩大小下限均为默认值。
2.日志级别
通过logging.level.xx=debug来设置日志级别。然而这个对Fegin客户端而言不会产生效果。因为@FeignClient注解修改的客户端在被代理时,都会创建一个新的Fegin.Logger实例。我们需要额外指定这个日志的级别才可以。设置com.diku.consumer下都为debug
logging: level: com.diku.consumer: debug
编写配置类
@Configurationpublic class FeignLogConfiguration { @Bean Logger.Level feignLoggerLevel(){ return Logger.Level.FULL; }}
NONE:不记录任何日志信息,这是默认值。
BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。
在UserClient中指定配置类:
@FeignClient(value = "service-provider",fallback = UserClientFallback.class, configuration = FeignLogConfiguration.class)public interface UserClient { @GetMapping("user/{id}") User selectById(@PathVariable("id") int id);}
重启项目,即可看到每次访问的日志:
北漂Java 程序员一枚,喜欢就点个关注吧。
往期精选
SpringCloud配置中心的使用
SpringCloud-Eureka高可用搭建
SpringCloud-Ribbon负载均衡
SpringCloud-Hystrix解决雪崩
Nacos入门案例
Mybatis动态SQL
feign调用https接口_SpringCloudFeign远程调用相关推荐
- Xamarin使XRPC实现接口/委托远程调用
在之前的文章中已经介绍如何使用Beetlex.XRCP组件进行接口/委托远程调用:由于组件BeetleX.XRPC.Clients支持.NETStandard2,因此Xamarin同样可以使用它来实现 ...
- android app通过Geth RPC接口实现远程调用
记录一下APP怎么通过以太坊的RPC接口实现远程调用.此过程的环境为Window7和Android studio2.2.3.以web3_clientVersion为例.更多用法参考Geth JSON- ...
- Spring Boot项目中使用RestTemplate调用https接口出现 unable to find valid certification path to requested target
问题描述:Spring Boot项目中使用RestTemplate调用https接口出现以下错误: PKIX path building failed: sun.security.provider.c ...
- python调用webservice接口实例_python调用各种接口,webservice,c接口,com接口,socket协议方法...
python调用webservice接口(SOAP) (2)调用示例: 需要先安装suds库:pip install suds from suds.client import Client #如果需要 ...
- 在php中调用java接口吗,php 调用 java 接口
php 需要开启 curl模块 /* * HTTP 请求函数封装 */ function http_request_cloudzone($url, $data){ //var_dump($url.&q ...
- spring 调用python_Spring http服务远程调用实现过程解析
最近公司有个新的需求,写了一个接口,想要把服务暴露出去,但是这个服务所在的进程是非web项目,(可以理解成schedule/batch等进程项目),所以没有tomcat等容器,而且只有这一个服务,无论 ...
- c语言调用c 接口方法,C++调用C接口的实现示例
C++调用C代码 一个C语言文件p.c #include void print(int a,int b) { printf("这里调用的是C语言的函数:%d,%d\n",a,b); ...
- java调用php接口_java 如何调用接口
在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适,所以,问题来了,java如何调用接口?很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接 ...
- Java调用Https接口:fatal, handshake_failure问题记录
一. 问题描述 HttpClient调用接口,报错:handling exception: javax.net.ssl.SSLHandshakeException: Received fatal al ...
- rpa调用https接口 返回数据异常_金融企业“银行余额RPA查询机器人”解读
一.财务机器人应用背景 公司简介 金融行业银行卡联合组织--是只通过银联跨行交易清算系统,实现商业银行系统间的互联互通和资源共享,保证银行卡跨行.跨地区和跨境的使用的组织. 总部设于上海,作为中国的银 ...
最新文章
- 某程序员对比美团和阿里的卷文化区别:美团重过程,死抠没用细节;阿里更自由,注重结果!...
- 【Java】eclipse如何导入项目
- 掌握 analyze API,一举搞定 Elasticsearch 分词难题
- win10 ndk hello_world
- Spring MVC 的常用注解
- 普通电阻触摸屏多点触摸低成本解决方 转载
- 程序员到底要不要重复造轮子?
- 带线程池的socket客户端与服务端
- 31天重构学习笔记17. 提取父类
- 【泛型高级-通配符】
- Qt5学习笔记之串口助手四:增加16进制/ASCII切换、周期发送
- 解决 fatal: unable to access xxx: Encountered end of
- Java 内存模型(JMM)
- 优秀的长截图标注工具:iShot for Mac中文免费
- Alta发布高速MIL-STD-1553 ARINC429模块-USB3.0
- 写一本技术书能赚多少钱
- 蓝牙渗透测试过程:部分工具使用方法
- 服务器bios界面usb无线网卡,BIOS怎么开启无线网卡
- openstack中 Server Error for url: http://controller:9696/v2.0/agents, Internal Server Error
- 用python画多啦a梦源码_python 画多啦A梦