微服务实战之春云与刀客(二)—— Spring cloud 实现仿RPC面向接口调用方式

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 像HSF、dubbo这种RPC框架,客户端都是通过接口(Interface)调用服务的,无须自己拼装调用方式,客户端就像调用本地类方法一样。而spring cloud原生的客户端调用时通过RestTemplate发起Http调用请求,需要手动指定URL和参数,在使用上比较费劲,后来出现了申明式服务调用——Spring Cloud Feign,终于使调用得到了解放,而本文就是讲述如何极致地利用Feign来进行微服务开发。

概述

像HSF、dubbo这种RPC框架,客户端都是通过接口(Interface)调用服务的,无须自己拼装调用方式,客户端就像调用本地类方法一样。而spring cloud原生的客户端调用时通过RestTemplate发起Http调用请求,需要手动指定URL和参数,在使用上比较费劲,后来出现了申明式服务调用——Spring Cloud Feign,终于使调用得到了解放,而本文就是讲述如何极致地利用Feign来进行微服务开发,如何定义代码结构规范。

RestTemplate

RestTemplate 可以认为就是对HttpClient的一个封装,可以把调用的结果转化成Java 对象,从而达到简化开发的目的。
下面简单用一个例子来说明一下(例子实际设计到了eureka注册中心,关于如何使用eureka注册中心这些可以自己查阅相关资料,这里忽略)。在服务器端,我们像正常开发Controller一样写一个hi的方法,返回一个简单的字符串。
image

然后在客户端,显示需要注册一个RestTemplate Bean,这里@LoadBalanced的注解就是开启客户端负载均衡的能力(前提还需要在入口类上添加@EnableDiscoveryClient注解开启服务发现)
image

然后就像http请求一样调用服务器的hi方法,然后得到返回结果。例子中的equipment-service 是服务Id(serviceId),实际调用时会根据服务发现的结果替换成服务的ip和端口号。

image

可以看出,这种直接拼链接的调用对于微服务开发很不友好,所以才有了Feign的诞生。

申明式服务调用:Spring Cloud Feign

还是刚才的例子,在服务器端写个hi方法:
image

剩下的就是客户端的事情了。
首先,客户端需要引入Feign(这里也只是简要说一下流程)
image
然后定义一个interface。这个接口是什么意思呢?它实际就是把RestTemplate调用的链接转成了接口和方法。如URL中的equipment-service放到了interface的@FeignClient注解里面,而URL的路径对应方法上的@RequestMapping,URL参数也对应方法的参数,通过这种方式,巧妙地把URL调用转化成了方法的调用。
image

定义好接口后,Feign在spring初始化的时候会自动扫描包含@FeignClient的接口并注册成spring bean,然后就可以直接使用了
image

Feign 的接口定义移到服务器端

上面的代码接口是在客户端定义的,无形中客户端多了这一块麻烦的工作,而比较合理的做法是由服务提供者来提供接口。
首先在服务端定义接口
image

然后服务器端新建一个Controller(注意是Controller)继承这个接口。
image

最后客户端只需引入这个接口,就像本地spring bean一样调用服务了,客户端是不用关系服务在哪台服务上面的。

image

微服务代码结构规范

在上面接口调用的基础上,我们可以总结出一套代码结构规范。

image

1、首先所有的微服务有一个根级的root pom,包含了spring cloud的版本等基本定义信息,同时也定义好统一的groupId。这个pom文件最大的好处就是统一了spring
cloud的版本,避免以后开发中出现的各种不兼容问题。
这个pom定义好后一般不轻易改变,如果接入新版本的spring cloud,则升级maven version再deploy到maven服务器即可。

<parent>
    <groupId>com.cehome.cloud</groupId>
    <artifactId>cehome-cloud-parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</parent>

2、和root pom同目录下是各种微服务目录(项目),每种微服务为一个项目,每个项目下面再分为api(接口)和service(实现)模块。

3.一个服务开发的流程是这样的:
服务器端:在api模块定义服务接口,在service模块实现服务。
客户端:直接依赖api jar包即可调用服务,无须了解调用服务器地址和具体的URL。

例如对于user微服务,服务器端由user-api 和user-service两个模块,开发完后,user-api发布到maven服务器成user-api-1.0.0.jar;
客户端直接依赖user-api-1.0.0.jar,引用服务接口就可以调用服务。
注意user-api-1.0.0.jar是一个非常轻量级的jar包,只包含了interface和一些实体类定义,一般不会有微服务实现的代码逻辑。

目录
相关文章
|
13天前
|
消息中间件 负载均衡 Java
Java一分钟之-Spring Cloud:微服务架构工具集
【6月更文挑战第8天】本文介绍了Spring Cloud的核心组件,包括Eureka(服务注册与发现)、Ribbon(客户端负载均衡)、Zuul(API网关)、Hystrix(断路器)、Spring Cloud Config(配置中心)和Spring Cloud Bus(事件总线)。文中强调了各组件的易错点,如Eureka的服务注册失败、Ribbon的配置、Zuul的路由错误、Hystrix的启用及配置、Config Server的加载失败和Bus的通讯问题,并给出了相应的代码示例和解决建议。在实际开发中,关注日志和使用调试工具是保证微服务系统稳定运行的关键。
98 6
|
12天前
|
负载均衡 Java API
Java一分钟之-Spring Cloud OpenFeign:声明式服务调用
【6月更文挑战第9天】Spring Cloud OpenFeign是声明式服务调用库,简化了微服务间调用。通过动态代理,它允许开发者用Java接口调用HTTP服务,支持服务发现、负载均衡。本文介绍了OpenFeign的基本概念,展示了如何添加依赖、开启客户端和定义服务接口。还讨论了接口调用失败、超时重试和日志配置等问题及其解决方案,并提供了自定义Feign配置的代码示例。通过学习,读者可以更好地在微服务架构中使用OpenFeign进行服务通信。
172 4
|
1天前
|
Java 开发者 Sentinel
Spring Cloud系列——使用Sentinel进行微服务保护
Spring Cloud系列——使用Sentinel进行微服务保护
13 5
|
5天前
|
Java 测试技术 持续交付
Java一分钟之-Spring Cloud Contract:契约测试
【6月更文挑战第16天】Spring Cloud Contract是微服务契约测试框架,通过DSL定义接口行为,使用WireMock生成存根进行独立开发验证。常见问题包括契约编写不清晰、未集成到CI/CD和契约版本控制混乱。例如,定义一个`GET /greeting`返回JSON响应的契约,Spring Cloud Contract会自动生成测试代码,帮助确保服务间接口一致性,提升开发效率和系统稳定性。
31 7
|
1天前
|
安全 Java 数据安全/隐私保护
在Spring Cloud中实现单点登录(Single Sign-On, SSO)
在Spring Cloud中实现单点登录(Single Sign-On, SSO)
11 2
|
1天前
|
监控 Java Sentinel
Spring Cloud微服务架构
Spring Cloud微服务架构
12 1
|
6天前
|
Java Nacos 数据格式
Spring Cloud Nacos 详解:服务注册与发现及配置管理平台
Spring Cloud Nacos 详解:服务注册与发现及配置管理平台
27 3
|
13天前
|
存储 消息中间件 Java
Java一分钟之-Spring Cloud Config:外部化配置
【6月更文挑战第8天】Spring Cloud Config提供外部化配置,通过Config Server管理和版本控制微服务配置。本文涵盖Config Server与Client的配置、常见错误、多环境配置、实时更新及使用示例。注意配置服务器URL、环境变量设置、Bus配置以及安全问题。使用Config能提升系统灵活性和可维护性,但要留意日志以确保配置正确和安全。
90 10
|
6天前
|
Java 数据库 开发者
深入解析 Spring Cloud Seata:分布式事务的全面指南
深入解析 Spring Cloud Seata:分布式事务的全面指南
21 1
|
13天前
|
安全 Java 开发者
Java一分钟之-Spring Cloud Netflix Eureka:服务注册与发现
【6月更文挑战第8天】Spring Cloud Eureka是微服务架构的关键,提供服务注册与发现功能。本文讲解Eureka工作原理、配置、常见问题及解决方案。Eureka包含Server(管理服务状态)和Client(注册服务实例并发现服务)。快速入门包括启动Eureka Server和创建Eureka Client。常见问题涉及服务注册不上、服务下线和客户端注册信息不准确,可通过检查网络、理解自我保护机制和配置元数据解决。此外,文中还提及健康检查、安全配置和集群部署等高级实践,以增强系统健壮性和扩展性。
57 8