定义
Spring Cloud是一系列框架的有序集合。
Spring Cloud Eureka、Spring Cloud Ribbon、Spring Cloud Feign、Spring Cloud Hystrix、Spring Cloud Config、Spring Cloud Zuul、Spring Cloud Bus
它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 Spring Boot
的开发风格做到一键启动和部署。
1.基于Spring
Spring Boot基于Spring,所以Spring有的优点Spring Boot也有,不需要开发人员去学习一个全新的框架,学习门槛相对降低。
2. 快速编码
Spring Boot的依赖包都是基于maven的pom文件提供的,而Spring Boot本身就集成了特别多的第三方框架。以前开发Spring应用时,需要用到的第三方框架的库都需要开发人员一个一个去寻找;现在不需要了,有些可能只需引入一个pom.xml,就能把大量需要用到的第三方库自动引入到项目中。所以减少了开发工作量,实现快速编码。
3. 模块化
基于Spring Boot开发的项目可以非常简单的实现模块化编程,这样的话可以非常有效的实现项目的分工合作,减少开发过程中的代码冲突。模块化编程还可以非常高效的实现减少代码的改动量,按需修改模块,降低生产发生事故概率。
4. 配置简单
在文章开头就说了Spring Boot摈弃了繁琐的xml配置文件,大量的配置文件经常是导致生产事故的原因。Spring Boot大量采用yml形式的配置文件再加上相应的Annotation,从而大大减少了配置文件的个数,因为以前的Spring应用引入一个第三方框架说不定就要添加一个配置文件。举个例子,比如项目中要引入数据库连接池HikariCP,就需要添加一个关于HikariCP数据库连接池的配置文件,但是使用了Spring Boot采用HikariCP可能就只需要那么几行配置就可以了,因为Spring Boot默认集成HikariCP数据库连接池,提供了很多默认的配置。
5. 便捷部署
Spring Boot天生就是为了简单、快捷部署而生。SpringBoot内嵌了Tomcat,不需要额外部署应用服务器Tomcat,只需简单一个Java运行环境即可,而且启动的命令也非常简单:java –jar xxx-release.jar。同时Spring Boot结合现在非常火的技术 Docker、Kubernetes可以快速实现集群部署。
6. 有效监控
Spring Boot集成了非常高效的监控框架,只要简单引入对spring-boot-start-actuator的依赖,就可以实现对服务性能的监控。结合Spring Cloud就可以实现对整个微服务链路的全天候监控
Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
核心组件
Spring Cloud Netflix组件
组件名称 作用
Eureka 服务注册中心
Ribbon 客户端负载均衡
Feign 声明式服务调用
Hystrix 客户端容错保护
Zuul API服务网关
Spring Cloud Alibaba组件
组件名称 作用
Nacos 服务注册中心
Sentinel 客户端容错保护
Spring Cloud原生及其他组件
组件 作用
Consul 服务注册中心
Config 分布式配置中心
Gateway API服务网关
Sleuth/Zipkin 分布式链路追踪
自己搭建一个服务调用可能存在的问题包括、
1、将微服务的请求路径硬编码到Java代码中
2、对微服务调用的负载均衡(一个微服务为了实现高可用,往往有多个节点,一个请求过来,哪一个节点来响应)
3、加入API网关(方便前端调用,不需要知道不同服务的地址)
4、配置的统一管理(每一个服务都有一个配置,比较繁琐)
5、链路追踪(为了方便日志管理,一个请求走了那些服务)
上面的组件就是为了解决这些问题而存在的
注册中心
1. 服务发现: 服务注册/反注册:保存服务提供者和服务调用者的信息 服务订阅/取消订阅:服务调用者订阅服务提供者的信息,好有实时推送的功能 服务路由(可选):具
有筛选整合服务提供者的能力。
2. 服务配置: 配置订阅:服务提供者和服务调用者订阅微服务相关的配置 配置下发:主动将配置推送给服务提供者和服务调用者
3. 服务健康检测 检测服务提供者的健康情况
服务提供者与服务消费者概念
服务提供者:服务的被调用方(即,为其他服务提供服务的服务);
服务消费者:服务的调用方(即,依赖其他服务的服务);
对于多个服务既可以作为服务的提供方也可以作为消费者,关注业务本身、服务拆解、服务架构、服务划分等
使用eureka的步骤
1.搭建eureka server
1.1创建工程
1.2导入坐标
1.3配置application.yml
1.4配置启动类
2.将服务提供者注册到eureka server上
2.1引入eureka client 的坐标
2.2修改application.yml添加eureka server的信息
2.3修改启动类,添加服务发现的支持(可选)
@EnableEurekaClient
@EnableDiscoveryClient二选一,新版本可不写
3.服务消费者通过注册中心获取服务列表,并调用
Eureka的元数据有两种:标准元数据和自定义元数据。
标准元数据:主机名、IP地址、端口号、状态页和健康检查等信息,这些信息都会被发布在服务注 册表中,用于服务之间的调用。
自定义元数据:可以使用eureka.instance.metadata-map配置,符合KEY/VALUE的存储格式。这 些元数据可以在远程客户端中访问
3.1引坐标
3.2改配置
3.3在controller中注入restTemplate对象
@RestController
@RequestMapping("/order")
public class OrderController {//注入restTemplate对象@Autowiredprivate RestTemplate restTemplate;/*** 注入DiscoveryClient :* springcloud提供的获取原数组的工具类* 调用方法获取服务的元数据信息**/@Autowiredprivate DiscoveryClient discoveryClient;/*** 基于ribbon的形式调用远程微服务* 1.使用@LoadBalanced声明RestTemplate* 2.使用服务名称替换ip地址*/@RequestMapping(value = "/buy/{id}",method = RequestMethod.GET)public Product findById(@PathVariable Long id) {Product product = null;product = restTemplate.getForObject("http://service-product/product/1",Product.class);return product;}}
@RequestMapping(value = "/buy/{id}",method = RequestMethod.GET)public Product findById(@PathVariable Long id) {//调用discoveryClient方法//已调用服务名称获取所有的元数据List instances = discoveryClient.getInstances("service-product");//获取唯一的一个元数据ServiceInstance instance = instances.get(0);//根据元数据中的主机地址和端口号拼接请求微服务的URLProduct product = null;URI url=URI.create(instance.getUri()+"/product/1");//如何调用商品服务?product = restTemplate.getForObject("http://"+instance.getHost()+":"+instance.getPort()+"/product/1",Product.class);return product;}
两种方式,注意使用下面这种方式时,启动类中不要添加@LoadBlanced注解
3.4启动类中添加restTemplate
@SpringBootApplication
@EntityScan("cn.itcast.order.entity")
public class OrderApplication {/*** 使用spring提供的RestTemplate发送http请求到商品服务* 1.创建RestTemplate对象交给容器管理* 2.在使用的时候,调用其方法完成操作 (getXX,postxxx)* * @LoadBalanced : 是ribbon提供的负载均衡的注解*/@LoadBalanced@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}public static void main(String[] args) {SpringApplication.run(OrderApplication.class,args);}
}
Eureka 高可用