最近笔者做了一个AI赋能的项目,在项目构建过程中,使用了springboot的脚手架搭建了基本的框架,同时配置了datasoure和注册中心,今天就来聊聊微服务架构中为什么要用注册中心。
在复杂的微服务环境中,服务数量众多且动态变化,如上线或者掉线。这个时候就需要有一个角色,来统一管理所有服务,而注册中心就充当这一重要角色。
微服务架构中常用的注册中心有eureka、nacos,它们都提供了服务的注册与发现功能。如果没有注册中心,新上线的服务或者下线的服务,其他微服务无法及时感知,这将导致服务调用失败。例如,在一个电商平台中,订单服务可能需要调用库存服务来检查商品库存。如果库存服务进行了更新或部署了新的实例,而订单服务无法及时获取这些变化,就可能出现异常。
它们一般都会结合Ribbon,一个负载均衡器来使用,当有新品发布会或者科技日的时候,同一时刻会有大量请求过来,此刻,ribbon会从注册中心获取到的多个服务实例中,采用一定的负载均衡策略(如轮训、随机等),将请求发送到合适的服务实例上,确保服务的高效响应。
基于springboot的后端项目,服务间通信,基本都会使用feign调用,而feign调用的的底层就是使用ribbon来选择具体的服务实例来进行请求的发送。
接下来探讨下它是如何集成到springboot中的,本文以eureka为例。
首先,在pom.xml中引入eureka的client的jar包。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.6</version>
</dependency>
接下来通过maven工具检查下有没有依赖冲突。
然后,配置eureka的相关参数。
eureka:
client:
# 客户端要连接的服务注册中心的 URL 列表。
service-url:
defaultZone: http://eureka1.netflix:10888/eureka/,http://eureka2.netflix:10888/eureka/
# 从服务端获取最新服务实例的间隔
registry-fetch-interval-seconds: 5
# 将当前实例到注册中心
register-with-eureka: true
instance:
# 表示服务更倾向于使用实例的IP地址进行注册
prefer-ip-address: true
# 给服务端发送心跳的时间间隔
lease-renewal-interval-in-seconds: 10
# 租约的过期时间,在租约过期时间内没有发送心跳进行续约,注册中心将认为该实例已经下线,会将其从服务注册表中移除。
lease-expiration-duration-in-seconds: 10
最后,启动服务,同时在eureka的后台检查服务有没有注册成功。
通常情况下,服务实例通过eureka客户端向服务端注册时,会携带以下信息:
- 服务实例 ID:order-service
- 服务名称:订单服务
- 主机名:server-01
- IP 地址:192.168.1.188
- 端口号:8888
- 健康检查 URL:http://192.168.1.188/health
- 服务主页:http://192.168.1.188/home
- 服务状态页:http://192.168.1.188/status
- 元数据:{"version": "1.0", "environment": "test"}