天天看点

SpringCloud学习笔记1 - 20181127

一.引言

  1. 什么是微服务?
  • 官方定义解释:微服务就是由一系列服务功能组成,能单独跑在自己的进程里,每个服务独立开发,独立部署,分布式的管理。
  1. 微服务特点?
  • 由一系列小服务组成
  • 独立的运行在自己的计算机进程
  • 独立部署
  • 基于分布式管理的服务
  1. 为什么会出现微服务?
  • 单体架构

    优点:易部署、易测试

    缺点:开发效率低、代码难维护、部署不灵活、稳定性不高、扩展性不高(上手难)

  • 架构的演变

    ORM(单一架构) —>MVC(垂直架构) —>RPC(分布式架构) —>SOA(流动式架构)

    SpringCloud学习笔记1 - 20181127
  1. .微服务解决方案(阿里系、SpringCloud栈)
  • 阿里系(核心技术Dubbo) ~”Dubbo死于13年,复活于17年“

    Dubbo、Zookeeper、SpringMVC or SpringBoot …

  • SpringCloud(一栈式,微服务开发) ~“栈,指全栈”

    SpringCloud Netflix Eureka、SpringBoot …

  1. 什么是SpringCloud

      SpringCloud 是一个 包括多个子项目的开发工具集,集合了众多的开源框架(简称”集合工具集 “) ,他利用SpringBoot开发的便利性,实现了很多功能,如:服务注册,负载均衡等。SpringCloud在整合过程中主要针对Netflix(耐非)开源组件的封装。

      SpringCloud的出现,真正的简化了分布式架构的开发。

  2. SpringCloud的特性

      服务注册和发现、 路由、service - to - service调用、负载均衡、 断路器

  3. 服务架构图
    SpringCloud学习笔记1 - 20181127

1.5、引言补充

  1. SpringCloud主要框架

    服务发现——Netflix Eureka

    服务调用——Netflix Feign

    熔断器——Netflix Hystrix

    服务网关——Netflix Zuul

    分布式配置——Spring Cloud Config

    消息总线 —— Spring Cloud Bus

  2. Spring Cloud和Dubbo对比
Dubbo Spring Cloud
服务注册中心 Zookeeper Spring Cloud Netflix Eureka
服务调用方式 RPC REST API
服务网关 Spring Cloud Netflix Zuul
熔断器 不完善 Spring Cloud Netflix Hystrix
分布式配置 Spring Cloud Config
服务跟踪 Spring Cloud Sleuth
消息总线 Spring Cloud Bus
数据流 Spring Cloud Stream
批量任务 Spring Cloud Task
…… …… ……
  1. SpringCloud的版本

    SpringCloud由于是一系列框架组合,为了避免与包含的自框架版本产生混淆,采用伦敦地铁站的名称作为版本名,形式为版本名+里程碑号。 M9为第9个里程碑版本。

    以下是SpringBoot与Spring Cloud版本的对照表.

Spring Boot Spring Cloud
1.2.x Angel版本
1.3.x Brixton版本
1.4.x Camden版本
1.5.x Dalston版本、Edgware版本
2.0.x Finchley版本

二.Eureka 服务端开发/客户端开发

  1. Eureka是一个基于REST(Representational State Transfer)的服务,主要用于AWS cloud, 提供服务定位(locating services)、负载均衡(load balancing)、故障转移(failover of middle-tier servers)。我们把它叫做Eureka Server. Eureka也提供了基于Java的客户端组件,Eureka Client,内置的负载均衡器可以实现基本的round-robin负载均衡能力。在Netflix,一个基于Eureka的更复杂的负载均衡器针对多种因素(如流量、资源利用率、错误状态等)提供加权负载均衡,以实现高可用(superior resiliency).

Eureka是Netflix开发的服务发现框架,SpringCloud将它集成在自己的子项目

spring-cloud-netflix中,实现SpringCloud的服务发现功能。Eureka包含两个组件:Eureka Server和Eureka Client。

Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。

Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就别一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。

Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。

  1. eureka的注册中心开发步骤

    ①引入依赖 (注意版本的对应锁定)

    ②配置eureka的配置文件

    ③开发入口类 加入如下注解@EnableEurekaServer 用在类上,代表这个启动是一个eurekaServer

    ④启动eureka项目

    ⑤访问 示例:http://localhost:8761

[ ctrl+c 停止jar包形式启动的eureka ]

  1. eureka客户端开发

    ① 引入eureka 客户端依赖

    ② 开发服务类(区别dubbo,类是controller类)

    ③暴露服务 并注册eureka的注册中心:application.yml

    ④只需在入口类Application加上 注解@EnableEurekaClient 即可,低耦合 ; 注解@EnableDiscoveryClient 也可以,更通用,不耦合一种注册中心

三.SpringCloud 通信方式

  1. 两大协议对比 HTTP vs RPC
  • Dubbo “是一个RPC框架,底层是TCP协议通信框架”

    ①基于tcp协议基础,封装出dubbo协议,rmi协议

基于dubbo 开发的应用还是要依赖周边的平台生态, 相比其它的RPC框架, dubbo 在服务治理与服务集成上可谓是非常常完善, 不仅提供了服务注册,发现还提供了负载均衡,集群容错等基础能力同时,还提供了面向开发测试节点的Mock 和泛化调用等机制。 在spring cloud 出现之前dubbo 在国内应十分广泛,但dubbo 定位始终是一个RPC框架。
  • SpringCloud “轻量级HTTP协议”

    ①通信方式: http + restful 方式

    ②坚持HTTP协议原因:

    1)springcloud的目标是微服务架构下一栈式解决;

    2)使用http+restful方式通信(轻量易用适用性强),可以做到跨语言,跨平台和与已有系统集成。

SpringCloud 的目标是微服务架构下的一栈式解决方案,自dubbo 复活后dubbo 官方表示要积极适配到springcloud的生态方式,比如作为springcloud的二进制通信方案来发挥dubbo 的性能优势,或者通过dubbo 的模块化以及对http的支持适配到SpringCloud,但是到目前为止dubbo 与springclo ud 还是不怎么兼容,springcloud 微服务架构下微服务之间使用http的RestFul方式进行通信,HttpR estFul 本身轻量易用适用性强,可以很容易跨语言,跨平台,或者与已有的系统集成。

四.开发服务的消费者/Eureka的客户端(两种调用方式:一种ribbon + restTemplate,另一种frign)

在微服务架构中,业务都会被拆分成一个个独立的服务,服务之间通讯是基于http restful的。
  1. ribbon
  • ribbon是一个负载均衡客户端,可以很好的控制http和tcp一些行为。Feign默认集成ribbon。
  1. 开发SpringCloud的服务

    ①创建客户端服务工程 引入依赖

    ②配置client的服务注册中心 application.yml

    ③开发入口类

  • 第一种方式 (非注册中心模型,是直接访问访问,与服务中心无关)
//第一种方式调用
        RestTemplate restTemplate = new RestTemplate();
        //参数 暴露的接口url,返回值string
        String forObject = restTemplate.getForObject("http://localhost:8989/hello/hello?name=" +name, String.class);
        return forObject;
           

问题:耦合主机名和端口号

  • 第二种方式
@Autowired
    //用来负载均衡的客户端
    private LoadBalancerClient loadBalancerClient;
    
    //第二种方式调用
        //choose用来书写调用eureka服务名称,可以拿到端口服务(可getHost和getPort)
        ServiceInstance serviceInstance = loadBalancerClient.choose("HELLO-SERVICE");
        RestTemplate restTemplate = new RestTemplate();

        String url="http://"+serviceInstance.getHost()+":"+serviceInstance.getPort();
        String forObject = restTemplate.getForObject( url+"/hello/hello?name="+name, String.class);
        return forObject;
           
  • 第三种方式(建议)
//先封装工具类
@Configuration
public class Beans {
    @Bean
    @LoadBalanced   //1.解决该服务在集群环境下,负载均衡
    //2.解决问题:UnknownHostException: HELLO-SERVICE
    public RestTemplate getRestTemplate(){

        return new RestTemplate();
    }
}

	@Autowired
    //DI
    private RestTemplate restTemplate;
    
    //第三种方式
    String forObject = restTemplate.getForObject("http://HELLO-SERVICE/hello/hello?name=" + name, String.class);

    return forObject;
           

五.Eureka高可用(Eureka Server的集群 )

EurekaServer在微服务中架构中非常重要,若宕机会导致整个微服务架构崩溃,所以解决EurekaServer在现有系统中,高可用是势在必行的。

  • 准备两个EurekaServer 告知互相的备组件是谁即可

六.SpringCloud在项目中的实战应用 (商城APP功能)

示例:

电商系统的服务拆分 ---- product_service商品服务

          ---- product_order商品订单

☆利用restTemplate 进行两端发布服务调用

SpringCloud学习笔记1 - 20181127

继续阅读