Springcloud

来自小能手俱乐部
Gaozehao讨论 | 贡献2021年9月1日 (三) 09:06的版本
跳到导航 跳到搜索

Spring Cloud是什么

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。 Spring Cloud正是对Netflix的多个开源组件进一步的封装而成,同时又实现了和云端平台,和Spring Boot开发框架很好的集成。 Spring Cloud是一个相对比较新的微服务框架,2016年才推出1.0的release版本. 虽然Spring Cloud时间最短, 但是相比Dubbo等RPC框架, Spring Cloud提供的全套的分布式系统解决方案。 Spring Cloud 为开发者提供了在分布式系统(配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token,全居琐,leader选举,分布式session,集群状态)中快速构建的工具,使用Spring Cloud的开发者可以快速的启动服务或构建应用、同时能够快速和云平台资源进行对接。

生成缩略图出错:无法找到文件

从上图可以看出Spring Cloud各个组件相互配合,合作支持了一套完整的微服务架构。

  • Eureka负责服务的注册与发现,很好将各服务连接起来。
  • Hystrix 负责监控服务之间的调用情况,连续多次失败进行熔断保护。
  • Hystrix dashboard,Turbine 负责监控 Hystrix的熔断情况,并给予图形化的展示。
  • Spring Cloud Config 提供了统一的配置中心服务。
  • 当配置文件发生变化的时候,Spring Cloud Bus 负责通知各服务去获取最新的配置信息。
  • 所有对外的请求和服务,我们都通过Zuul来进行转发,起到API网关的作用。
  • 最后我们使用Sleuth+Zipkin将所有的请求数据记录下来,方便我们进行后续分析。

Spring Cloud从设计之初就考虑了绝大多数互联网公司架构演化所需的功能,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等。这些功能都是以插拔的形式提供出来,方便我们系统架构演进的过程中,可以合理的选择需要的组件进行集成,从而在架构演进的过程中会更加平滑、顺利。

Spring Cloud快速入门

搭建配置一个服务提供者

众所周知,SpringCloud构建微服务是基于SpringBoot开发的。

  1. 创建一个SpringBoot工程,并且添加SpringBoot的相关依赖;
  2. 创建服务提供者的访问方法,也就是后续消费者如何访问提供者。
  3. Spring Cloud是基于rest的访问,所以我们添加一个Controller,在该Controller中提供一个访问入口:
    @RestController
    public class HelloController {
        @RequestMapping(value = "/hello", method = RequestMethod.GET)
        public String hello() {
            return "Hello Spring Cloud";
        }
    }
    
  4. 启动运行该SpringBoot程序,访问该controller。

搭建配置一个服务消费者

  1. 创建一个SpringBoot工程,并且添加SpringBoot的相关依赖。
  2. 开发一个消费者方法,去消费服务提供者提供的服务,这个消费者方法也是一个Controller:
    @RestController
    public class ConsumerController {
        @Autowired
        private RestTemplate restTemplate;
        @RequestMapping(value="/cloud/hello")
        public String helloController() {
            return restTemplate.getForEntity("http://localhost:9100/hello", String.class).getBody();
        }
    }
    
  3. 启动该SpringBoot程序,测试服务消费者调用服务提供者。

走进服务注册中心Eureka

在微服务架构中,服务注册与发现是核心组件之一,手动指定每个服务是很低效的,Spring Cloud提供了多种服务注册与发现的实现方式,例如:Eureka、Consul、Zookeeper。

服务注册

服务注册:将服务所在主机、端口、版本号、通信协议等信息登记到注册中心上。

服务发现

服务发现:服务消费者向注册中心请求已经登记的服务列表,然后得到某个服务的主机、端口、版本号、通信协议等信息,从而实现对具体服务的调用。

Eureka是什么

Eureka是一个服务治理组件,它主要包括服务注册和服务发现,主要用来搭建服务注册中心;

Eureka 是一个基于 REST 的服务,用来定位服务,进行中间层服务器的负载均衡和故障转移;

Eureka是Netflix 公司开发的,Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现,也就是说Spring Cloud对Netflix Eureka 做了二次封装;

Eureka 采用了C-S(客户端/服务端)的设计架构,也就是Eureka由两个组件组成:Eureka服务端和Eureka客户端。Eureka Server 作为服务注册的服务端,它是服务注册中心,而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server服务端,并维持心跳连接,Eureka客户端是一个Java客户端,用来简化与服务器的交互、负载均衡,服务的故障切换等;

有了Eureka注册中心,系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。

搭建与配置Eureka服务注册中心

Spring Cloud要使用Eureka注册中心非常简单和方便,Spring Cloud中的Eureka服务注册中心实际上也是一个Spring Boot工程,我们只需通过引入相关依赖和注解配置就能让Spring Boot构建的微服务应用轻松地与Eureka进行整合。

  1. 创建一个SpringBoot项目,并且添加SpringBoot的相关依赖;
  2. 添加eureka的依赖:
    <!--Spring Cloud的eureka-server起步依赖-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    
  3. 在Spring Boot的入口类上添加一个@EnableEurekaServer注解,用于开启Eureka注册中心服务端;
  4. 在application.properties文件中配置Eureka服务注册中心信息:
    #内嵌定时tomcat的端口
    server.port=8761
    #设置该服务注册中心的hostname
    eureka.instance.hostname=localhost
    #由于我们目前创建的应用是一个服务注册中心,而不是普通的应用,默认情况下,这个应用会向注册中心(也是它自己)注册它自己,设置为false表示禁止这种自己向自己注册的默认行为
    eureka.client.register-with-eureka=false
    #表示不去检索其他的服务,因为服务注册中心本身的职责就是维护服务实例,它不需要去检索其他服务
    eureka.client.fetch-registry=false
    #指定服务注册中心的位置
    eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka
    
  5. 启动SpringBoot程序,main方法运行。通过浏览器地址访问注册中心。

向Eureka服务注册中心注册服务

我们前面搭建了服务提供者项目,接下来我们就可以将该服务提供者注册到Eureke注册中心,步骤如下:

  1. 在该服务提供者中添加eureka的依赖,因为服务提供者向注册中心注册服务,需要连接eureka,所以需要eureka客户端的支持;
    <!--SpringCloud集成eureka客户端的起步依赖-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    
  2. 在Spring Boot的入口函数处,通过添加@EnableEurekaClient注解来表明自己是一个eureka客户端,让我的服务提供者可以连接eureka注册中心;
  3. 配置服务名称和注册中心地址;
    spring.application.name=02-springcloud-service-provider
    eureka.client.service-url.defaultZone=http://localhost:8761/eureka
    
  4. 启动服务提供者SpringBoot程序的main方法运行;
  5. 启动运行之后,通过在浏览器地址栏访问我们之前搭建好的eureka注册中心,就可以看到有一个服务已经注册成功了。

从Eureka服务注册中心发现与消费服务

我们已经搭建一个服务注册中心,同时也向这个服务注册中心注册了服务,接下来我们就可以发现和消费服务了,这其中服务的发现由eureka客户端实现,而服务的消费由Ribbon实现,也就是说服务的调用需要eureka客户端和Ribbon两者配合起来才能实现。

Eureka客户端是什么

Eureka客户端是一个Java客户端,用来连接Eureka服务端,与服务端进行交互、负载均衡,服务的故障切换等。

Ribbon是什么

Ribbon是一个基于HTTP 和 TCP 的客户端负载均衡器,当使用Ribbon对服务进行访问的时候,它会扩展Eureka客户端的服务发现功能,实现从Eureka注册中心中获取服务端列表,并通过Eureka客户端来确定服务端是否己经启动。Ribbon在Eureka客户端服务发现的基础上,实现了对服务实例的选择策略,从而实现对服务的负载均衡消费。


接下来我们来让服务消费者去消费服务:

我们前面搭建了服务消费者项目,接下来我们就可以使用该服务消费者通过注册中心去调用服务提供者,步骤如下:

  1. 在该消费者项目中添加eureka的依赖,因为服务消费者从注册中心获取服务,需要连接eureka,所以需要eureka客户端的支持;
    <!--SpringCloud集成eureka客户端的起步依赖-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    
  2. 在Spring Boot的入口函数处,通过添加@EnableEurekaClient注解来表明自己是一个eureka客户端,让我的服务消费者可以使用eureka注册中心;
  3. 配置服务的名称和注册中心的地址:
    spring.application.name=03-springcloud-web-consumer
    eureka.client.service-url.defaultZone=http://localhost:8761/eureka
    
  4. 前面我介绍了服务的发现由eureka客户端实现,而服务的真正调用由ribbon实现,所以我们需要在调用服务提供者时使用ribbon来调用:
    @LoadBalanced
    @Bean
    public RestTemplate restTemplate () {
        return new RestTemplate();
    }
    
    加入了ribbon的支持,那么在调用时,即可改为使用服务名称来访问:
    restTemplate.getForEntity("http://01-SPRINGCLOUD-SERVICE-PROVIDER/cloud/hello", String.class).getBody();
    
  5. 完成上面的步骤后,我们就可以启动消费者的SpringBoot程序,main方法运行;
  6. 启动成功之后,通过在浏览器地址栏访问我们的消费者,看是否可以正常调用远程服务提供者提供的服务。