SpringCloud及相关技术入门
SpringCloud简介
SpringCloud是Spring旗下的项目之一,官网地址:http://projects.spring.io/spring-cloud/
Spring最擅长的就是集成,把世界上最好的框架拿过来,集成到自己的项目中。
SpringCloud也是一样,它将现在非常流行的一些技术整合到一起,实现了诸如:配置管理,服务发现,智能路由,负载均衡,熔断器,控制总线,集群状态等等功能。其主要涉及的组件包括:
- Eureka:服务治理组件,包含服务注册中心,服务注册与发现机制的实现。(服务治理,服务注册/发现)
- Zuul:网关组件,提供智能路由,访问过滤功能
- Ribbon:客户端负载均衡的服务调用组件(客户端负载)
- Feign:服务调用,给予Ribbon和Hystrix的声明式服务调用组件 (声明式服务调用)
- Hystrix:容错管理组件,实现断路器模式,帮助服务依赖中出现的延迟和为故障提供强大的容错能力。(熔断、断路器,容错)
微服务
- itcast-service-provider:一个提供根据id查询用户的微服务。
- itcast-service-consumer:一个服务调用者,通过RestTemplate远程调用itcast-service-provider。
项目中存在什么问题?
- 在consumer中,我们把url地址硬编码到了代码中,不方便后期维护
- consumer需要记忆provider的地址,如果出现变更,可能得不到通知,地址将失效
- consumer不清楚provider的状态,服务宕机也不知道
- provider只有1台服务,不具备高可用性
- 即便provider形成集群,consumer还需自己实现负载均衡
其实上面说的问题,概括一下就是分布式服务必然要面临的问题:
- 服务管理
- 如何自动注册和发现
- 如何实现状态监管
- 如何实现动态路由
- 服务如何实现负载均衡
- 服务如何解决容灾问题
- 服务如何实现统一配置
以上的问题,我们都将在SpringCloud中得到答案。
1.引入组件的启动器
2.覆盖默认配置
3.在引导类上添加注解,开启相关组件
下面对以上技术以及一个发展进行一个详细说明:
微服务发展路程及相关技术的优缺点
了解微服务之前,先来了解一下垂直拆分和水平拆分的概念
垂直拆分:功能拆分【也就是微服务项目的拆分方式】
水平拆分:分层web ,service ,mapper【也就是传统项目的拆分方式】
传统项目(非微服务)
缺点:
1.单点故障问题
2.并发能力弱,并发数低
3.代码的耦合度高
优点:
维护简单
分布式架构
优点:
1.方便水平扩展
2.方便单独优化
3.解耦合
4.提高并发
缺点:
1.增加维护成本
2.代码冗余,重复开发
3.调用关系错综复杂
4.维护困难
1.架构的演变
传统架构–》水平拆分–》垂直拆分(最早的分布式架构)–》SOA(面向服务)–》微服务(SpringCloud)
2.远程调用技术,rpc,http
rpc协议:自定义数据格式,限定技术,传输速度快、效率高 (传输层) 【dubbo】
http协议:统一的数据格式,不限定技术rest接口 tcp() 【SpringCloud】
3.什么是springCloud
微服务架构的一种解决方案,是很多组件的集合。
eureka:注册中心,服务的注册与发现
zuul:网关组件,路由、过滤请求(ribbon hystrix)
ribbon:负载均衡组件
hystrix:熔断组件
feign:远程调用组件(集成ribbon hystrix)
4.eureka
Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能
Eureka组件
Eureka包含两个组件:Eureka Server和Eureka Client。
Eureka Server
Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka Server本身也是一个服务,默认情况下会自动注册到Eureka注册中心。如果搭建单机版的Eureka Server注册中心,则需要配置取消Eureka Server的自动注册逻辑。毕竟当前服务注册到当前服务代表的注册中心中是一个说不通的逻辑。Eureka Server通过Register、Get、Renew等接口提供服务的注册、发现和心跳检测等服务。
Eureka Client
Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。
Eureka Client分为两个角色,分别是:
1.Application Service(Service Provider)
2.Application Client(Service Consumer)
Application Service
服务提供方,是注册到Eureka Server中的服务。
Application Client
服务消费方,通过Eureka Server发现服务,并消费。
在这里,Application Service和Application Client不是绝对上的定义,因为Provider在提供服务的同时,也可以消费其他Provider提供的服务;Consumer在消费服务的同时,也可以提供对外服务
5.hystrix:容错组件
Hystix解决雪崩问题的手段有两个:
- 线程隔离
- 服务熔断
局部方法加熔断
@HystrixCommand(fallbackMethod = "queryUserByIdFallback")
全局方法加熔断
@DefaultProperties(defaultFallback = "fallbackMethod")
Hystix降级:检查每次请求,是否请求超时,或者连接池已满
1.引入hystrix启动器
2.熔断时间,默认1s, 6s
3.在引导类上添加一个注解,@EnablecircuitBreaker @SpringCloudApplication
4.定义熔断方法
1)局部:要和被熔断的方法返回值和参数列表一致
2) 全局:返回值类型要和被熔断的方法一致,参数列表必须为空
5.@HystrixCommand(fallbackMethod=“局部熔断方法名”):声明被熔断的方法
6.@DefaultProperties(defaultFallback = “fallbackMethod”) //定义全局的熔断方法
Hystix熔断:不再发送请求
1.close:闭合状态,所有请求正常方法
2.open:打开状态,所有请求都无法访问。如果在一定时间内容,失败的比例不小于50%或者次数不少于20次
3.halfopen:半开状态,打开状态默认5秒休眠期,在休眠期所有请求无法正常访问,过了休眠期会进入半开状态,放部分通过
6.feign
1.引入openFeign启动器
2.feign.hystrix.enable=true, 开启fegin的熔断功能
3.在引导类上 @EnableFeignClients
4.创建一个接口,在接口添加@FeignClient(value=服务id“,fallback=实现类的.class)
5.在接口中定义一些方法,这些方法的书写方式跟之前controller类似
6.创建一个熔断类,实现feign接口,实现对应的方法,这些实现方法就是熔断方法。
7.zuul
1.引入zuul的启动器
2.配置
(1)
zuul.routes.<路由名称>.path=/service-provider/**
zuul.routes.<路由名称>.url=http://localhost:8082
(2)
zuul.routes.<路由名称>.path=/service-provider/**
zuul.routes.<路由名称>.serviceId=service-provider
(3)
zuul.routes.服务名=/service-provider/**
(4) 不用配置默认就是服务id开头路径
3.@EnableZuulProxy
8.ribbon:负载均衡组件
1.eureka已集成
2.@LoaderBalanced开启负载均衡
3.this.restTemplate.getForObject(“http://service-provider/user/ +id ,User.class”)
过滤器:
创建一个类集成ZuulFilter基类
重写四个方法
filterType :pre,route,post,error
filterOrder: 返回值越小优先级越高
shouldFilter: 是否执行run方法。true执行
run:具体的拦截逻辑
持续更新中…