特此注明 :
Designed By :长安城没有风
Version:1.0
Time:2025.09.07
Location:辽宁 · 大连

📕1. 什么是注册中心

随着微服务的流⾏与流量的激增,机器规模逐渐变⼤,并且机器会有频繁的上下线⾏为,这种时候需要运维⼿动地去维护这个配置信息是⼀个很⿇烦的操作。所以开发者们开始希望有这么⼀个东西,它能维护⼀个服务列表,哪个机器上线了,哪个机器宕机了,这些信息都会⾃动更新到服务列表上,客⼾端拿到这个列表,直接进⾏服务调⽤即可,这个就是注册中⼼。

注册中⼼主要有三种⻆⾊ :

  1. 服务提供者(Server):⼀次业务中,被其它微服务调⽤的服务,也就是提供接⼝给其它微服务。
  2. 服务消费者(Client):⼀次业务中,调⽤其它微服务的服务,也就是调⽤其它微服务提供的接⼝。
  3. 服务注册中⼼(Registry): ⽤于保存Server 的注册信息,当Server 节点发⽣变更时,Registry 会同步变更,服务与注册中⼼使⽤⼀定机制通信,如果注册中⼼与某服务⻓时间⽆法通信,就会注销该实例。

他们之间的关系以及⼯作内容,可以通过两个概念来描述 :

  1. 服务注册:服务提供者在启动时,向 Registry 注册⾃⾝服务,并向 Registry 定期发送⼼跳汇报存活状态。
  2. 服务发现: 服务消费者从注册中⼼查询服务提供者的地址,并通过该地址调⽤服务提供者的接⼝,服务发现的⼀个重要作⽤就是提供给服务消费者⼀个可⽤的服务列表。

在这里插入图片描述

举个例子
我们⽣活中,避免不了和各个机构(医院, 学校, 政府部⻔等)打交道,就需要保存各个机构的电话号码。如果机构换了电话号码,就需要通知各个使⽤⽅,但是这些机构的使⽤⽅群体是巨⼤的,没办法做到⼀ 一通知,怎么处理呢?机构电话如果发⽣变化,通知114,⽤⼾需要联系机构时,先打114查询电话,然后再联系各个机构。
114查号台的作⽤主要有两个 :
号码注册: 服务⽅把电话上报给114
号码查询: 使⽤⽅通过114可以查到对应的号码
在这里插入图片描述

📕2. CPA理论

谈到注册中⼼,就避不开CAP理论,CAP 理论是分布式系统设计中最基础,也是最为关键的理论。

在这里插入图片描述

⼀致性(Consistency) :CAP理论中的⼀致性,指的是强⼀致性,所有节点在同⼀时间具有相同的数据。
可⽤性(Availability) :保证每个请求都有响应(响应结果可能不对)。
分区容错性(Partition Tolerance) :当出现⽹络分区后,系统仍然能够对外提供服务。

CAP 理论告诉我们 : ⼀个分布式系统不可能同时满⾜数据⼀致性,服务可⽤性和分区容错性这三个基本需求,最多只能同时满⾜其中的两个。在分布式系统中,系统间的⽹络不能100%保证健康,服务⼜必须对外保证服务。因此Partition Tolerance不可避免,那就只能在C和A中选择⼀个,也就是CP或者AP架构。

正常情况
在这里插入图片描述
网络异常
在这里插入图片描述
CP架构 : 为了保证分布式系统对外的数据⼀致性,于是选择不返回任何数据。
AP架构 : 为了保证分布式系统的可⽤性,节点2返回V0版本的数据(即使这个数据不正确)。

📕3. 搭建Eureka

✏️3.1 创建Eureka-server ⼦模块

在这里插入图片描述

✏️3.2 引⼊eureka-server依赖
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
✏️3.3 项⽬构建插件
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
✏️3.4 完善启动类
@SpringBootApplication
@EnableEurekaServer
public class EurekaServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServiceApplication.class, args);
    }
}
✏️3.5 编写配置⽂件
# Eureka相关配置
# Eureka 服务
server:
  port: 10010
spring:
  application:
    name: eureka-service
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/
✏️3.6 启动服务

启动服务, 访问注册中⼼: http://127.0.0.1:10010/,可以看到eureka-server已经启动成功了

在这里插入图片描述

📕4. 服务注册

✏️4.1 引⼊eureka-client依赖
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
✏️4.2 完善配置⽂件
spring:
  application:
    name: product-service
#Eureka Client
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10010/eureka/
✏️4.3 启动服务

刷新注册中⼼: http://127.0.0.1:10010/,可以看到product-service已经注册到 eureka上了。

在这里插入图片描述

📕5. 服务发现

✏️5.1 引⼊依赖

服务注册和服务发现都封装在eureka-client依赖中, 所以服务发现时, 也是引⼊eureka-client依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
✏️5.2 完善配置⽂件
spring:
  application:
    name: order-service
#Eureka Client
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10010/eureka/
✏️5.3 远程调⽤
@Slf4j
@Service
public class OrderService {
    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private DiscoveryClient discoveryClient;

    public OrderInfo getOrderById(Integer orderId) {
        OrderInfo orderInfo = orderMapper.selectOrderById(orderId);

        List<ServiceInstance> instances = discoveryClient.getInstances("product-service");

        String uri = instances.get(0).getUri().toString();

        log.info("uri: {}", uri);

        String url = uri + "/product/" + orderInfo.getProductId();

        ProductInfo forObject = restTemplate.getForObject(url, ProductInfo.class);

        orderInfo.setProductInfo(forObject);

        return orderInfo;
    }
}
✏️5.4 启动服务

刷新注册中⼼: http://127.0.0.1:10010/,可以看到order-service已经注册到 eureka上了

在这里插入图片描述
访问接⼝: http://127.0.0.1:8080/order/1,可以看到,远程调⽤也成功了。

在这里插入图片描述

更多推荐