网站首页 > 教程分享 正文
原创不易,请多多支持!对Java技术感兴趣的童鞋请关注我,后续技术分享更精彩。
概述
微服务在如今后台系统建设上大行其道,各子服务间接口交互方式,http请求协议又是首选。而相比远程方法调用的rmi接口形式,http服务对接口消费方会产生更大的接入成本。有没有两全其美,合二为一的方案?服务交互既满足通用的http协议,又能减少服务消费方的接入成本。
答案揭晓,netflix公司开源的feign框架即为该问题的完美解决方案。本文将带领大家,通过使用feign框架,在springboot项目中,实现和远程方法调用一样的本地方法调用效果。
环境
- spring-boot 2.1.0.RELEASE
- spring-cloud Greenwich.SR2
feign框架是基于springcloud发布的,所以项目中请添加和springboot匹配的springcloud包。注意spring-boot 最好不低于2.1.0.RELEASE版本,因为低版本依赖的feign某些功能缺失,将损失服务client jar包发布时接口构建灵活性。
依赖
项目中添加相关依赖
项目结构
risk-control-app:服务提供方项目模块。
risk-control-app-client:服务提供方对外开放的client接口模块。
risk-control-app-consume:服务消费方模块。
接口服务定义
由于服务接口是对外开放的,并以client jar文件方式集成到使用端。
在risk-control-app-client模块中定义,UserResource和ProdResource两个服务。
在ProdResource接口定义服务接口。
@FeignClient是feign框架提供的注解。通过该注解定义的接口,在服务调用时框架会自动转换为http请求,调用远程对应服务。
name属性:为feign客户端唯一标示,若微服务接入了注册中心,name对应服务注册名。
contextId属性:服务上下文标示,有时对外开放服务可能是多个接口,不同接口可以通过该属性加以区分。比如ProdResource和UserResource不同的资源。
注意feign老版本是没有contextId属性的,这意味着老版本的feign框架,服务提供方对外的接口输出文件只能有一个,因为FeignClient注解对应的name不能重复,没有contextId区分,FeignClient实例将无法初始化。
url属性:定义FeignClient访问的接口服务地址。主要用于微服务未接入注册中心的场景。若以接入注册中心,该属性可以不定义。
细心的朋友可能发现了,demo中name和url的赋值,使用了spring属性注入的方式,而不是直接写死。这样有一个好处,不同环境的FeignClient引用时,只需集成端配置文件修改相关值,无需服务提供方重新编译打包,提高配置的灵活性。
UserResource方式和ProdResource类似,不再累述。
接口服务实现
接口服务实现在risk-control-app模块中。引入risk-control-app-client依赖。并添加ProdController和UserController实现。结构如下:
接口实现如下:
接口服务消费方
risk-control-app-consume模块作为服务消费方,在项目中添加risk-control-app-client依赖,即可像调用本地方法样调用远程http服务。
application.yml配置文件中添加远程服务设置。在服务启动时能动态注入@FeignClient实例的name和url值。
入口Application类中添加EnableFeignClients注解,启用Feign。basePackages值为Feign client扫描的包路径。
业务实现类中直接添加服务资源组件属性,在方法逻辑中即可像直接调用本地方法一样,调用远程的http服务。
到此所有demo完成,是不是感觉so easy,http服务调用瞬间简单了起来。
总结
本文介绍了Feigin框架在springboot项目中的使用。通过实例讲解了,如何将http对外服务以rmi方式提供给消费端使用。定义主要步骤如下:
- 接口分模块构建,便于对外提供client jar文件分发。接口通过@FeignClient注解标注。
- 基于接口实现服务端逻辑。
- 消费端通过接口的client jar依赖,使用具体接口服务方法。
猜你喜欢
- 2024-10-20 java 实现利用 RabbitMQ 发送和消费消息
- 2024-10-20 手把手讲解-OkHttp硬核知识点(2)(okhttp原理详解)
- 2024-10-20 XXL-JOB核心源码解读及时间轮原理剖析
- 2024-10-20 高并发场景下的 HttpClient 优化方案,QPS 大大提升!
- 2024-10-20 原来java结合docker这么简单!快来看看命令大全以及java结合使用
- 2024-10-20 Flink 实时计算 - 用户如何使用自定义 Jar 包
- 2024-10-20 分库分表实现方式Client和Proxy,性能和维护性该怎么选?
- 2024-10-20 K8S官方java客户端之三:外部应用(k8s官方java客户端之三:外部应用手册)
- 2024-10-20 在用httpclient发送post报文请求错误解决
- 2024-10-20 基于zabbix4.0监控tomcat服务及JVM内存
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- css导航条 (66)
- sqlinsert (63)
- js提交表单 (60)
- param (62)
- parentelement (65)
- jquery分享 (62)
- check约束 (64)
- curl_init (68)
- sql if语句 (69)
- import (66)
- chmod文件夹 (71)
- clearinterval (71)
- pythonrange (62)
- 数组长度 (61)
- javafx (59)
- 全局消息钩子 (64)
- sort排序 (62)
- jdbc (69)
- php网页源码 (59)
- assert h (69)
- httpclientjar (60)
- postgresql conf (59)
- winform开发 (59)
- mysql数字类型 (71)
- drawimage (61)
本文暂时没有评论,来添加一个吧(●'◡'●)