相关阅读:
SpringBoot2.X快速构建和配置
微服务就是把原本臃肿的一个项目的所有模块拆分开来并做到互相没有关联,甚至可以不使用同一个数据库。 比如:项目里面有User模块和Power模块,但是User模块和Power模块并没有直接关系,仅仅只是一些数据需要交互,那么就可以吧这2个模块单独分开来,当user需要调用power的时候,power是一个服务方,但是power需要调用user的时候,user又是服务方了, 所以,他们并不在乎谁是服务方谁是调用方,他们都是2个独立的服务,这时候,微服务的概念就出来了。
谈到区别,我们先简单说一下分布式是什么,所谓分布式,就是将偌大的系统划分为多个模块(这一点和微服务很像)部署到不同机器上(因为一台机器可能承受不了这么大的压力或者说一台非常好的服务器的成本可能够好几台普通的了),各个模块通过接口进行数据交互,其实 分布式也是一种微服务。 因为都是吧模块拆分开来变为独立的单元,提供接口来调用,那么 他们本质的区别在哪呢? 他们的区别主要体现在“目标”上, 何为目标,就是你这样架构项目要做到的事情。 分布式的目标是什么? 我们刚刚也看见了, 就是一台机器承受不了的,或者是成本问题 , 不得不使用多台机器来完成服务的部署, 而微服务的目标 只是让各个模块拆分开来,不会被互相影响,比如模块的升级亦或是出现BUG等等…
讲了这么多,可以用一句话来理解:分布式也是微服务的一种,而微服务他可以是在一台机器上。
微服务只是一种项目的架构方式,或者说是一种概念,就如同我们的MVC架构一样, 那么Spring-Cloud便是对这种技术的实现。
我们刚刚说过,微服务只是一种项目的架构方式,如果你足够了解微服务是什么概念你就会知道,其实微服务就算不借助任何技术也能实现,只是有很多问题需要我们解决罢了例如:负载均衡,服务的注册与发现,服务调用,路由。。。。等等等等一系列问题,所以,Spring-Cloud 就出来了,Spring-Cloud将处理这些问题的的技术全部打包好了,就类似那种开袋即食的感觉。。
将自己的项目进行拆分就可以,比如这里我们拆分UserServer,PowerServer,OrderServer,相互之间通过http进行通信但是,我们这样的架构会出现很多问题的,比如,1.UserServer,PowerServer,OrderServer三个服务器任何一个或者多个罢工我们是不知道,
2.如果PowerSever处理的效率比较低,承受的并发量比较低,就导致整个系统的并发量一起下降…问题都会慢慢找来了
这是大致的springcloud封装了各个的组件进行来替我们解决微服务在项目中可能遇到的问题的解决方案,不然这些全靠我们自己去开发解决,开发成本太高了
这个地方顺便说下负载均衡的原理:
这么升级使系统能够承受20w的并发量,至于后面8081,8082是按照什么策略进行分配:有很多策略:比如轮询,hashIp,权重,等等后面专题介绍
X 表示停更,√表示现在使用的,红色圈起来的 是最近比较流行的,我们后面需要重点学习的,停更不停用我们还可以用,尤其设计思想更值得我们学习
Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的开发便利性简化了分布式系统的开发,比如服务发现、服务网关、服务路由、链路追踪等。Spring Cloud 并不重复造轮子,而是将市面上开发得比较好的模块集成进去,进行封装,从而减少了各模块的开发成本。换句话说:Spring Cloud 提供了构建分布式系统所需的“全家桶”。其实就好比某米买个芯片,买个显示屏,自己再造点壳子组装成手机
因为spring-cloud是基于spring-boot项目来的,所以我们项目得是一个spring-boot项目,至于spring-boot项目,可以参考springboot快速搭建环境这节我们先不讨论,这里要注意的一个点是spring-cloud的版本与spring-boot的版本要对应下图:
详细版本对照可以参考官网: https://start.spring.io/actuator/info 这里强烈要求一定按照版本对照关系进行搭建环境,否则环境问题绝对够你喝一壶的
这里稍等我先搭建一个springboot项目
还是简单的罗列下吧!后面我会把源码附上的
添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
启动类
@SpringBootApplication
public class UserApp {
public static void main(String[] args) {
SpringApplication.run(UserApp.class,args);
}
}
controller
@RestController
public class UserController {
@RequestMapping("/getUser.do")
public R getUser(){
return R.success().set("user","zhangsan");
}
}
5.3 添加spring cloud支持
spring boot
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
spring cloud
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
我这里使用 都是最高版本,开发中根据时间情况自己考虑,没必要用这么高的版本
当你项目里面有这些依赖之后,你的spring cloud项目已经搭建好了(初次下载spring-cloud可能需要一点时间)
eureka是Netflix的子模块之一,也是一个核心的模块,eureka里有2个组件,一个是EurekaServer(一个独立的项目) 这个是用于定位服务以实现中间层服务器的负载平衡和故障转移,另一个便是EurekaClient(我们的微服务) 它是用于与Server交互的,可以使得交互变得非常简单:只需要通过服务标识符即可拿到服务。
Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现(可以对比Zookeeper)。
Eureka 采用了 C-S 的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中心。
而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。SpringCloud 的一些其他模块(比如Zuul)就可以通过 Eureka Server 来发现系统中的其他微服务,并执行相关的逻辑。
客户端:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
服务端:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
添加相关依赖
当然不管是服务端还是客户端都需要添加springCloud的支持
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
服务端配置信息:yml或者properties文件都可以
server:
port: 3000
eureka:
server:
enable-self-preservation: false #关闭自我保护机制
eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000)
instance:
hostname: localhost
client:
registerWithEureka: false #不把自己作为一个客户端注册到自己身上
fetchRegistry: false #不需要从服务端获取注册信息(因为在这里自己就是服务端,而且已经禁用自己注册了)
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
自我保护机制 这里展开一下,
定义:
当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。
简单理解:当一个服务和Eureka失联后,Eureka认为这个服务的问题,当大部分服务都失联(网络中断)这个时候Eureka不再认为是服务的问题,就怀疑人生,感觉是自己出现了问题,不再清除,跟新任何服务注册列表中的数据
意义:
自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留),也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的健壮、稳定
出现这个页面就证明搭建成功, 这个警告是因为自我保护机制关闭的原因,先不关了
server:
port: 8082
eureka:
client:
serviceUrl:
defaultZone: http://localhost:3000/eureka #eureka服务端提供的注册地址 参考服务端配置的这个路径
instance:
instance-id: user-1 #此实例注册到eureka服务端的唯一的实例ID
prefer-ip-address: true #是否显示IP地址
leaseRenewalIntervalInSeconds: 10 #eureka客户需要多长时间发送心跳给eureka服务器,表明它仍然活着,默认为30 秒 (与下面配置的单位都是秒)
leaseExpirationDurationInSeconds: 30 #Eureka服务器在接收到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除,默认为90秒
spring:
application:
name: client-user #此实例注册到eureka服务端的name
然后在客户端的spring-boot启动项目上 加入注解:@EnableEurekaClient 就可以启动项目了 这里就不截图了我们直接来看效果图:
这里我们能看见 名字叫server-power的(图中将其大写了) id为 power-0的服务 注册到我们的Eureka上面来了 至此,一个简单的eureka已经搭建好了。
eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000)
leaseRenewalIntervalInSeconds: 10 #eureka客户需要多长时间发送心跳给eureka服务器,表明它仍然活着,默认为30 秒 (与下面配置的单位都是秒)
leaseExpirationDurationInSeconds: 30 #Eureka服务器在接收到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除,默认为90秒
每10秒给我发一个心跳,如果没发就等待30秒,不然定期(4000ms)进行清理,这就好比一个美女有很多追求者,需要管理这些追求者,美女怎么知道这些追求者是否移心别恋了,需要定期给美女放电,如果超过约定的时间,最多等待多久,这里主要考虑,网络抖动,而不是服务器自己真的挂了,如果说是因为其他的事情导致的放电失败,我可以最多宽容你多久,把那些超过等待时间的定期进行清理