微服务是分布式架构的一种,所以说分布式架构是将服务进行拆分,而拆分的过程当中会产生各种各样的问题。
微服务是一种经过良好架构设计的分布式架构方案,目的是:实现高内聚,低耦合,降低服务之间影响。
特征:
优点: 拆分力度更小、服务更独立、耦合度更低
缺点: 架构复杂、运维、监控、部署难度高。
而SpringCloud仅仅是解决了拆分的服务治理问题,至于分布式其他的问题并没有解决方案。
Dubbo技术:在2012年阿里巴巴将Dubbo技术就已经开源了。但它并不是严格意义上的微服务技术。注册中心是用的zookeeper,其实zookeeper主要是做集群管理。
dubbo核心是:用Dubbo协议进行服务远程调用。
配置中心和服务网关都没有实现。
服务监控和服务保护是用的:dubbo-admin,它的功能比较单一,只是来统计一下调用时的相应时间。
SpringCloud并不是发明了什么东西,而是把各个公司的开源技术进行了一个整合。从而形成了一套完整的技术体系。所以说SpringCloud技术比较完善。
注册中心:有专业的Eureka。
服务远程调用:用的是基于http协议标准的Feign技术。比如说Controller中遵循Restful接口。
配置中心:SpringCloudConfig
服务网关:SpringCloudGateway遵循了响应式编程,吞吐能力比较强。
服务保护:Hystrix是一个比较强大的服务保护技术。可以实现服务隔离、熔断等。
SpringCloudAlibaba形成一套完整的技术栈。实现了自己的注册中心、自己的配置中心、自己的服务监控等等组件。
它是以SpringCloud开头,是SpringCloud的一部分。它是实现了springCloud标准接口,统一的接口规范,所以用起来跟SpringCloud没有什么学习成本。
注册中心: Nacos强大之处在于,既支持Dubbo调用,又支持Feign调用。也就是说在一个微服务中既支持支持Dubbo接口,也支持Feign接口。
也就是说SpringCloudAlibaba兼容Dubbo和SpringCloud两种架构。
微服务第一件事就是:拆分。
传统的单体架构,所有的业务逻辑写在一起,随着业务越来越复杂,代码也变得耦合严重,升级维护就很困难。
拆分会根据业务逻辑模块,将单体的项目,拆分成多个独立的项目。每个项目完成一部分业务功能。将每一个独立的项目称之为“服务”。一个大型的互联网项目,往往有数百上千的服务。从而成为服务集群。
而一个业务往往需要多个服务共同完成。当业务越来越多,越来越复杂,服务之间的调用关系就会越来越复杂。–》从而有了注册中心。
注册中心就可以记录微服务中的,每个服务的ip、端口。当服务A想调用服务B的时候,它不需要自己去记录服务B的IP。只需要去找服务中心即可。从注册中心去拉取服务信息。从而每个服务越来越多,每个服务都有自己的配置文件,如果更改配置就得逐一去更改吗? -》从而有了配置中心。
统一的管理整个服务群里整千上百的配置,如果有配置需要变更,只需要去配置中心进行更改即可。更改后,配置中心会通知相关的微服务,实现配置的热更新。当微服务跑起来以后,用户就可以访问了。-》从而有了服务网关。
因为微服务中有很多服务,用户不知道该访问哪一个服务,并且也不是随意访问某一个服务。
所以功能是:【校验身份、请求路由、负载均衡】
当用户访问微服务时,就会对数据库进行操作,并且将数据库的信息返回给用户。由于用户超级多,那么数据库很少,从而有了高并发,从而加入了缓存。
缓存:数据库数据放到内存当中。内存的查询效率会比磁盘(数据库)查询效率高很多。那么也会将缓存作为集群。 用户简单请求先到缓存,缓存未命中,再去数据库。那么还会有复杂的搜索功能,而海量的复杂搜索必须交给分布式搜索。
而数据库的功能:数据的写操作、事务类型对安全要求较高的操作。
复杂的搜索功能,而海量的复杂搜索必须交给分布式搜索。是因为缓存中的空间有限,不适合海量的数据存储。
异步通信的消息队列组件,对于分布式的服务,业务往往跨越多个服务。例如一个请求来了,先调用A,在调用B…。从而整个业务的链路就很长,调用时长就等于 调用每个服务的时长之和。从而会导致性能的下降。
异步通信的意思是:当请求来了,调用了服务A,A并不是去调用服务B和C,而是发一条消息,通知B和C去工作。然后服务A结束工作。从而业务链路变短了。从而相应时间变短了。从而异步通信可以提高服务的并发,例如在一些秒杀高并发的场景下,就可以去利用了。
那么如此庞大的服务,运行的过程当中,如果出现了问题非常不好排查,从而就有了两个组件:分布式日志组件、
分布式日志组件:整个集群当中的服务日志,进行统计、存储、分析。将来出现了问题容易定位。
实时监控整个集群当中,每一个服务节点的运营状态,CPU的负载,占用情况。一旦出现任何问题,直接可以定位到具体的方法。从而快速定位信息。
成千上万的微服务,那么还需要人工去一点点部署吗?微服务集群还需要进行自动化部署,JenKiins工具
可以对微服务项目进行自动化编译,基于doker进行打包,形成镜像。
在基于KBS、RANCHER,去实现自动化部署。
自动化部署,JenKiins工具,doker进行打包,形成镜像,KBS、RANCHER,去实现自动化部署
SpringCloud底层基于SpringBoot做了自动装配功能。所以说版本有一个兼容性问题。每一个SpringCloud版本都对应的SpringBoot版本。
https://spring.io/projects/spring-cloud#overview
LEARN中
选择SpringCloud具体版本,点击 Reference Doc.
查看对应spring Boot的具体版本。cloud:Hoxton.SR10
boot:2.3.9.RELEASE
Alibaba Cloud:2.2.6.RELEASE
mysql:5.1.47
mybatis:2.1.1
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.3.9.RELEASEversion>
<relativePath/>
parent>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
<java.version>1.8java.version>
<spring-cloud.version>Hoxton.SR10spring-cloud.version>
<mysql.version>5.1.47mysql.version>
<mybatis.version>2.1.1mybatis.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>2.2.6.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>${mysql.version}version>
dependency>
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
<version>${mybatis.version}version>
dependency>
dependencies>
dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
dependencies>