【微服务】(3) 服务注册与发现

一、问题出现

订单服务调用商品服务的接口时,写死 商品服务接口的url ,使用 spring 提供的 RestTemplate 进行 http 通信。这存在一个问题,每次 url 变更,都需要修改原有代码,频繁部署,十分麻烦。

二、注册中心

注册中心能解决上述问题:

  • 服务注册 :服务提供者启动时,主动把自己的接口地址注册 到注册中心,并定期发送心跳 汇报存活状态,一旦注册中心与服务提供者长时间无法通信 ,则注销该实例。
  • 服务发现 :服务消费者主动到注册中心查询服务提供者的接口地址,并通过该地址调用服务提供者的接口。

三、CAP 理论

CAP 理论是注册中心设计的基础理论。

  • 一致性Consistency):所有服务同时向注册中心查询/注册,得到的响应一致。
  • 可用性Availability):所有服务向注册中心注册/查询,都能得到响应(但响应结果可能是错的)。
  • 分区容错性Partition Tolerance):当注册中心集群中存在通信中断(网络分区),注册中心仍能继续对外提供服务。

网络故障是不可避免的,注册中心集群又不能同时全部故障,因此分区容错性是必须 的。而 一致性 和 可用性 则是二选一:假设注册中心 A 与注册中心 B、C 通信中断。某服务向 A 注册/注销,B、C 不知道;反之亦然。

  • 保留一致性 :为达到一致性,将节点数少的分区 A 停止对外服务,直到恢复网络,那么此时 A 是不可用的。
  • 保留可用性 :为达到可用,不同的网络分区同时对外提供服务,不同分区存在信息差,那么此时必是不一致的。

因此对于注册中心集群,AP、CP 架构二选一。

四、常见注册中心

  • Zookeeper:Apache 开源。遵循 CP 原则。节点集群有主从之分,当主节点故障,会重新选举主节点,这个过程有短暂时间不可用。

  • Eureka:Netflix 开源。虽然 2.0 版本已停止维护,但依然是 Spring Cloud 服务注册/发现的默认实现。遵循 AP 原则。每个节点均等

  • Nacos:Alibaba 开源。遵循 CP 或 AP,默认 AP。

    虽然 AP 可能会拿到没有即时更新的错误信息,但总比无法提供服务的 CP 强,比如高并发的场景。

五、搭建 Eureka 服务

1、搭建注册中心服务端

目的:提供服务注册、发现、健康检查能力。

(继【微服务】环境与工程搭建)

1、创建 Eureka 服务端子模块。

2、引入服务端依赖:

XML 复制代码
<dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

再加一个 maven 插件打包

3、yml 配置 Eureka:

java 复制代码
server:
  port: 10010
spring:
  application:
    name: eureka-server
eureka:
  instance:
    hostname: localhost
  client:
    fetch-registry: false # 表示是否从Eureka Server获取注册信息,默认为true.因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,这里设置为false
    register-with-eureka: false # 表示是否将自己注册到Eureka Server,默认为true.由于当前应用就是Eureka Server,故而设置为false.
    service-url:
      # 设置Eureka Server的地址,查询服务和注册服务都需要依赖这个地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

4、启动类开启 Eureka 功能:

java 复制代码
@EnableEurekaServer

5、启动项目,访问 Eureka 注册中心可视化管理页面:

XML 复制代码
http://${eureka.instance.hostname}:${server.port}

# 注意不是
http://${eureka.instance.hostname}:${server.port}/eureka/

2、服务注册

目的:把 product-service(服务提供者)注册到 eureka 服务端中。

1、引入 Eureka 客户端依赖:

XML 复制代码
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

2、yml 配置 Eureka:

XML 复制代码
# 应用名称,后面远程调用时 通过应用名称 获取实例信息
spring:
  application:
    name: product-service

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10010/eureka/

3、启动服务,查看管理页面:

3、服务发现

目的:order-service 从 eureka 服务端拉取 product-service 的服务信息,进行远程调用。

1、引入 Eureka 客户端依赖。

2、配置 Eureka。

3、修改远程调用方式:

java 复制代码
// 1. 注入服务发现
@Resource
private DiscoveryClient discoveryClient;

// 2. 从注册中心获取服务信息

//从Eureka中获取服务列表,指定要查询的服务名
List<ServiceInstance> instances = discoveryClient.getInstances("product-service");
// 因为目前只有一个商品服务,所以这里取第一个
String uri = instances.get(0).getUri().toString();
// 构造访问商品服务的 url
String url = uri+"/product/"+orderInfo.getProductId();

4、启动服务,查看管理页面:

查询订单服务,远程调用商品服务:

相关推荐
Light604 小时前
MyBatis-Plus 全解:从高效 CRUD 到云原生数据层架构的艺术
spring boot·云原生·架构·mybatis·orm·代码生成·数据持久层
lbb 小魔仙4 小时前
【Java】Spring Cloud 微服务架构入门:五大核心组件与分布式系统搭建
java·spring cloud·架构
未来之窗软件服务4 小时前
幽冥大陆(八十)Win7环境下ARM架构开发—东方仙盟练气期
arm开发·架构·仙盟创梦ide·东方仙盟
yannan201903134 小时前
简述kubernetes(k8s)
云原生·容器·kubernetes
eddy-原4 小时前
云原生分布式系统综合实战:微服务网关、日志监控与对象存储架构
微服务·云原生·架构
汪碧康4 小时前
【k8s-1.34.2安装部署】十.gateway Api v1.4.0和istio安装
云原生·容器·kubernetes·gateway·istio·cilium·xkube
阿坤带你走近大数据4 小时前
StarRocks(SR)的基本概念、架构及基本使用介绍
starrocks·架构·olap
小小工匠4 小时前
LLM - 生产级 AI Agent 设计手册:从感知、记忆到决策执行的全链路架构解析
人工智能·架构
赋创小助手13 小时前
融合与跃迁:NVIDIA、Groq 与下一代 AI 推理架构的博弈与机遇
服务器·人工智能·深度学习·神经网络·语言模型·自然语言处理·架构