飞天班第26节:SpringCloud(上)

2020/04/25

1、宏观了解SpringCloud

前提要懂的技术栈:Mybatis、Spring、SpringMVC、SpringBoot、Vue、Maven、Git、

JSON、Ajax

开发框架:

Spring:(IOC  AOP  Template模版化)
		Spring 是一个轻量级的开源Java框架,IOC容器,目的:解决企业级开发的复杂性问题(粘合剂)
		随着时间的推移...越来越复杂了,需要简化
SpringBoot:脚手架
  	不是新东西,Spring的升级版
  	新一代JavaEE开发标准
  	自动配置
  	约定大于配置
    基于SpringBoot 我们可以快速开发我们的应用
    (单体)-----》(微服务)  业务逻辑实际没有发生变化,是架构产生变化
    基于SpringBoot 也可以开发独立的微服务,通过RestTemplate互相访问,通过注册中心把微服务管			理起来。

微服务架构:(新架构)

核心思想:拆分,模块化!
单体:
	单体是一台机器,所有东西都是部署在一个电脑上!
	访问:直接访问项目即可,方法是本地调用本地方法

微服务:
	很多个服务,部署一般在多台服务器上!
	多个服务被代理,访问代理(nginx访问代理)
	对内RPC,对外RestFul

微服务架构的4个核心问题:
	- 客户端怎么访问服务?
	- 服务之间如何通信?
	- 服务如何治理?
	- 服务挂了怎么办?j > 解决方案
1、SpringCloud是一个生态,并不是一个技术,其中包含很多技术
	SpringCloud Netflix 一站式解决方案,上面的4个核心问题,他都可以解决
	Api网关:zuul
	通信:Feign->HttpClient http的通信方式,同步并阻塞的
	服务注册与发现: Eureka
	熔断机制: Hystrix
	
	2018年底 ,Netflix 宣布无限期停止维护
	
2、Apache Dubbo + Zookeeper
	api网关: 没有,借助别人的
	Dubbo: 基于Java 的高性能的Rpc通信框架,异步非阻塞的
	服务注册与发现: Zookeeper(动物园管理者)
	熔断机制: 没有,借助Hystrix

3、SpringCloud Alibaba,一站式解决方案,上面的4个核心问题,他都可以解决

本质:
	- API网关,路由
	- Http,RPC 通信方式,服务调用
	- 服务注册与发现,高可用
	- 熔断机制,服务降级 (网络是不可靠的)

最新概念:服务网格,下一代服务标准,ServerMesh

代表解决方案:istrio ,未来要掌握的。

2、微服务概述

引用ThougthWorks公司的科学家Martin Fowler在2014年提出的一段话:

原文:https://martinfowler.com/articles/microservices.html

汉化: https://www.cnblogs.com/liuning8023/p/4493156.html

微服务架构是一种架构模式,或者说一种架构风格,它提倡将单一的应用程序划分一组小的服务,每个服务运行在其独立的自己的进程内,服务之间互相协调,互相配置,为用户提供最终价值。

服务之间采用轻量级的通信机制互相沟通,每个服务都围绕具体的业务进行构建,并且能够被独立的部署到生产环境中。应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言,工具进行构建,可以有一个非常轻量级的集中式管理来协调这些服务,可以使用不同的语言来编写服务,也可以使用不同的数据存储。

​ 微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底的去耦合,每个服务提供单一业务功能,一个服务做一件事情,从技术角度看就是一种小而独立的处理过程,类似进程的概念,能够自行单独启动和销毁,拥有自己的独立数据库

微服务与微服务架构

服务

​ 强调的服务的大小,关注的是某一个点,是具体解决一个问题,提供落地对应服务的一个服务应用,狭义的看,可以是IDEA中的一个微服务工程或者Module

微服务架构

​ 一种新的架构形式,2014年Martin Fowler提出

微服务优缺点

  1. 每个服务足够内聚,小,代码容易理解,聚焦一个指定的业务功能;
  2. 开发简单,开发效率高,一个服务可能只是专一的干一件事
  3. 微服务能被小团队单独开发,2-5个人
  4. 微服务事松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的
  5. 微服务能使用不同的语言开发
  6. 易于和第三方集成,微服务允许容易且灵活的方式集成自动部署
  7. 微服务易于被一个开发人员理解,修改和维护,这样小团队能关注自己的工作成果,无需通过合作才能体现价值
  8. 微服务允许你利用融合最新技术
  9. 微服务只是业务逻辑的代码,不会和html、css或其他界面混合
  10. 每个微服务都有自己的存储能力,可以有自己的独立数据库,也可以统一数据库

缺点

  • 开发人员要处理分布式系统的复杂性
  • 随着服务的增加,运维的压力也在增大
  • 服务间通信成本
  • 数据一致性
  • 系统集成测试
  • 性能监控

微服务技术栈有哪些

目的 落地技术
服务开发 SpringBoot,Spring
服务注册与发现 Eureka、Consul、Zookeeper、Nacos
服务调用 Rest 、RPC、gRPC
服务熔断器 Hystrix、Envoy等
负载均衡 Ribbon、Nginx等
服务接口调用(客户端调用服务的简化工具) Feign
消息队列 Kafka、RabbitMQ、ActiveMQ、RocketMQ
服务配置中心管理 SpringCloudConfig、Nacos、Chef等
服务路由(Api网关) Zuul、SpringCloud gateway
服务监控 Zabbix、Nagios
服务部署 Docker、Kubernetes
数据流操作开发包 SpringCloud Stream(封装Redis、RabbitMQ、Kafka等)
消息总线 SpringCloud Bus

​ SpirngCloud,基于SpringBoot提供的一套微服务解决方案,包括服务注册与发现、配置中心、链接监控,服务网关,负载均衡,断路器,路由等组件,除了基于netflix开源组件做流抽象封装外,还有一些选项中立的开源组件,是各个微服务架构落地技术的集合体,俗称微服务全家桶。

​ SpringBoot并没有重复造轮子,它只是将目前各家公司开发比较成熟的服务框架组合起来,通过SpringBoot风格进行封装,屏蔽了复杂的配置和实现原理,最终给开发者留出了一套简单易懂,易部署易维护的分布式系统开发工具包。

SpringBoot 专注于快速、方便的开发单个个体微服务,SpringCloud关注全局的服务治理框架,依赖SpringBoot

面试题:Dubbo 和 SpringCloud的对比

  Dubbo SpringCloud
服务注册中心 Zookeeper Eureka
服务调用方式 RPC REST API (HTTP)
服务监控 Dubbo-monitor Spring Boot Admin
断路器 不完善 Hystrix
服务网关 Zuul、Gateway
分布式配置 SpringCloud Config
服务跟踪 SpringCloud Sleuth
消息总线 SpringCloud Bus
数据流 SpringCloud Stream
批量任务 SpringCloud Task

最大区别:SpringCloud抛弃了Dubbo的RPC通信,采用基于HTTP的Rest方式

REST相比RPC更为灵活,服务提供者和服务调用者不存在代码级别的强依赖,这在强调快速演化的微服务环境下,显得更加合适。

解决问题领域不一样:Dubbo的定位是一款RPC框架(远程服务本地调用),Spring Cloud的目标是微服务架构下的一站式解决方案

SpringCloud版本

SpringCloud 是一个由很多独立子项目组成的大型综合项目,每个子项目有不同的发行节奏,都维护着自己的发布版本号,为避免与子项目的发布版本号混淆,采用伦敦地铁站的名称来命名版本,根据字母表的顺序来对应时间顺序,SpringBoot需要与SpringCloud版本对应

SpringCloud 中文 SpringBoot大版本 SpringBoot代表 备注
Angel,2015-3 发布 安吉尔 1.2.x 1.2.8  
Brixton,2016-5 布里克斯顿 1.3.x 1.3.8  
Camden,2016-9 卡梅登 1.4.x 1.4.2  
Dalston,2017-4 达斯顿 1.5.x 1.5.x 常用
Edgware, 艾奇韦尔 1.5.x 1.5.19  
Finchley,2018-6 芬奇利 2.0.x 2.0.8 常用
Greenwich,2019-1 格林威治 2.1.x 2.1.2 常用
Hoxton 霍克斯顿 2.2.x 2.2.6 最新

版本说明

SNAPSHOT 快照版,可以稳定使用,且仍在继续改进版本。

PRE preview edition, 预览版,内部测试版. 主要是给开发人员和测试人员测试和找BUG用的,不建议使用;

RC Release Candidate,发行候选版本,基本不再加入新的功能,主要修复bug。是最终发布成正式版的前一个版本,将bug修改完就可以发布成正式版了。

SR Service Release,表示bug修复 修正版或更新版,修正了正式版推出后发现的Bug。

GA General Availability,正式发布的版本,官方开始推荐广泛使用,国外有的用GA来表示release版本。

Spring Boot版本格式:主版本号.子版本号.修正版本号:

如:SpringBoot 2.1.5

其中2: 表示的主版本号,表示是我们的SpringBoot第二代产品。 其中1: 表示的是次版本号,增加了一些新的功能但是主体的架构是没有变化的 其中5: 表示的是bug修复版。 所以2.1.5合起来就是springboot的第二代版本的第1个小版本的第5次bug修复版本。

3、Eureka

服务注册与发现

基本原理,C/S架构

Dubbo的服务调用架构

构建Eureka Serve端

1、导入依赖

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

2、编写配置文件

server:
  port: 7001

eureka:
  instance:
    hostname: localhost # 实例名称,
  client:
    registerWithEureka: false   # 不需要检索自己
    fetchRegistry: false  # 是否将自己注册到注册中心,服务端不需要注册自己
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ # 注册中心地址,多个注册中心用,分隔

spring:
  application:
    name: eureka-server

3、启动类

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

构建Eureka Client端

1、导入依赖

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2、编写配置文件

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:7001/eureka/

3、启动类

@SpringBootApplication
@EnableEurekaClient // Eureka客户端,专用注解
public class ConsumerDeptApplication {
	public static void main(String[] args) {
		SpringApplication.run(ConsumerDeptApplication.class,args);
	}
}

完善服务注册信息

导入依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

编写配置文件

info:
  app.name: edu服务提供者
  company.name: jude
  build.artifactId: @project.artifactId@
  build.version: @project.version@

Eureka的自我保护机制

某一时刻,某一服务不能使用了,eureka不会立刻清理,但依旧会保持微服务的实例信息。

  • 心跳检测,微服务每30秒向eureka server发送心跳, eureka server若90s之内都没有收到某个客户端的心跳,则认为此服务出了问题, 会从注册的服务列表中将其删除,并通知订阅它的客户端更新服务列表, 而且还会通知其他eureka server更新此信息

  • eureka server保护机制,通过打卡开关,默认开启,可以让eureka server处于保护状态,主要是用于某eureka server由于网络或其他原因,导致接收不到其他微服务的心跳,此时不能盲目的将其他微服务从服务列表中删除。 具体规则:如果一段时间内,85%的服务都没有发送心跳,则此server进入保护状态,此状态下,可以正常接受注册,可以正常提供查询服务,但是不与其他server同步信息,也不会通知订阅它的客户端,这样就不会误杀其他微服务

不建议关闭,如果要关闭
eureka.server.enable-self-preservation = false # 默认true

参考 eureka缓存细节以及生产环境的最佳配置

Eureka Server端配置

# 中小规模下,自我保护模式坑比好处多,所以关闭它
eureka.server.enableSelfPreservation=false
# 心跳阈值计算周期,如果开启自我保护模式,可以改一下这个配置
## eureka.server.renewalThresholdUpdateIntervalMs=120000

# 主动失效检测间隔,配置成5秒
eureka.server.evictionIntervalTimerInMs=5000

# 心跳间隔,5秒
eureka.instance.leaseRenewalIntervalInSeconds=5
# 没有心跳的淘汰时间,10秒
eureka.instance.leaseExpirationDurationInSeconds=10

# 禁用readOnlyCacheMap
eureka.server.useReadOnlyResponseCache=false

服务提供者和clinet配置

## 心跳间隔,5秒
eureka.instance.leaseRenewalIntervalInSeconds=5
## 没有心跳的淘汰时间,10秒
eureka.instance.leaseExpirationDurationInSeconds=10

# 定时刷新本地缓存时间
eureka.client.registryFetchIntervalSeconds=5
# ribbon缓存时间
ribbon.ServerListRefreshInterval=2000

服务发现,服务列表

微服务从注册中心获取的服务列表

// 通过服务发现来获得这个服务的信息
@Autowired
private DiscoveryClient client;

@GetMapping("/discovery")
public Object discovery(){
  // 获得微服务列表清单
  List<String> list = client.getServices();
  System.out.println("client.getServices()==>"+list);
  // 得到具体的微服务
  List<ServiceInstance> instances = client.getInstances("SPRINGCLOUD-PROVIDER-DEPT");

  for (ServiceInstance instance : instances) {
    System.out.println(
      instance.getServiceId() + "\t" +
      instance.getHost() + "\t" +
      instance.getPort() + "\t" +
      instance.getUri() + "\t"
    );
  }
  return this.client;
}

主启动类添加注解@EnableDiscoveryClient

@SpringBootApplication
@EnableEurekaClient // 本服务启动之后,就会自动注册到 Eureka 中
@EnableDiscoveryClient // 显示定义服务发现
public class DeptProvider8001 {
    public static void main(String[] args) {
        SpringApplication.run(DeptProvider8001.class,args);
    }
}

Post Directory