微服务就是把原本臃肿的一个项目的所有模块拆分开来并做到互相没有关联,甚至可以不使用同一个数据库。 比如:项目里面有User模块和Power模块,但是User模块和Power模块并没有直接关系,仅仅只是一些数据需要交互,那么就可以把这2个模块单独分开来,当user需要调用power的时候,power是一个服务方,但是power需要调用user的时候,user又是服务方了, 所以,他们并不在乎谁是服务方谁是调用方,他们都是2个独立的服务,这时候,微服务的概念就出来了。
谈到区别,我们先简单说一下分布式是什么,所谓分布式,就是将偌大的系统划分为多个模块(这一点和微服务很像)部署到不同机器上(因为一台机器可能承受不了这么大的压力或者说一台非常好的服务器的成本可能够好几台普通的了),各个模块通过接口进行数据交互,其实 分布式也是一种微服务。 因为都是把模块拆分开来变为独立的单元,提供接口来调用,那么 他们本质的区别在哪呢? 他们的区别主要体现在“目标”上, 何为目标,就是你这样架构项目要做到的事情。 分布式的目标是什么? 我们刚刚也看见了, 就是一台机器承受不了的,或者是成本问题 , 不得不使用多台机器来完成服务的部署, 而微服务的目标 只是让各个模块拆分开来,不会被互相影响,比如模块的升级亦或是出现BUG等等...
讲了这么多,可以用一句话来理解:分布式也是微服务的一种,而微服务他可以是在一台机器上。
微服务只是一种项目的架构方式,或者说是一种概念,就如同我们的MVC架构一样, 那么Spring-Cloud便是对这种技术的实现。
微服务只是一种项目的架构方式,如果你足够了解微服务是什么概念你就会知道,其实微服务就算不借助任何技术也能实现,只是有很多问题需要我们解决罢了例如:负载均衡,服务的注册与发现,服务调用,路由。。。。等等等等一系列问题,所以,Spring-Cloud 就出来了,Spring-Cloud将处理这些问题的的技术全部打包好了,就类似那种开袋即食的感觉。。
因为spring-cloud是基于spring-boot项目来的,所以我们项目得是一个spring-boot项目。这里要注意的一个点是spring-cloud的版本与spring-boot的版本要对应如下:
Spring Cloud | Spring Boot |
---|---|
Angel版本 | 兼容Spring Boot 1.2.x |
Brixton版本 | 兼容Spring Boot 1.3.x,也兼容Spring Boot 1.4.x |
Camden版本 | 兼容Spring Boot 1.4.x,也兼容Spring Boot 1.5.x |
Dalston版本、Edgware版本 | 兼容Spring Boot 1.5.x,不兼容Spring Boot 2.0.x |
Finchley版本 | 兼容Spring Boot 2.0.x,不兼容Spring Boot 1.5.x |
Greenwich版本 | 兼容Spring Boot 2.1.x |
Spring Cloud | Spring Boot |
---|---|
Dalston.RC1 | 1.5.2.RELEASE |
Edgware.RELEASE | 1.5.9.RELEASE |
Finchley.BUILD-SNAPSHOT | 2.0.2.RELEASE |
Finchley.RELEASE | 2.0.3.RELEASE |
注意:SpringBoot与SpringCloud需要版本对应,否则可能会造成很多意料之外的错误,比如eureka注册了结果找不到服务类啊,比如某些jar导入不进来啊,等等这些错误。上面列出来springBoot和spring cloud的版本对应关系,需要配套使用,才不会出现各种奇怪的错误。
spring cloud各个版本之间是有所区别的,比如在SpringCloud中,1.X和2.X版本在pom.xml中引入的jar包名字都不一样,比如有的叫spirng-cloud-starter-hystrix 有的叫spring-cloud-netflix-hystrix,维护起来会比较困难。
spring-cloud-dependencies 版本列表可查看:
https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies
spring-boot-starter-parent 版本列表可查看:
https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent
1.x版本pom.xml里几个基本用到的jar长这样:
4.0.0
com.joyce
joyce-test
1.0
jar
org.springframework.boot
spring-boot-starter-parent
1.5.9.RELEASE
org.springframework.cloud
spring-cloud-dependencies
Edgware.RELEASE
pom
import
UTF-8
org.springframework.cloud
spring-cloud-starter-feign
org.springframework.cloud
spring-cloud-starter-hystrix
org.springframework.cloud
spring-cloud-starter-zipkin
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-tomcat
org.springframework.boot
spring-boot-starter-jetty
org.springframework.cloud
spring-cloud-starter-ribbon
org.springframework.boot
spring-boot-starter-test
test
而在2.x版本中,比如我们需要eureka,去maven仓库中可能会看到deprecated, please use spring-cloud-starter-netflix-eureka-client这类提示,包括使用ribbon也会有。
所以个人猜测2.x中统一用spring-cloud-starter-netflix-xx 替换了原有的 spring-cloud-starter-xx,所以2.x的版本pom.xml类似如下这样:
4.0.0
com.forezp
service-feign
0.0.1-SNAPSHOT
jar
service-feign
Demo project for Spring Boot
com.forezp
sc-f-chapter3
0.0.1-SNAPSHOT
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-openfeign
在我这里我的版本是这样的:
spring-boot:
org.springframework.boot
spring-boot-starter-parent
2.0.2.RELEASE
spring-cloud:
org.springframework.cloud
spring-cloud-dependencies
Finchley.SR2
pom
import
当你项目里面有这些依赖之后,你的spring cloud项目已经搭建好了(初次下载spring-cloud可能需要一点时间)