服务注册Eureka

目录

一、背景

1、概念

[2、CAP 理论](#2、CAP 理论)

3、常见的注册中心

二、Eureka

[三、搭建 Eureka Server](#三、搭建 Eureka Server)

1、搭建注册中心

四、服务注册

五、服务发现

[六、Eureka 和 Zooper 的区别](#六、Eureka 和 Zooper 的区别)


一、背景

1、概念

远程调用就类似于一种通信

例如:当游客与景区之间进行通信(电话的方式),此时游客需要得到景区的电话,例如通过景区官网或者 114 查号台进行查询

那么 114 平台又是如何知道景区和电话的关系的呢?

景区当创建和修改的时候告诉 114 平台,由 114 平台对信息进行维护,游客就可以通过 114 查询电话,再向景区进行通讯

上述的解决方案同样也适用于微服务中

在微服务中,有两个角色:服务消费者和服务提供者

当订单服务调用商品服务,从中获取到对应的商品信息,此时订单服务就是服务消费者,商品服务就是服务提供者

服务提供者在启动之初,向平台进行注册,告诉平台 应用 和 IP 的关系,服务消费者可以从平台中根据应用获取到 IP 地址,然后根据 IP 地址进行远程调用

服务提供者和注册中心的关系我们称之为服务注册,服务消费者和注册中心的关系称为服务发现

我们来看一下这三种角色分别的作用

注意:服务提供者和服务消费者是相对的概念!!!

服务注册和服务发现的解释:


2、CAP 理论

CAP 理论是分布式系统中最基础、最关键的理论

我们来看一下 CAP 理论的图:

C:Consistency 一致性(此处的一致性指的是强一致性)

A:Availability 可用性 (对所有请求都有响应,这个响应可能是错误的数据)

P:Partition tolerance 分区容错性(在网络分区的情况下,我们的系统依然可以对外提供服务)

例如:银行利率下调,这个通知需要下发到各个银行的工作人员,通知下发需要一定的时间

一致性:在相同的时间点,所有的工作人员对客户讲的利率都是一样的

可用性:不论何时,所有的银行工作人员对客户咨询利率都是有回复的(回复也有可能是旧利率)

分区容错性:如果其中一个工作人员请假了,银行仍然可以对外提供服务

在分布式系统中,P 必须要保证,所以 C 和 A 只能二选一,因此我们的架构就是 AP / CP 架构

CP架构: 为了保证分布式系统对外的数据⼀致性, 于是选择不返回任何数据

AP架构: 为了保证分布式系统的可⽤性, 节点2返回V0版本的数据(即使这个数据不正确)

什么是强一致性?

数据库集群分为主库和从库

客户端向数据库集群发送了一个数据修改的请求,数据库集群需要向客户端进行响应,响应的时机分为以下两种:

1、主库接收到请求,并处理成功,此时数据还未完全同步到从库,随着时间的推移,主库和从库的数据最终达到一致性

2、主库接收到请求,并且所有从库数据同步成功时,数据库集群才进行响应

强一致性:主库和从库,无论何时对外提供的服务都是一致的【第二种情况】

弱一致性:随着时间的推移,最终达到了一致性【第一种情况】


3、常见的注册中心


二、Eureka

官方文档: https://github.com/Netflix/eureka/wiki
Eureka主要分为两个部分:
Eureka Server: 作为注册中心Server端, 向微服务应用程序提供服务注册, 发现, 健康检查等能力.
Eureka Client: 服务提供者, 服务启动时, 会向Eureka Server 注册自己的信息(IP,端口,服务信息
等),Eureka Server 会存储这些信息


三、搭建 Eureka Server

1、搭建注册中心

(1)创建项目

(2)pom 中加入 Eureka 的依赖

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

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

(3)配置文件增加 Eureka 相关配置

复制代码
# Eureka相关配置
# Eureka 服务
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
@SpringBootApplication
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class,args);
    }
}

四、服务注册

服务注册分为以下几步:

1、加入 Eureka 的依赖

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

2、修改配置信息

java 复制代码
#Eureka Client
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10010/eureka/
java 复制代码
spring:
  application:
    name: product-service # 自定义名字

3、启动,测试


五、服务发现

服务发现分为以下几步:

1、加入 Eureka 依赖

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

2、修改配置信息

配置信息与上面的一样

3、修改远程调用代码

java 复制代码
@Service
public class OrderService {
    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private DiscoveryClient discoveryClient;

    public OrderInfo selectOrderById(Integer orderId){
        OrderInfo orderInfo = orderMapper.selectOrderById(orderId);
        // String url = "http://127.0.0.1:9090/product/"+orderInfo.getProductId();
        List<ServiceInstance> instances = discoveryClient.getInstances("product-service");
        String uri = instances.get(0).getUri().toString();
        String url = uri + "/product/"+orderInfo.getProductId();
        ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);
        orderInfo.setProductInfo(productInfo);
        return orderInfo;
    }
}

4、启动,测试


六、Eureka 和 Zooper 的区别

相关推荐
SPC的存折2 分钟前
9、K8S-Service资源对象
云原生·容器·kubernetes
SPC的存折2 分钟前
8、K8S-Statefulset控制器
云原生·容器·kubernetes
Mr_pyx6 分钟前
RAG知识库从零到一:简单搭建教程(java版)
java·spring·ai·rag
敲代码的瓦龙9 分钟前
Android?碎片!!!
java·开发语言·android-studio
sbjdhjd10 分钟前
Docker 网络工业级实战手册
linux·运维·经验分享·笔记·docker·云原生·云计算
月落归舟12 分钟前
深入解析Spring依赖注入 DI 的三种方式
java·后端·spring
亚马逊云开发者19 分钟前
Lambda 冷启动改善了,你的 Provisioned Concurrency 可能白花钱了
java
C雨后彩虹24 分钟前
猴子爬山问题
java·数据结构·算法·华为·面试
天真吴邪xie25 分钟前
Claude Code安装
java·git
步步为营DotNet30 分钟前
.NET 11 中 C# 14 新特性在云原生微服务安全与性能优化的深度探索
云原生·c#·.net