目录
@EnableDiscoveryClient
服务发现的核心概念
服务注册中心
@EnableDiscoveryClient注解的作用
服务心跳健康检查
使用示例
@EnableFeignClients
Feign简介
@EnableFeignClients注解的作用
RPC(Remote Procedure Call)
参考链接
Spring Cloud 为开发人员提供了构建分布式系统中一些常见的组件。它的两个强大的注解@EnableDiscoveryClient和@EnableFeignClients简化了微服务架构中的服务注册、发现和通信。
@EnableDiscoveryClient
服务发现的核心概念
- 服务注册表:服务在启动时进行自我注册的数据存储表。这是服务之间相互寻找的存储数据的容器。
- 服务提供者:在启动时注册其服务,并在关闭时取消注册的服务。
- 服务使用者:查询注册表以发现和调用其他服务。
服务注册中心
服务注册中心是微服务架构中的一个关键组件,它用于管理所有的服务实例。服务注册中心提供了一个服务注册表,其中包含了所有可用的服务实例信息,包括服务的名称、地址、端口等信息。当一个服务实例启动时,它会向注册中心注册自己的信息,当一个服务需要调用其他服务时,它可以通过服务注册中心获取到其他服务的信息,然后进行调用。
@EnableDiscoveryClient注解的作用
@EnableDiscoveryClient 注解是 Spring Boot 应用程序注册到服务注册中心的关键注解。通过使用这个注解,我们可以轻松地将 Spring Boot 应用程序注册到 Eureka 注册中心中,并且可以实现自动的服务发现和负载均衡。在实际项目中,使用 @EnableDiscoveryClient 注解可以使我们的微服务架构更加灵活和可靠。
服务心跳健康检查
服务发现的一个重要功能是跟踪服务运行状况的能力。当服务向发现服务器注册时,它会定期发送心跳以表明它仍然存在并正常运行。如果服务器停止接收这些心跳(可能是由于服务崩溃或网络问题),它会将服务标记为关闭并将其从可用服务列表中删除。
使用示例
导入springcloud及nacos相关依赖到pom文件中
<!-- spring colud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud alibaba-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${com.alibaba.cloud}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
编写配置文件声明服务名称及nacos注册中心地址
server:
port: 51803
spring:
application:
name: leadnews-wemedia
cloud:
nacos:
discovery:
server-addr: 192.168.200.130:8848
config:
server-addr: 192.168.200.130:8848
file-extension: yml
在微服务启动类上添加@EnableDiscoveryClient注解
@SpringBootApplication
@EnableDiscoveryClient
public class WemediaApplication {
public static void main(String[] args) {
SpringApplication.run(WemediaApplication.class,args);
}
}
为了简化配置管理,此后可以通过网页访问nacos注册中心添加leadnews-wemedia相关配置 :启动虚拟机开启Docker,启动nacos容器,访问192.168.200.130:8848。添加配置信息
在nacos中配置相关信息后可以在对应服务中使用相关配置,如Kafka、MySQL等,便于统一管理配置文件。
@EnableFeignClients
Feign简介
Feign 是一个声明式的 REST 客户端,它的目的就是让 REST 调用更加简单。Feign 提供了 HTTP 请求的模板,通过编写简单的接口和插入注解,就可以定义好 HTTP 请求的参数、格式、地址等信息。
而且 Feign 会完全代理 HTTP 请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。Spring Cloud 对 Feign 进行了封装,使其支持 SpringMVC 标准注解和 HttpMessageConverters。Feign 可以与 Eureka 和 Ribbon 组合使用以支持负载均衡,与 Hystrix 组合使用,支持熔断回退。
如果你没有使用 Spring Cloud,那么可以直接用原生的 Feign 来调用 API,如果你使用了 Spring Cloud,可以直接用 Spring Cloud OpenFeign 来调用 API。
@EnableFeignClients注解的作用
使用 @EnableFeignClients 简化服务间通信:在微服务范式中,服务通常需要相互通信。在许多系统中,这种服务间通信通常通过 HTTP/REST 完成。虽然 Spring 生态系统提供了各种方法来进行这些 HTTP 调用,但 Feign 因其简单和优雅而脱颖而出。
Feign的高级特性及使用示例
请读者参阅本人另一篇文章:SpringCloud Feign实现微服务间的远程调用(黑马头条Day04)_springcloud 微服务之间调用feignclient-CSDN博客
RPC(Remote Procedure Call)
RPC(Remote Procedure Call)远程过程调用:用于解决分布式系统中服务之间的调用问题。 通俗地讲,就是开发者能够像调用本地方法一样调用远程的服务。
作用:
- 屏蔽远程调用和本地调用的区别,让我们感觉就像是调用项目内的方法。
- 隐藏底层网络的复杂性,让我们更专注与业务逻辑。
RPC框架重要的三大组件:客服端、服务端、注册中心。
注册中心主要实现的功能:服务注册、服务发现。
注意到,RPC中有关键的第一步就是要调用connect去建立TCP连接。既然要连接,那么要拿到对方的IP:port才行吧。如果对方是单机部署就很容易,直接用这个IP:PORT就行了。
然而,又是可恶的分布式再作怪,对端的服务通常是多机部署的。这时候怎么办,随便找一台机器?那肯定不行,要是这台机器故障了不就完了。再说你只指定一台机器,对方多机部署的意义何在?
那么这个时候有个第三者就出来了。有个叫服务中心的家伙,手下管理着大量服务的IP列表:
简单的RPC实现的过程:
- client进行connect连接
- client序列化req
- client根据约定的协议编码,向server发送编码后的数据
- server接收到数据,解码得到方法名和序列化过后的req二进制流
- server根据方法名找到req的类型,反序列化得到req对象
- server调用本地方法得到res
- server序列化res
- server根据约定的协议编码并发送数据
- client接收到数据并解码
- client反序列化得到res
基于HTTP的RESTful接口 VS 基于TCP的RPC协议
REST(Representational State Transfer) 这是一种HTTP调用的格式,更标准,更通用,无论哪种语言都支持http协议。
RPC(Remote Promote Call) 一种进程间通信方式。允许像调用本地服务一样调用远程服务。RPC框架的主要目标就是让远程服务调用更简单、透明。RPC框架负责屏蔽底层的传输方式、序列化方式和通信细节。开发人员在使用的时候只需要了解谁在什么位置提供了什么样的远程服务接口即可,并不需要关心底层通信细节和调用过程。
参考链接
Spring Boot 中的 @EnableDiscoveryClient 注解-CSDN博客
怎么理解rpc,既然有http请求了为啥还要用rpc? - 知乎
如何手撸一个较为完整的RPC框架 - 掘金