SpringCloud(一)--Eureka

spring cloud 介绍

spring cloud 是一系列框架的集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。spring cloud 并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过 spring boot 风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。

spring cloud 对于中小型互联网公司来说是一种福音,因为这类公司往往没有实力或者没有足够的资金投入去开发自己的分布式系统基础设施,使用 spring cloud 一站式解决方案能在从容应对业务发展的同时大大减少开发成本。同时,随着近几年微服务架构和 docker 容器概念的火爆,也会让 spring cloud 在未来越来越“云”化的软件开发风格中立有一席之地,尤其是在目前五花八门的分布式解决方案中提供了标准化的、一站式的技术方案,意义可能会堪比当年 servlet 规范的诞生,有效推进服务端软件系统技术水平的进步。

spring cloud 技术组成

SpringCloud(一)--Eureka_第1张图片

spring cloud是什么

  • spring cloud 是一个工具集

    • 集成多个工具,来解决微服务中的各种问题
    • 微服务全家桶
  • spring cloud 不是什么?

    • spring cloud 不是一个解决单一问题的工具
  • eureka
    微服务治理,服务注册和发现
  • ribbon
    负载均衡、请求重试
  • hystrix
    断路器,服务降级、熔断
  • feign
    ribbon + hystrix 集成,并提供声明式客户端
  • hystrix dashboard 和 turbine
    hystrix 数据监控
  • zuul
    API 网关,提供微服务的统一入口,并提供统一的权限验证
  • config
    配置中心
  • bus
    消息总线, 配置刷新
  • sleuth+zipkin
    链路跟踪

Spring Cloud 对比 Dubbo

SpringCloud(一)--Eureka_第2张图片

  • Dubbo

    • Dubbo只是一个远程调用(RPC)框架
    • 默认基于长连接,支持多种序列化格式
  • Spring Cloud

    • 框架集
    • 提供了一整套微服务解决方案(全家桶)
    • 基于http调用, Rest API
service - 服务

SpringCloud(一)--Eureka_第3张图片

  • 商品服务 item service,端口 8001
  • 用户服务 user service,端口 8101
  • 订单服务 order service,端口 8201

SpringCloud(一)--Eureka_第4张图片

commons 通用项目

新建 maven 项目

SpringCloud(一)--Eureka_第5张图片

SpringCloud(一)--Eureka_第6张图片

item service 商品服务

  1. 新建项目
  2. 配置依赖 pom.xml
  3. 配置 application.yml
  4. 配置主程序
  5. 编写代码
新建 spring boot 起步项目

SpringCloud(一)--Eureka_第7张图片

SpringCloud(一)--Eureka_第8张图片

Spring MVC 接收参数的几个注解

SpringCloud(一)--Eureka_第9张图片

user service 用户服务

  1. 新建项目
  2. 配置依赖 pom.xml
  3. 配置 application.yml
  4. 配置主程序
  5. 编写代码
spring boot 起步项目

SpringCloud(一)--Eureka_第10张图片

SpringCloud(一)--Eureka_第11张图片

order service 订单服务

  1. 新建项目
  2. 配置依赖 pom.xml
  3. 配置 application.yml
  4. 配置主程序
  5. 编写代码
spring boot 起步项目

SpringCloud(一)--Eureka_第12张图片

SpringCloud(一)--Eureka_第13张图片

Eureka

  1. 注册
    服务提供者启动时,向eureka一次次反复注册,直到注册成功为止
  2. 拉取注册表
    服务发现者每30秒拉取一次注册表(刷新注册表)
  3. 心跳
    服务提供者每30秒发送一次心跳数据
    eureka连续3次收不到一个服务的心跳,会删除这个服务
  4. 自我保护模式
    特殊情况
    如果由于网络不稳定或中断,15分钟内,85%以上服务器出现心跳异常,就会自动进入保护模式。
    在保护模式下,所有服务都不删除
    网络恢复后,可以自动退出保护模式,恢复正常
    开发期间很容易达到保护模式的条件,会影响测试,在开发期间可以关闭保护模式
注册和发现

注册中心产品:
zookeeper、eureka、nacos、consul、etcd.....
springcloud中推荐使用eureka

eureka 和 zookeeper 区别:

第一步了解关系数据库和非关系数据库遵循的原则:

RDBMS==>(MySql,Oracle,SqlServer等关系型数据库)遵循的原则是:ACID原则(A:原子性。C:一致性。I:独立性。D:持久性。)。
NoSql==> (redis,Mogodb等非关系型数据库)遵循的原则是:CAP原则(C:强一致性。A:可用性。P:分区容错性)。

第二步了解cap原则

CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。
SpringCloud(一)--Eureka_第14张图片
CAP理论也就是说在分布式存储系统中,最多只能实现以上两点。而由于当前网络延迟故障会导致丢包等问题,所以我们分区容错性是必须实现的。也就是NoSqL数据库P肯定要有,我们只能在一致性和可用性中进行选择,没有Nosql数据库能同时保证三点。(==>AP 或者 CP)

第三步总结两者区别

Zookeeper的设计理念就是分布式协调服务,保证数据(配置数据,状态数据)在多个服务系统之间保证一致性,这也不难看出Zookeeper是属于CP特性(Zookeeper的核心算法是Zab,保证分布式系统下,数据如何在多个服务之间保证数据同步)。Eureka是吸取Zookeeper问题的经验,先保证可用性。

SpringCloud(一)--Eureka_第15张图片

  • eureka:

    • 强调AP(可用性)
    • 集群结构:对等结构
  • zookeeper:

    • 强调CP(一致性)
    • 集群结构:主从结构

eureka 注册与发现

SpringCloud(一)--Eureka_第16张图片

1.创建eureka项目
2.配置依赖 pom.xml
3.配置 application.yml

---主机名
---用保护模式
---针对单台服务器,配置不向自己注册,也不从自己拉取注册表

4.主程序启用 eureka 服务器

---启动类注解 @EnableEurenaServer,通过注解触发自动配置

6.启动,访问测试

创建 eureka server 项目:sp05-eureka

SpringCloud(一)--Eureka_第17张图片

application.yml
spring:
  application:
    name: eureka-server
server:
  port: 2001 #默认8761
eureka:
  instance:
    hostname: eureka1  #主机名,集群中区分不同服务器
 server:
    enable-self-preservation: false #开发期间禁用保护模式
 client:
    register-with-eureka: false #单台服务器不向自己注册
 fetch-registry: false #单台服务器不从自己拉取
  • eureka 集群服务器之间,通过 hostname 来区分
  • eureka.server.enable-self-preservation
    eureka 的自我保护状态:心跳失败的比例,在15分钟内是否超过85%,如果出现了超过的情况,Eureka Server会将当前的实例注册信息保护起来,同时提示一个警告,一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据。也就是不会注销任何微服务
  • eureka.client.register-with-eureka=false
    不向自身注册
  • eureka.client.fetch-registry=false
    不从自身拉取注册信息
  • eureka.instance.lease-expiration-duration-in-seconds
    最后一次心跳后,间隔多久认定微服务不可用,默认90
主程序
  • 添加 @EnableEurekaServer
package cn.tedu.sp05;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@EnableEurekaServer
@SpringBootApplication
public class Sp05EurekaApplication {

    public static void main(String[] args) {
        SpringApplication.run(Sp05EurekaApplication.class, args);
    }

}
修改 hosts 文件,添加 eureka 域名映射

C:WindowsSystem32driversetchosts
添加内容:

127.0.0.1       eureka1
127.0.0.1       eureka2
启动,并访问测试

SpringCloud(一)--Eureka_第18张图片

service provider 服务提供者

SpringCloud(一)--Eureka_第19张图片

  • 修改 item-service、user-service、order-service,把微服务注册到 eureka 服务器
  1. pom.xml 添加eureka依赖
  2. application.yml 添加eureka注册配置
  3. 主程序启用eureka客户端
  4. 启动服务,在eureka中查看注册信息
pom.xml 添加 eureka 客户端依赖

右键点击项目,或点击pom.xml,用 STS 工具编辑起步依赖
添加依赖
上面的操作会在pom.xml中添加以下依赖


    org.springframework.cloud
    spring-cloud-starter-netflix-eureka-client
application.yml 添加 eureka注册配置
eureka:
  client:
    service-url:
      defaultZone: http://eureka1:2001/eureka
  • eureka.instance.lease-renewal-interval-in-seconds
    心跳间隔时间,默认 30 秒
  • defaultZone,默认位置,可以修改为具体地理位置,比如:beiJing, shangHai, shenZhen 等,表示 eureka 服务器的部署位置, 需要云服务器提供
  • eureka.client.registry-fetch-interval-seconds
    拉取注册信息间隔时间,默认 30 秒
主程序启用服务注册发现客户端

修改 item-service、user-service 和 order-service,
主程序添加 @EnableDiscoveryClient 注解可以省略

启动,并访问 eureka 查看注册信息

SpringCloud(一)--Eureka_第20张图片

eureka 和 “服务提供者”的高可用

SpringCloud(一)--Eureka_第21张图片

item-service 高可用

启动参数 --server.port 可以覆盖yml中的端口配置

配置启动参数
  • item-service-8001
--server.port=8001

SpringCloud(一)--Eureka_第22张图片

  • item-service-8002
--server.port=8002

SpringCloud(一)--Eureka_第23张图片
这样就可以省略打包过程开启多台服务器

启动测试
  • 访问 eureka 查看 item-service 注册信息

SpringCloud(一)--Eureka_第24张图片

eureka 高可用

添加两个服务器的 profile 配置文件

application-eureka1.yml
eureka:
  instance:
    hostname: eureka1
  client:
    register-with-eureka: true #profile的配置会覆盖公用配置
    fetch-registry: true #profile的配置会覆盖公用配置
    service-url: 
      defaultZone: http://eureka2:2002/eureka  #eureka1启动时向eureka2注册`
application-eureka2.yml
eureka:
  instance:
    hostname: eureka2
  client:
    register-with-eureka: true #profile的配置会覆盖公用配置
    fetch-registry: true #profile的配置会覆盖公用配置
    service-url: 
      defaultZone: http://eureka1:2001/eureka  #eureka2启动时向eureka1注册
配置启动参数 --spring.profiles.active--server.port
  • eureka1 启动参数:
--spring.profiles.active=eureka1 --server.port=2001

SpringCloud(一)--Eureka_第25张图片

  • eureka2 启动参数:
--spring.profiles.active=eureka2 --server.port=2002

SpringCloud(一)--Eureka_第26张图片

如果在命令行运行,可以在命令行中添加参数:
java -jar xxx.jar --spring.profiles.active=eureka1 --server.port=2001 
访问 eureka 服务器,查看注册信息

SpringCloud(一)--Eureka_第27张图片

SpringCloud(一)--Eureka_第28张图片

eureka客户端注册时,向两个服务器注册

修改以下微服务

  • sp02-itemservice
  • sp03-userservice
  • sp04-orderservice
eureka:
  client:
    service-url:
      defaultZone: http://eureka1:2001/eureka, http://eureka2:2002/eureka
当一个 eureka 服务宕机时,仍可以连接另一个 eureka 服务

你可能感兴趣的:(springcloud)