SpringCloud学习笔记1 - 20181127

一.引言

  1. 什么是微服务?
  • 官方定义解释:微服务就是由一系列服务功能组成,能单独跑在自己的进程里,每个服务独立开发,独立部署,分布式的管理。
  1. 微服务特点?
  • 由一系列小服务组成
  • 独立的运行在自己的计算机进程
  • 独立部署
  • 基于分布式管理的服务
  1. 为什么会出现微服务?
  • 单体架构
    优点:易部署、易测试
    缺点:开发效率低、代码难维护、部署不灵活、稳定性不高、扩展性不高(上手难)
  • 架构的演变
    ORM(单一架构) —>MVC(垂直架构) —>RPC(分布式架构) —>SOA(流动式架构)
    在这里插入图片描述
  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. 服务架构图
    在这里插入图片描述

二.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).

  2. 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 进行两端发布服务调用
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42838993/article/details/84575740
今日推荐