SpringCloud项目简介
springCloud是基于SpringBoot的一整套实现微服务的框架。他提供了微服务开发所需的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等组件。最重要的是, 跟spring boot框架一起使用的话,会让你开发微服务架构的云服务非常好的方便。
一、springCloud架构
1.Eureka 服务注册中心
注册:每个服务都向Eureka登记自己提供服务的元数据,包括服务的ip地址、端口号、版本号、通信协议等。
eureka将各个服务维护在了一个服务清单中(双层Map,第一层key是服务名,第二层key是实
例名,value是服务地址加端口)。同时对服务维持心跳,剔除不可用的服务,eureka集群各节点相互注册每个实例中都有一样的服务清单。
发现:eureka注册的服务之间调用不需要指定服务地址,而是通过服务名向注册中心咨询,并获取所有服务实例清单(缓存到本地),然后实现服务的请求访问。
eureka控制台
eureka控制台页面直接访问eureka部署对应的IP+端口即可
2.Ribbon负载均衡
服务间发起请求的时候,基于Ribbon做负载均衡,从⼀个服务的多台机器中选择⼀台 (被调
用方的服务地址有多个),Ribbon也是通过发起http请求,来进行的调用,只不过是通过调用服务名的地址来实现的。虽然说Ribbon不用去具体请求服务实例的ip地址或域名了,但是每调用一个接口都还要手动去发起Http请求。
以下为代码实例:
@RestController
public class ConsumerController {
@Autowired
RestTemplate restTemplate;
@GetMapping("/ribbon-consumer")
public String helloConsumer(){
return
restTemplate.getForEntity("http://exampleservice/index",String.class).getBody();
}
}
3.feign
声明式服务调用,基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求 ,简化服务间的调用。其原理于mybatis对dao接口生成动态代理机制一致。
在Ribbon的基础上进行了进一步的封装,单独抽出了一个组件,就是Spring Cloud Feign。
在引入Spring Cloud Feign后,我们只需要创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定。
1.Feign是一个声明式的http客户端,使用Feign可以实现声明式REST调用。spring cloud为Feign整合了Eureka、Ribbon,以提供服务发现及负载均衡等能力,同时整合了SpringMVC注解
2.Feign默认使用SpringMVC注解提供契约来进行REST访问,例如@RequestMapping,@PathVariable等。
总的来说Feign就是高度封装了基于RESTful协议请求的客户端,而不用开发者自己手写请求协议请求服务
@RestController
public class UserController {
@GetMapping("/getUser")
public String getUser(){
List<String> list = new ArrayList<>();
list.add("张三");
String json = JSON.toJSONString(list);
return json;
}
}
@FeignClient(name = "user")
public interface UserClient {
@GetMapping("/getUser")
String getUser();
}
4. Hystrix
发起请求是通过Hystrix的线程池来⾛的,不同的服务⾛不同的线程池,实现了不同服务调⽤
的隔离,通过统计接口超时次数返回默认值,实现服务熔断和降级
5.Zuul
服务网关,功能有路由分发和过滤。Zuul整合了Hystrix,Ribbon,Eureka等微服务组件。
如果前端、移动端要调⽤后端系统,统⼀从Zuul⽹关进⼊,由Zuul⽹关转发请求给对应的服务,
通过与Eureka进行整合,将自身注册为Eureka下的应用,从Eureka下获取所有服务的实例,来进行服务的路由。Zuul还提供了一套过滤器机制,开发者可以自己指定哪些规则的请求需要执行校验逻辑,只有通过校验逻辑的请求才会被路由到具体服务实例上,否则返回错误提示。
整体设计
整体流程简述如下:
1.服务请求首先到达服务网关Zuul,由zuul进行请求过滤和路由。
2.Zuul更据负载均衡路由到其中一个目的微服务如商品微服务
3.商品微服务如果依赖于其他微服务如订单微服务,则商品微服务通过feign封装的协议进行请求订单微服务,期间也会经过网关路由,如果发生超时等网络错误,会由Hystrix配置的容错策略进行相应容错处理如服务降级。
4.Ribbon更据Eureka里面注册的服务列表使用负载均衡选择一个服务提供者处理请求
5.服务提供者处理请求并范围结果
Eureka工作原理
SpringCloud Ribbon工作原理
Eureka与Ribbon整合工作原理
服务网关组件Zuul工作原理
熔断器Hystrix
熔断的原理其实就和保险丝差不多
当C服务停止的时候,B自动调用写死的数据进行回复,从而避免因为请求过多导致A服务奔溃的情况。
这样就可以保证只有调用c服务时,出现不是预期的结果,其他服务都能正常使用
断路器组件Hystrix工作原理
Hystrix监控
Hystrix Dashboard:除了隔离依赖服务的调用以外,Hystrix还提供了近实时的监控,Hystrix会实时、累加地记录所有关于HystrixCommand的执行信息,包括每秒执行多少请求多少成功,多少失败等
Turbine:在复杂的分布式系统中,相同服务的节点经常需要部署上百甚至上千个,很多时候,运维人员希望能够把相同服务的节点状态以一个整体集群的形式展现出来,这样可以更好的把握整个系统的状态。
为此,Netflix提供了一个开源项目(Turbine)来提供把多个hystrix.stream的内容聚合为一个数据源供Dashboard展示。
Turbine和Hystrix Dashboard的区别
Hystrix Dashboard一次只能监控一个微服务,而Turbine可以监控多个微服务,即监控页面可以看到多个微服务的调用情况。一般企业级应用都是使用Turbine
参考资料:
1.官方文档https://springcloud.cc/
2.面试必问的SpringCloud实现原理图https://m.imooc.com/article/23679
3.SpringCloud微服务(原理篇)https://blog.csdn.net/shinlyzsljay/article/details/79162270
4.Hystrix监控Dashboard以及Turbine聚合https://www.jianshu.com/p/33c86d81a81d