SpringCloud笔记(1)—Eureka服务注册中心

项目开发练习涉及的模块

  • Eureka:负责服务发现相关。Eureka Server/Client、高可用、服务发现机制。
  • Config:负责统一配置中心。Config Server/Client、SpringCloudBus+RabibtMQ实现配置自动刷新。
  • Ribbon:服务通信。RestTemplate和Feign通信方法、Ribbon实现原理。
  • Zuul:APIgateWay。动态路由、校验。
  • Hystrix:熔断机制。Hystrix Dashboar熔断机制。
  • 容器编排:Docker+Rancher
  • 服务追踪:SpringCloud Sleuth + Zipkin
  • 环境参数:SpringBoot2.0.0M3,SpringCloud Finchley.M2(可在官网查看SpringCloud和SpringBoot版本对应关系。实际上操作中,使用的是 SpringBoot 2.0.6.RELEASE,SpringCloud Finchley.SR2)。

微服务概念

  • 由一系列微小的服务共同组成。
  • 在自己的进程中运行,互不干扰。
  • 每个服务为独立的业务开发。
  • 独立部署,每个服务可以独立部署。
  • 分布式的管理。(微服务是一种架构风格)

涉及的架构形态

  • 单体架构。优点:容易测试;容易部署。缺点:开发效率低;代码维护困难;部署不灵活;扩展性不够;稳定性差。
  • 基于AJAX前后端分离。
  • 分布式(水平扩展&服务拆分)。旨在支持应用程序和服务的开发,可以利用物理架构 由多个自治的处理元素不共享主内存,但通过网络发送消息合作。(集群:例如厨房多个员工一起炒菜。分布式:例如厨房多个员工,一个洗菜,一个切菜,一个炒菜。)

微服务架构的基础框架/组件

  • 服务注册与发现。
  • 服务网关(Service Gateway)。
  • 后端通用服务(中间层服务:启动时将地址信息注册到服务注册表)。
  • 前端服务(边缘服务:查询注册表,发现和调用后端服务;对后端服务进行裁剪(基于不同设备将1个API数据的详细情况进行控制等)和聚合(将多个API进行集合)再暴露给不同的设备)。

微服务架构实现途径

阿里系:Dubbo-服务化治理;Zookeeper-服务注册中心;SpringMVC或SpringBoot。
SpringCloud全家桶:SpringCloud Netflix Eureka;SpringBoot。

SpringCloud概念

是什么

  • SpringCloud是一个开发工具集,包含多个子项目;
  • 利用SpringBoot的开发便利,实现了服务注册、服务注册与发现、负载均衡、数据监控、RestAPI发布方式等等;
  • 主要是基于对NetFlix开源组件的进一步封装。

作用:简化了分布式开发。

Spring Cloud Eureka

概念

  • 基于Netflix EureKa进行了二次封装。
  • 由两个组件组成:Eureka Server 注册中心——供服务注册的服务器;Eureka Client服务注册——简化与服务器的交互,提供服务的故障切换支持。(eureka是一个服务注册中心,并且其本身也是一个服务,需要被注册到自身应用中。)
  • 主要功能是 提供 服务的注册 与 发现。

构建Eureka服务注册中心 —— Eureka Server

    1. 新建Spring Initializer——>应用名:eureka——>添加依赖:Spring Cloud Discovery—EurekaServer——>项目位置选择:自定义空文件夹\eureka。

    2. 在pom.xml中将SpringBoot版本和SpringCloud版本修改成文章开头设定的版本:


    org.springframework.boot
    spring-boot-starter-parent
    2.0.0.M3
     



	Finchley.M2



    
        
            org.springframework.cloud
            spring-cloud-dependencies
            ${spring-cloud.version}
            pom
            import
        
    

    3. 启动类中添加注解:@EnableEurekaServer,声明注册中心的功能。

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}

    4.  启动项目(由于服务没被注册,会报错,但没关系),访问:http://IP:端口/,即可进入注册中心。为了将自身服务注册到自身应用中,可以添加如下配置到application.yml配置文件中:本例中项目启动后访问—— http://localhost:8761/ 进入Eureka服务注册中心。

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
    register-with-eureka: false # 注册的应用服务列表中不显示自己本身(自身也是个服务)
  server:
    enable-self-preservation: false # 自我保护机制关闭
spring:
  application:
    name: eureka
server:
  port: 8761

    5. 在cmd中使用命令:maven clean package -Dmaven.test.skip=true 打包项目,使其不依赖idea,可以独立运行。运行命令:java -jar eureka-0.0.1.SNAPSHOT.jar  即可启动项目。也可以 后台启动。若在后台运行,启动后关闭的命令如下(管理员模式打开cmd):tasklist | findstr  "java";查看java线程的PID。杀死线程:taskkill  /pid  12123  /f  (win系统也可在任务管理器中杀死java线程)。即可关闭项目。(linux:ps -ef | grep jarName.jar    kill  -9  pid)

构建一个Eureka服务注册中心 —— Eureka Client

    1. 新建Spring Initializer——>应用名:client——>添加依赖:Spring Cloud Discovery—EurekaDiscovery——>项目位置选择:自定义文件夹\client。

    2. pom依赖中统一SpringBoot和SpringCloud的版本。然后在application.yml中进行服务注册的如下配置(不配置则不能被注册到EurekaServer服务注册中心)。并且还需要在项目启动类中添加服务发现注解@EnableDiscoveryClient

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
spring:
  application:
    name: client

    3. 启动项目,然后前往 服务注册中心(http://localhost:8761/)查看。实际项目启动时,一直失败,添加web依赖后才启动成功。成功后可以看到 Application表单中已经有了新增加的client服务。


      org.springframework.boot
      spring-boot-starter-web

    4. Eureka页面中红字(EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE)的出现原因:https://cloud.tencent.com/developer/article/1152507。server通过心跳机制检查client端,判断其是否还在线上运行。当client不在线上运行时,保护机制仍会视为在线(如下图已关闭client应用)。在开发环境中,最好关闭该模式。在server端的applicaton.yml配置中配置:server: enable-self-preservation: false。(结果启动服务后又tm出现红字:THE SELF PRESERVATION MODE IS TURNED OFF.THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.cou!我这强迫症哦!)

SpringCloud笔记(1)—Eureka服务注册中心_第1张图片

    5. 除Eureka-server外,其他创建的所有业务服务都是eureka的客户端,(例如:商品管理模块、订单管理模块等),即其他的springboot项目都是eureka的客户端,都需要配置yml将服务注册到eureka中,在启动类中添加@EnableDiscoveryClient注解。

Eureka的高可用

    1. 高可用:为避免服务宕机,可以创建多个Eureka服务注册中心,通过之间的相互注册创建联系。(使用不同的端口启动eureka服务端即可实现多服务注册,修改application.yml的注册地址即可实现相互创建联系)。
    2. 创建两个测试类:

SpringCloud笔记(1)—Eureka服务注册中心_第2张图片

    3. 在启动application1时,将application.yml的注册地址修改成 eureka: client: service-url: defaultZone: http://localhost:8762/eureka。然后在启动application2时,将application.yml的注册地址端口修改为 8761.即可模拟启动两个eureka的服务端。启动成功后,分别访问 localhost:8761和localhost:8762即可进入两个服务的注册中心。
    4. 启动eureka的客户端。虽然client的注册端口仍然是8761,但是client会被两个eureka注册。因为被8761的服务同步了。此时挂掉eureka1,eureka2和client都不会受到影响。从而实现了高可用。但是若重启了client,则client会报错,因为请求注册的地址服务已经不在了。但由于心跳机制,eureka2中注册的客户端仍然存在,也只是服务的“自我欺骗”。
    5. 为了实现eureka挂掉一个,client重启也不会受到影响,那么只需要每次都将client注册到两个eureka服务中即可。修改client的application.yml配置:(此时挂掉任何一个eureka服务都不会被影响了。)

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/
spring:
  application:
    name: client

    6. 如果是三个eureka,那么需要eureka的服务两两相互注册,客户端也需要注册三个eureka服务中心。(服务端:8761端口的注册到8762和8763,8762的端口注册到8761和8763,8763端口的注册到8761和8762。客户端注册到8761、8762、8763)。

SpringCloud笔记(1)—Eureka服务注册中心_第3张图片

 

总结

  1. @EnableEurekaServer、@EnableDiscoveryClient两个注解分别注解服务端和客户端的启动类。
  2. eureka具有心跳检测机制、健康检查机制、负载均衡等功能。
  3. Eureka的高可用,在生产环境上建议至少两台以上(三台或大于三台,以保证项目的稳定运行)。
  4. 分布式系统中,服务注册中心是最重要的基础部分。
  5. Eureka采用的是客户端发现方式。(服务端发现服务:Nginx,Zookeeper,Kubernetes)。
  6. SpringCloud的服务调用方式:http的Restful风格接口。

微服务特点:由一系列微小的服务共同组成;单独部署,运行在自己的进程中;每个服务为独立的业务开发;分布式管理。(异构——不同编程语言、不同类型的数据库。)

不适合使用微服务框架的业务形态:系统中包含很多强事务的场景;业务相对稳定成熟,迭代周期长;访问压力小,可用性要求不高。

康威定律和微服务:任何组织在设计一套系统(广义概念的系统)时,所交付的设计方案在结构上都与该组织的沟通结构保持一致。简而言之:沟通的问题会影响系统的设计。

源码

其他相关博客以供学习和参考:https://blog.csdn.net/qq_35275233/article/details/89041647

你可能感兴趣的:(SpringCloud学习笔记)