浙江城乡建设网站,建站公司哪个好,自己编程做网站,加个自己的网站文章目录前言1、 RestTemplate1.1、通用方法 exchange1.2、RestTemplate 和 OpenFeign 的区别2、RPC 和 HTTP2.1、RPC 是什么2.2、RPC 调用过程示意图2.3、HTTP 是什么2.4、HTTP 调用过程示意图2.5、对比3 、OpenFeign3.1 、OpenFeign 常用注解3.2 、案例前言
Feign 停更了OpenFeign 是在 Feign 基础上开发出来的。
官网地址https://spring.io/projects/spring-cloud-openfeign
1、 RestTemplate RestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具他提供了常见的 REST 请求方案的模板例如GET请求、POST请求、PUT请求、DELETE请求以及一些通用的请求执行方法 exchange 以及execute。 RestTemplate继承自 InterceptingHttpAccessor 并且实现了 RespOperations 接口其中 RestOperations 接口定义了基本的 RESTFUL 操作这些操作在 RestTemplate 中都得到了实现。
1.1、通用方法 exchange
ResponseEntityList exchange restTemplate.exchange(url, HttpMethod.GET, entity, List.class);1.2、RestTemplate 和 OpenFeign 的区别
请求方式不一样
RestTemplate 需要每个请求都拼接 url 参数 类文件灵活性高但是消息封装臃肿。
OpenFeign 可以伪装成类似 SpringMVC 的 controller 一样将 rest 的请求进行隐藏不用再自己拼接 url 和参数可以便捷优雅地调用HTTP API。
底层实现方式不一样 RestTemplate 在拼接url的时候可以直接指定ip地址端口号不需要经过服务注册中心就可以直接请求接口也可以指定服务名请求先到服务注册中心如nacos获取对应服务的ip地址端口号然后经过HTTP转发请求到对应的服务接口注意这时候的restTemplate需要添加LoadBalanced注解进行负载均衡。 Feign 的底层实现是动态代理如果对某个接口进行了FeignClient注解的声明Feign就会针对这个接口创建一个动态代理的对象在调用这个接口的时候其实就是调用这个接口的代理对象代理对象根据FeignClient注解中name的值在服务注册中心找到对应的服务然后再根据RequestMapping等其他注解的映射路径构造出请求的地址针对这个地址再从本地实现HTTP的远程调用。
2、RPC 和 HTTP
2.1、RPC 是什么 RPC框架肯定是高于简单的HTTP接口的。但毋庸置疑HTTP接口由于受限于HTTP协议需要带HTTP请求头 导致传输起来效率或者说安全性不如RPC。RPC 本身是一种框架而http 是应用层的协议
2.2、RPC 调用过程示意图 2.3、HTTP 是什么 http其实是一种网络传输协议基于TCP规定了数据传输的格式现在客户端浏览器与服务端通信基本都是采用Http协议也可以用来进行远程服务调用。
2.4、HTTP 调用过程示意图 2.5、对比
相同点
底层通讯都是基于socket都可以实现远程调用都可以实现服务间调用。
不同点
RPC是跨操作系统在同一编程语言内使用Http是跨操作系统跨编程语言的远程调用框架。当使用RPC框时限为服务调用的时候要求服务提供方和服务消费方都必须使用统一的RPC框架要么都是dubbo要么都是cxf当使用http进行服务间调用的时候无需关注服务提供方使用的编程语言也无需关注服务消费方使用的编程语言服务提供方只需要提供restful风格的接口服务消费方按照restful的原则请求服务即可。RPC调用快、处理快Http通用性强。RPC需要满足像调用本地服务一样调用远程服务也就是对调用过程在API层面进行封装Http协议没有这样的要求因此请求、响应等细节需要我们自己去实现。
3 、OpenFeign OpenFeign 全称 Spring Cloud OpenFeign它是 Spring 官方推出的一种声明式服务调用与负载均衡组件它的出现就是为了替代进入停更维护状态的 Feign。 OpenFeign 是 Spring Cloud 对 Feign 的二次封装它具有 Feign 的所有功能并在 Feign 的基础上增加了对 Spring MVC 注解的支持例如 RequestMapping、GetMapping 和 PostMapping 等。
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId
/dependency3.1 、OpenFeign 常用注解
注解说明FeignClient该注解用于通知 OpenFeign 组件对 RequestMapping 注解下的接口进行解析并通过动态代理的方式产生实现类实现负载均衡和服务调用。EnableFeignClients该注解用于开启 OpenFeign 功能当 Spring Cloud 应用启动时OpenFeign 会扫描标有 FeignClient 注解的接口生成代理并注册到 Spring 容器中。RequestMappingSpring MVC 注解在 Spring MVC 中使用该注解映射请求通过它来指定控制器Controller可以处理哪些 URL 请求相当于 Servlet 中 web.xml 的配置。GetMappingSpring MVC 注解用来映射 GET 请求它是一个组合注解相当于 RequestMapping(method RequestMethod.GET) 。PostMapping该Spring MVC 注解用来映射 POST 请求它是一个组合注解相当于 RequestMapping(method RequestMethod.POST) 。
3.2 、案例
启动类
package com.example.canal;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;EnableFeignClients(basePackages com.example.canal.feign)
SpringBootApplication
MapperScan(basePackages com.example.canal.mybatis.mapper)public class CanalApplication {public static void main(String[] args) {SpringApplication.run(CanalApplication.class,args);}
}CouponFeignService
package com.example.canal.feign;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;FeignClient(demo)
public interface CouponFeignService {RequestMapping(/demo/queryOrder)public String queryOrder();
}使用
Override
public Map queryUser(int userId) {// 远程服务调用String queryOrder couponFeignService.queryOrder();User user userMapper.queryUser(userId);MapString,Object map new HashMap();map.put(user,user);map.put(order,queryOrder);return map;
}