• 服务注册Eureka


    目录

    一、背景

    1、概念

    2、CAP 理论

    3、常见的注册中心

    二、Eureka

    三、搭建 Eureka Server

    1、搭建注册中心

    四、服务注册

    五、服务发现

    六、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 的依赖

    1. <dependency>
    2. <groupId>org.springframework.cloud</groupId>
    3. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    4. </dependency>
    1. <build>
    2. <plugins>
    3. <plugin>
    4. <groupId>org.springframework.boot</groupId>
    5. <artifactId>spring-boot-maven-plugin</artifactId>
    6. </plugin>
    7. </plugins>
    8. </build>

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

    1. # Eureka相关配置
    2. # Eureka 服务
    3. server:
    4. port: 10010
    5. spring:
    6. application:
    7. name: eureka-server
    8. eureka:
    9. instance:
    10. hostname: localhost
    11. client:
    12. fetch-registry: false # 表示是否从Eureka Server获取注册信息,默认为true.因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,这里设置为false
    13. register-with-eureka: false # 表示是否将自己注册到Eureka Server,默认为true.由于当前应用就是Eureka Server,故而设置为false.
    14. service-url:
    15. # 设置与Eureka Server的地址,查询服务和注册服务都需要依赖这个地址
    16. defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

    (4)启动类,开启 Eureka 功能

    1. @EnableEurekaServer
    2. @SpringBootApplication
    3. public class EurekaServerApplication {
    4. public static void main(String[] args) {
    5. SpringApplication.run(EurekaServerApplication.class,args);
    6. }
    7. }


    四、服务注册

    服务注册分为以下几步:

    1、加入 Eureka 的依赖

    1. org.springframework.cloud
    2. spring-cloud-starter-netflix-eureka-client

    2、修改配置信息

    1. #Eureka Client
    2. eureka:
    3. client:
    4. service-url:
    5. defaultZone: http://127.0.0.1:10010/eureka/
    1. spring:
    2. application:
    3. name: product-service # 自定义名字

    3、启动,测试


    五、服务发现

    服务发现分为以下几步:

    1、加入 Eureka 依赖

    1. org.springframework.cloud
    2. spring-cloud-starter-netflix-eureka-client

    2、修改配置信息

    配置信息与上面的一样

    3、修改远程调用代码

    1. @Service
    2. public class OrderService {
    3. @Autowired
    4. private OrderMapper orderMapper;
    5. @Autowired
    6. private RestTemplate restTemplate;
    7. @Autowired
    8. private DiscoveryClient discoveryClient;
    9. public OrderInfo selectOrderById(Integer orderId){
    10. OrderInfo orderInfo = orderMapper.selectOrderById(orderId);
    11. // String url = "http://127.0.0.1:9090/product/"+orderInfo.getProductId();
    12. List instances = discoveryClient.getInstances("product-service");
    13. String uri = instances.get(0).getUri().toString();
    14. String url = uri + "/product/"+orderInfo.getProductId();
    15. ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);
    16. orderInfo.setProductInfo(productInfo);
    17. return orderInfo;
    18. }
    19. }

    4、启动,测试


    六、Eureka 和 Zooper 的区别

  • 相关阅读:
    设计模式之【工厂模式、适配器模式】
    flink 技术总结待续
    写技术博客的一些心得分享
    spyglass cdc检查约束
    零基础数模之回归专题
    【Spring】事务和事务传播机制
    OpenCvSharp MatType与C#数据类型对应关系
    【Excel】两组行数不同数据做二维柱状图
    cnpm install时,报错TypeError: randomUUID is not a function无法初始化
    2022年苏大计算机考研872真题及解析
  • 原文地址:https://blog.csdn.net/weixin_73616913/article/details/140136504