在微服务架构体系中远程RPC调用主要包括Dubbo与Http调用两个大类,由于Dubbo拥有服务注册中心,并且起服务的命名非常规范,使用包名.类名.方法名进行描述。,而http调用通常都是使用httpclient等相关类库,这些在使用上并没有问题,但API都是分散在整个工程的各个地方,如果HTTP调用也可以使用类似Dubbo服务的表示方法,采用声明式定义就好了。,在开源的世界中只有想不到,没有找不到,为了解决Feign的声明式服务化管理,Feign框架应运而生,本文主要介绍如何使用Feign实现Http服务声明化管理与调用。,Feign是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求。Feign通过注解,将请求模板化,当实际调用的时候,传入参数,根据参数再应用到请求上,进而转化成真正的请求,封装了http调用流程。,首先要引入Feign的maven依赖,如下图所示:,服务调用的API声明代码如下所示:,这里的要点是使用@FeignClient进行声明。声明后就可以通过HelloControllerApi进行远程HTTP调用,示例代码如下:,当然需要在调用方的启动类上增加@EnableFeignClients(defaultConfiguration = FeignConfiguration.class)注解。,服务端与Feign并无关系,主要按照API的方式实现即可,服务端实现代码如下所示:,上述只是简单实用Feign,接下来以实现签名校验为例展示Feign的扩展机制。,签名验证是最常见的安全机制,首先在客户端定义一个签名拦截器,用于生成签名信息,示范代码如下图所示:,并且在Feign的全局配置文件中创建对应的拦截器,示例代码如下:,同时在服务端获取token并对token进行校验,示例代码如下:,上面的示例虽然实现了服务接口的声明式管理,但调用端、客户端并没有显示的约束关系,接下来展示如何使用客户端、服务端使用继承方式定义服务调用API。,例如要实现如下图的效果:,原生的Feign无法实现该效果,我们需要使用OpenFeign类库,两者之间的对比如下图所示:,接下来详细介绍具体实现方法。,首先使用一个模块定义公共API,需要引入maven依赖,代码示例如下所示:,接下来定义公共的服务接口,客户端、服务端都需要实现该接口,公共服务端接口定义如下:,首先需要添加相应的maven依赖,代码如下:,服务端采用继承方式实现,具体代码如下所示:,客户端首先同样需要增加相应的依赖,具体代码如下所示:,客户端服务调用类需要继承公共API:,同时客户端启动类需要增加@EnableFeignClients注解,具体示例代码如下所示:,同样基于Springboot编程方式,可以为Feign配置全局参数,具体如下:,接下来客户端就可以用如下方式进行调用:,时,当前项目编译的jar包,类也已经被替换成我们自定义的类,目标达成。,作者介绍:李大伟,现任中通快递中间件高级架构师,对消息中间件、Flink有着非常丰富的实践经验。
© 版权声明
文章版权归作者所有,未经允许请勿转载。