当前位置:网站首页>微服务实战|声明式服务调用OpenFeign实践
微服务实战|声明式服务调用OpenFeign实践
2022-07-02 06:33:00 【_时光煮雨】
OpenFeign介绍
一开始,我们使用原生的 DiscoveryClient 发现服务和使用RestTemplate进行服务间调用,然后我们自己手动开发了一个负载均衡组件,最后介绍了负载均衡组件Ribbon。每个章节调用服务的方式也有所不同,共同点则是都是基于RestTemplate 来实现的,想必大家都会觉得这样的调用方式有点麻烦,每次调用前都要写请求协议,服务名称,接口名称、组装参数、处理响应数据类型,这些都是一些重复的工作,代码也都高度相似,每次请求只有 URL 不同,请求方法不同、参数不同,其它东西基本都是一样的,既然如此,那有没有办法简化请求呢?本文我们要聊的声明式微服务调用OpenFeign 。
OpenFeign是一个显示声明式的WebService客户端。使用OpenFeign能让编写Web Service客户端更加简单。使用时只需定义服务接口,然后在上面添加注解。OpenFeign也支持可拔插式的编码和解码器。spring cloud对feign进行了封装,使其支持MVC注解和HttpMessageConverts。和eureka(服务注册中心)和ribbon组合可以实现负载均衡。在Spring Cloud中使用OpenFeign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求,非常的方便
- OpenFeign的设计宗旨式简化Java Http客户端的开发。Feign在restTemplate的基础上做了进一步的封装,由其来帮助我们定义和实现依赖服务接口的定义。在OpenFeign的协助下,我们只需创建一个接口并使用注解的方式进行配置(类似于Dao接口上面的Mapper注解)即可完成对服务提供方的接口绑定,大大简化了Spring cloud Ribbon的开发,自动封装服务调用客户端的开发量。
- OpenFeign集成了Ribbon,利用ribbon维护了服务列表,并且通过ribbon实现了客户端的负载均衡。与ribbon不同的是,通过OpenFeign只需要定义服务绑定接口且以申明式的方法,优雅而简单的实现了服务调用。
项目实战
创建项目
接下来,就开始我们的项目实战,创建两个服务,一个是dms(就是码表服务,提供各种下拉选项列表),一个是应用系统app(实际的业务系统)
首先创建名为dms的maven项目,引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
创建配置文件:
server:
port: 8003
spring:
application:
name: dms
eureka:
client:
service-url:
defaultZone: http://localhost:8001/eureka/
logging:
pattern:
console: '%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n'
编写启动类
/** * @Author:公众号:程序员965 * @create 2022-06-20 **/
@EnableDiscoveryClient
@EnableFeignClients
@EnableEurekaClient
@SpringBootApplication
public class DmsApplication {
public static void main(String[] args) {
SpringApplication.run(DmsApplication.class, args);
}
}
注意此时,我们在启动类上面增加了@EnableFeignClients和@EnableDiscoveryClient注解。
编写api模块代码,注意这是一个接口对外提供服务,接口的服务名称是dms,根据code代码值获取名称:
/** * @Author:公众号:程序员965 * @create 2022-06-20 **/
@FeignClient(value = "dms")
public interface DmsApi {
@RequestMapping(value="/dict/{code}", method = RequestMethod.GET)
public String findNameByCode(@PathVariable("code") String code);
}
编写controller类,可以实现DmsApi接口,这里简单以性别举例:
/** * @Author:公众号:程序员965 * @create 2022-06-20 **/
@RestController
public class DmsController implements DmsApi {
@Override
public String findNameByCode(String code) {
switch (code){
case "0" :
return "男";
case "1" :
return "女";
default:
return "未知";
}
}
}
dms模块就开发完毕了。
同样的,创建app模块,注意需要引入dms模块,以便调用其接口
<dependencies>
<dependency>
<groupId>com.cxy965</groupId>
<artifactId>dms</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
</dependencies>
创建controller层:在此注入dmsApi,并通过dmsApi调用其findNameByCode()方法,即可完成服务的调用代码!
/** * @Author:公众号:程序员965 * @create 2022-06-20 **/
@RestController
public class AppController {
@Autowired
private DmsApi dmsApi;
@RequestMapping("/index")
public String index(){
String nameByCode = dmsApi.findNameByCode("1");
return nameByCode;
}
}
启动类
/** * @Author:公众号:程序员965 * @create 2022-06-20 **/
@EnableEurekaClient
@SpringBootApplication
public class AppApplication {
public static void main(String[] args) {
SpringApplication.run(AppApplication.class, args);
}
}
启动项目验证

返回了正确的结果,当注册中心有多个dms服务时,调用时会自动起到负载均衡的作用。
总结
OpenFeign 是 Spring Cloud 家族的一个成员, 它最核心的作用是为 HTTP 形式的 Rest API 提供了非常简洁高效的 RPC 调用方式。 如果说 Spring Cloud 其他成员解决的是系统级别的可用性,扩展性问题, 那么 OpenFeign 解决的则是与开发人员利益最为紧密的开发效率问题。这篇文章中我们学会了Feign组件的集成和基础使用,下一篇文章将写一下Feign的更多用法,一起期待吧!
边栏推荐
- 一、Qt的核心类QObject
- 聊聊消息队列高性能的秘密——零拷贝技术
- Data type case of machine learning -- using data to distinguish men and women based on Naive Bayesian method
- Leetcode sword finger offer brush questions - day 23
- 长篇总结(代码有注释)数构(C语言)——第四章、串(上)
- 寻找链表中值域最小的节点并移到链表的最前面
- 机器学习之数据类型案例——基于朴素贝叶斯法,用数据辩男女
- 【Go实战基础】gin 如何设置路由
- Solution and analysis of Hanoi Tower problem
- Hengyuan cloud_ Can aiphacode replace programmers?
猜你喜欢

ORA-12514问题解决方法

京东面试官问:LEFT JOIN关联表中用ON还是WHERE跟条件有什么区别

Shengshihaotong and Guoao (Shenzhen) new energy Co., Ltd. build the charging pile industry chain

知识点很细(代码有注释)数构(C语言)——第三章、栈和队列

Kubernetes deploys Loki logging system

C language - Blue Bridge Cup - 7 segment code

Talk about the secret of high performance of message queue -- zero copy technology

How to realize asynchronous programming in a synchronous way?

Matplotlib剑客行——没有工具用代码也能画图的造型师

聊聊消息队列高性能的秘密——零拷贝技术
随机推荐
Gocv image reading and display
Web技术发展史
[staff] common symbols of staff (Hualian clef | treble clef | bass clef | rest | bar line)
查看was发布的应用程序的端口
Matplotlib剑客行——容纳百川的艺术家教程
十年開發經驗的程序員告訴你,你還缺少哪些核心競爭力?
Minecraft install resource pack
选择排序和插入排序
What is the future value of fluorite mine of karaqin Xinbao Mining Co., Ltd. under zhongang mining?
统计字符串中各类字符的个数
图像变换,转置
Tensorflow2 keras 分类模型
History of Web Technology
数构(C语言--代码有注释)——第二章、线性表(更新版)
我服了,MySQL表500W行,居然有人不做分区?
数构(C语言)——第四章、矩阵的压缩存储(下)
Gocv image cutting and display
QT qtimer class
Hengyuan cloud_ Can aiphacode replace programmers?
Don't spend money, spend an hour to build your own blog website