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提出
微服务优缺点
- 每个服务足够内聚,小,代码容易理解,聚焦一个指定的业务功能;
- 开发简单,开发效率高,一个服务可能只是专一的干一件事
- 微服务能被小团队单独开发,2-5个人
- 微服务事松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的
- 微服务能使用不同的语言开发
- 易于和第三方集成,微服务允许容易且灵活的方式集成自动部署
- 微服务易于被一个开发人员理解,修改和维护,这样小团队能关注自己的工作成果,无需通过合作才能体现价值
- 微服务允许你利用融合最新技术
- 微服务只是业务逻辑的代码,不会和html、css或其他界面混合
- 每个微服务都有自己的存储能力,可以有自己的独立数据库,也可以统一数据库
缺点
- 开发人员要处理分布式系统的复杂性
- 随着服务的增加,运维的压力也在增大
- 服务间通信成本
- 数据一致性
- 系统集成测试
- 性能监控
微服务技术栈有哪些
目的 | 落地技术 |
---|---|
服务开发 | 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 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);
}
}