SpringCloud 初学——微服务框架基本了解与Eureka注册了解

340 阅读5分钟

SpringCloud 微服务

我是跟着黑马程序员走的。

本文全程都是 qa 格式!

本文全程都是 qa 格式!

本文全程都是 qa 格式!




认识微服务

什么是单体架构

  • 将所有的功能集中在一个项目开发,打成一个包部署

单体架构有什么优点

  • 架构简单
  • 部署成本低

单体架构有什么缺点

  • 耦合度高

什么是分布式架构

  • 根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为一个服务

分布式架构有什么优点

  • 耦合度低
  • 有利于服务的升级拓展

分布式架构有什么缺点

  • 架构复杂
  • 运维、监控、部署难度提高

分布式架构需要考虑什么问题

  • 服务拆分成什么粒度
  • 服务集群地址如何维护
  • 服务之间如何远程调用
  • 服务健康状态如何感知
  • 2022/05/16:目前最好的解决方法就是使用微服务架构

什么是微服务架构

  • 微服务是一种经过良好架构设计的分布式架构方案

微服务有什么特点

  • 单一职责:微服务拆分力度更小,每个服务对应一个唯一的业务能力,做到单一职责,避免重复业务开发
  • 面向服务:微服务对外暴露业务接口
  • 自治:团队独立、技术独立、数据独立、部署独立
  • 隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题

服务拆分及远程调用

服务拆分需要注意什么

  • 不同的微服务,不能开发重复的业务
  • 不同微服务应该有自己独立的数据库。微服务数据库相互独立,不能访问其他微服务的数据库
  • 需要将自己的服务(提供的功能)暴露成接口,提供给其他微服务调用

什么是远程调用

  • 微服务A向微服务B发送http请求(类似于浏览器发送请求到微服务B)来获取自己所需要的服务。

如何实现远程调用

  • RestTemplate类注入 spring 容器当中,通过调用RestTemplategetForObject方法发送get请求,在方法内传入被调用微服务的url 和返回的数据类型来获取数据。

  • 注入 spring 容器中

    /**
     * 创建 RestTemplate 并注入 spring 容器。
     * @return RestTemplate
     */
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    
  • 调用getForObject方法发送get请求

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2. 利用 RestTemplate 发送 http 请求到对应的微服务,并定义返回的数据类型。
        String url = "http://localhost:8081/user/" + order.getUserId();
        User user = restTemplate.getForObject(url, User.class);
        // 3. 封装 User 到 Order 中。
        order.setUser(user);
        // 4.返回
        return order;
    }
    

    image-20220516215202298

什么是提供者和消费者

  • 服务提供者:在一次业务中,被其他微服务调用的的服务(提供接口给其他服务)
  • 服务消费者:在一次业务中,调用其他微服务的服务。(调用其他微服务提供的接口)

如何判别提供者和消费者

  • 根据一次业务中的实际情况来判断提供者和消费者
  • 提供者和消费者是相对的。抛开业务不谈,一个服务既可以是提供者也可以是消费者。

Eureka 注册中心

硬编码服务调用会出现什么问题

  • 消费者不知如何获取服务提供者地址信息
  • 多个提供者不知如何选择
  • 无法了解提供者健康状态

Eureka 架构中微服务分为哪两类

  • EurekaServer 服务端,注册中心
  • EurekaClient 客户端

EurekaServer 和 EurekaClient 关系

  • image-20220516235218172

EurakaServer 有什么作用

  • 记录每个微服务的服务信息,如访问功能的接口路径。
  • 心跳监控,监控提供者微服务的健康状态。

EurekaClient 微服务分类和作用是什么

  • EurakeClient 微服务分为消费者和提供者。
  • 提供者
    • 提供者会注册自己的信息到 EurekaServer (将自己的服务信息给 EurekaServer )
    • 提供者会每个30秒向 EurekaServer 发送心跳(想 EurekaServer 发送自己健康状态),不发送视为心跳不正常,信息会被剔除
  • 消费者
    • 消费者会根据服务名称从 EurekaServer 中拉去服务列表
    • 获取服务列表后做负载均衡,选中一个微服务后发起远程调用。

消费者如何获取服务提供者的具体信息

  • 服务提供者在启动时会像 Eureka 注册自己的信息。Eureka 保存这些信息。消费者根据服务名称像 Eureka 拉去提供者信息。

如果多个服务提供者,消费者如何选择

  • 消费者利用负载均衡算法,从服务列表中挑选一个

消费者如何感知提供者的健康状态

  • 提供者每隔30秒像 EurekaServer 发送心跳请求,报告健康状态。Eureka 会跟新服务列表信息,心跳不正常会被剔除。消费者就可以拉取到最新的信息。

如何搭建 Eureka 服务

  • 导入依赖

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    
  • 配置 Eureka

    端口、服务名称、地址信息可以根据自己的实际需求去进行修改

    server:
      # 注册端口是因为 eureka 自己也是微服务
      port: 10086
    
    # 这里是作为 eureka 微服务的注册,为了以后多个 eureka 微服务能互相通信
    spring:
      application:
        # 配置的是 eureka的服务名称
        name: eureka-server
    eureka:
      client:
        service-url:
          # 配置的是 eureka 的地址信息
          defaultZone: http://127.0.0.1:10086/eureka
    
  • 开启 Eureka 微服务

    在引导类上添加注解@EnableEurekaServer

    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaServer {
        public static void main(String[] args) {
            SpringApplication.run(EnableEurekaServer.class, args);
        }
    
    }
    
  • 通过配置的地址跳转到对应的页面说明成功

    image-20220516233931679

Eureka 服务初始化会注册自己吗

  • 会的,Eureka 会注册自己。

    从下图可以看出,在初始话的时候会把自己注册到 Eureka 当中。

    image-20220516234357358

如何创建 Eureka 注册中心

  • 持续更新