Spring Cloud 从入门到精通

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
简介: 搞清一个概念,spring cloud并不是一种技术,它是一种设计思想的落地方案;

先搞清一个概念,spring cloud并不是一种技术,它是一种设计思想的落地方案;


spring cloud组件


注册中心:zookeeper、eureka、nacos

服务调用/负载均衡:ribbon、nginx、feign、openFeign

服务熔断/降级:Hystrix(Netflix)、Sentinel(阿里中间件团队)

网关:zuul、gateway

配置中心:spring cloud config+spring cloud bus


怎么使用


基本所有的组件使用方法都是基于注解,开启+使用的模式,在使用组件的地方加上对应注解,如@FeignClient 注解,然后在启动类上加EnAble***注解,如EnAbleFeignClient 注解


各组件的作用

注册中心


以eureka为例,eureka分为服务端和客户端,客户端每30秒向eureka服务器发送心跳连接,以此来表明本服务还存活,若服务端连续三个心跳周期(90秒)没有收到某客户端发来的心跳链接,则会将其从服务列表剔除;客户端和服务端通过json/xml进行通讯,服务端会每30秒去服务端更新一次服务列表;底层使用restTemplate;


eureka使用

添加依赖->增加yml配置->主启动类增加eureka注解(eureka服务器EnableEurekaServer,eureka服务EnableEurekaClient)

20210122155149603.png

20210122155155555.png

20210122155208607.png

20210122155215494.png


eureka集群:

2021012215523115.png

负载均衡/服务调用


以ribbon为例,ribbon为负载均衡组件,跟nginx不同,nginx运行在服务端,将所有请求集中起来进行负载均衡;ribbon运行在消费端,算法和nginx相似但更强大,除了有nginx的轮询、加权轮询(10轮若还没结果就返回null),还支持随机策略、重试策略,默认轮询;ribbon只能做负载均衡,不能服务调用(依然得用restTemplate,先new restTemplate对象,调用postForObject方法传入请求url、入参、返回结果类型.class,postForObject只需要传入请求url+入参,和返回结果),显然ribbon太麻烦,所以有了feign和openFeign(在feign基础上增加对springMVC注解的支持),用@FeignClient 注解服务提供者的名称,在controller层即可像调用service一样调用服务;

ribbon:把注册中心的服务列表缓存到本地,discoveryClient.getInstances(“CLOUD-PAYMENT-SERVICE”);

ribbon不需要额外添加依赖也可以使用,因为eureka和ribbon有一腿,eureka客户端依赖自带了ribbon的引用,ribbon的负载均衡算法有好几种,最常用的是轮询,具体算法实现就是

当前请求次数%服务端对应服务列表数量

@Component
public class MyLB implements LoadBalancer {
private AtomicInteger atomicInteger = new AtomicInteger(0);
//坐标
private final int getAndIncrement(){
  int current;
  int next;
  do {
  current = this.atomicInteger.get();
  next = current >= 2147483647 ? 0 : current + 1;
  }while (!this.atomicInteger.compareAndSet(current,next)); //第一个参数是期望值,第二个参数是修改值是
  System.out.println("*******第几次访问,次数next: "+next);
  return next;
}
@Override
public ServiceInstance instances(List<ServiceInstance> serviceInstances) { //得到机器的列表
  int index = getAndIncrement() % serviceInstances.size(); //得到服务器的下标位置
  return serviceInstances.get(index);
  }
}

openFeign有个超时访问时间,需要在yml文件里面配置,默认为一秒,如果消费者端一秒内没得到服务提供者的响应,直接返回大白页(服务超时)

openFeign还可以做日志打印,需要新建一个类,用openFeign的logger


服务熔断/降级


比如A服务需要调用B服务,B又需要调用C,如果C在某一时刻崩了,所有请求都怼在C这儿阻塞着,B拿不到返回值,就有可能一直自旋或轮询反复请求,B也会崩,以此类推A也会崩,阻塞线程多了,服务器资源被占用完了整个系统就崩了,为了避免这种服务雪崩,就有了Hystrix,它可以做服务熔断或降级,如果某个时间段内,某请求的失败率达到某个阈值,Hystrix就会切断这种请求,直接给用户返回失败(熔断)或者友好提示(降级,通过@HystrixCommand注解指定降级服务名,如下图);

20210122160205724.png

网关

为了安全、用户体验,有时候我们需要对路由进行管理(统一前缀、策略配置、服务名屏蔽、路径屏蔽);

或者对用户请求进行过滤,比如每两秒只接一个请求;

20210122160320696.png

20210122160330753.png

20210122160335409.png

20210122160342195.png

20210122160347615.png

服务配置中心


每个服务都有自己的配置,我们不可能一个服务一个服务的去修改,而且这样会老是重启服务,spring cloud config就是把所有配置整合到一个地方进行统一管理(git或者svn),但是这样有个坏处,运行中的服务配置修改后不会立马更新,所以有了spring cloud bus消息总线,作用就是管理和广播分布式系统中的消息,有了 Spring Cloud Bus 之后,我们只需要创建一个简单的请求,并且加上 @ResfreshScope 注解就能进行配置的动态修改了;

20210122160428306.png

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
20天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
38 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
4月前
|
XML Java 测试技术
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
这篇文章介绍了Spring5框架的三个新特性:支持@Nullable注解以明确方法返回、参数和属性值可以为空;引入函数式风格的GenericApplicationContext进行对象注册和管理;以及如何整合JUnit5进行单元测试,同时讨论了JUnit4与JUnit5的整合方法,并提出了关于配置文件加载的疑问。
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
|
20天前
|
消息中间件 监控 Java
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
31 6
|
20天前
|
Java 关系型数据库 MySQL
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
39 5
|
20天前
|
缓存 监控 Java
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
31 5
|
17天前
|
Java 数据库连接 数据库
从入门到精通---深入剖析Spring DAO
在Java企业级开发中,Spring框架以其强大的功能和灵活性,成为众多开发者的首选。Spring DAO(Data Access Object)作为Spring框架中处理数据访问的重要模块,对JDBC进行了抽象封装,极大地简化了数据访问异常的处理,并能统一管理JDBC事务。本文将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring DAO,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
21 1
|
21天前
|
监控 Java 数据安全/隐私保护
如何用Spring Boot实现拦截器:从入门到实践
如何用Spring Boot实现拦截器:从入门到实践
38 5
|
2月前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
2月前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
34 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
|
2月前
|
Java API Spring
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中过滤器的基础知识和实战项目应用的教程。
36 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
下一篇
DataWorks