【SpringCloud】学习笔记(一)

一、微服务:

1.1、目前的微服务解决方案:

  • SpringCloud+NetFlix 一站式解决方案(目前较多但NetFlix 停更)!
    api网关,zuul组件
    Feign —Httpclinet ---- Http通信方式,同步,阻塞
    服务注册发现:Eureka
    熔断机制:Hystrix

  • ApacheDubbo+Zookeeper半自动,需要整合别人的!
    API:没有,找第三方组件,或者自己实现
    Dubbo
    Zookeeper
    熔断机制:没有第三方Hystrix

  • SpringCloud+ Alibaba 一站式解决方案!

1.2、微服务优缺点

优点

  • 单一职责原则
  • 每个服务足够内聚,足够小,代码容易理解,这样能聚焦一个指定的业务功能或业务需求;·
  • 开发简单,开发效率提高,一个服务可能就是专一的只干一件事;
  • 微服务能够被小团队单独开发,这个小团队是2~5人的开发人员组成;
  • 微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的。
  • 微服务能使用不同的语言开发。
  • 易于和第三方集成,微服务允许容易且灵活的方式集成自动部署,通过持续集成工具,如jenkins,Hudson,bamboo
  • 微服务易于被一个开发人员理解,修改和维护,这样小团队能够更关注自己的工作成果。无需通过合作才能体现价值。
  • 微服务允许你利用融合最新技术。
  • 服务只是业务逻辑的代码,不会和HTML, CSS或其他界面混合
  • 每个微服务都有自己的存储能力,可以有自己的数据库,也可以有统一数据库

缺点:

  • 开发人员要处理分布式系统的复杂性
  • 多服务运维难度,随着服务的增加,运维的压力也在增大
  • 系统部署依赖
  • 服务间通信成本·数据一致性·系统集成测试·
  • 性能监控…

1.3、微服务技术栈

微服务条目落地技术
服务开发SpringBoot,Spring,SpringMVC
服务配置与管理Netflix公司的Archaius、阿里的Diamond等
服务注册与发现Eureka、Consul、Zookeeper等
服务调用Rest、RPC、gRPC
服务熔断器Hystrix、Envoy等
负载均衡Ribbon、Nginx等
服务接口调用(客户端调用服务的简化工具)Feign等
消息队列Kafka、RabbitMQ、ActiveMQ等
服务配置中心管理SpringCloudConfig、Chef等
服务路由(API网关)Zuul等
服务监控Zabbix、Nagios、Metrics、Specatator等
全链路追踪Zipkin、Brave、Dapper等
服务部署Docker、OpenStack、Kubernetes等
数据流操作开发包SpringCloud Stream(封装与Redis,Rabbit,Kafka等发送接收消息)
事件消息总线springCloud Bus

二、SpringCloud

2.1、SpringCloud与SpringBoot

SpringBoot 笔记

SpringBoot专注于快速、方便的开发单个个体微服务
SpringCloud关注全局的服务治理框架

2.2、Dubbo与SpringCloud对比

DubboSpring
服务注册中心ZookeeperSpring Cloud Netfilx Eureka
服务调用方式RPCREST API
服务监控Dubbo-monitorSpring Boot Admin
断路器不完善Spring Cloud Netflix Hystrix
服务网关Spring Cloud Netflix Zuul
分布式配置Spring Cloud Config
服务跟踪Spring Cloud Sleuth
消息总线Spring Cloud Bus
数据流Spring Cloud Stream
批量任务Spring Cloud Task

最大区别: SpringCloud抛弃了Dubbo的RPC通信,采用的是基于HTTP的REST方式。

2.3、参考书:

三、Rest风格代码案例

使用RestTemplete先需要放入Spring容器中

ConfigBean.java

@Configuration
public class ConfigBean {
    //@Configuration -- spring  applicationContext.xml
    //配置负载均衡实现RestTemplate
    // IRule
    // RoundRobinRule 轮询
    // RandomRule 随机
    // AvailabilityFilteringRule : 会先过滤掉,跳闸,访问故障的服务~,对剩下的进行轮询~
    // RetryRule : 会先按照轮询获取服务~,如果服务获取失败,则会在指定的时间内进行,重试
    @Bean
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

DeptConsumerController.java

@RestController
public class DeptConsumerController {
    /**
     * 理解:消费者,不应该有service层~
     * RestTemplate .... 供我们直接调用就可以了! 注册到Spring中
     * (地址:url, 实体:Map ,Class<T> responseType)
     * 提供多种便捷访问远程http服务的方法,简单的Restful服务模板~
     */
     
    @Autowired
    private RestTemplate restTemplate;
    
    //服务提供方地址前缀
    private static final String REST_URL_PREFIX = "http://localhost:8001";
    //private static final String REST_URL_PREFIX = "http://SPRINGCLOUD-PROVIDER-DEPT";
    
	//添加信息
    @RequestMapping("/consumer/dept/add")
    public boolean add(Dept dept) {
        // postForObject(服务提供方地址(接口),参数实体,返回类型.class)
        return restTemplate.postForObject(REST_URL_PREFIX + "/dept/add", dept, Boolean.class);
    }
	//通过ID查询
    @RequestMapping("/consumer/dept/get/{id}")
    public Dept get(@PathVariable("id") Long id) {
        // getForObject(服务提供方地址(接口),返回类型.class)
        return restTemplate.getForObject(REST_URL_PREFIX + "/dept/get/" + id, Dept.class);
    }
    //查询所有信息
    @RequestMapping("/consumer/dept/list")
    public List<Dept> list() {
        return restTemplate.getForObject(REST_URL_PREFIX + "/dept/list", List.class);
    }
}

四、Eureka

Eureka是Netflix的一个子模块,也是核心模块之一。Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移,服务注册与发现对于微服务来说是非常重要的,有了服务发现与注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了,功能类似于Dubbo的注册中心,比如Zookeeper;

4.1、Eureka基本的架构

  • Springcloud 封装了Netflix公司开发的Eureka模块来实现服务注册与发现 (对比Zookeeper).
  • Eureka采用了C-S的架构设计,EurekaServer作为服务注册功能的服务器,他是服务注册中心.
  • 而系统中的其他微服务,使用Eureka的客户端连接到EurekaServer并维持心跳连接。这样系统的维护人员就可以通过EurekaServer来监控系统中各个微服务是否正常运行,Springcloud
    的一些其他模块 (比如Zuul) 就可以通过EurekaServer来发现系统中的其他微服务,并执行相关的逻辑.
  • Eureka 包含两个组件:Eureka Server 和 Eureka Client.
  • Eureka Server 提供服务注册,各个节点启动后,回在EurekaServer中进行注册,这样Eureka
    Server中的服务注册表中将会储存所有课用服务节点的信息,服务节点的信息可以在界面中直观的看到.
  • Eureka Client是一个Java客户端,用于简化EurekaServer的交互,客户端同时也具备一个内置的,使用轮询负载算法的负载均衡器。在应用启动后,将会向EurekaServer发送心跳 (默认周期为30秒) 。如果EurekaServer在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除掉(默认周期为90s).

三大角色

  • Eureka Server:提供服务的注册与发现
  • Service Provider:服务生产方,将自身服务注册到Eureka中,从而使服务消费方能狗找到
  • Service Consumer:服务消费方,从Eureka中获取注册服务列表,从而找到消费服务

4.2、代码

4.2.1、导包

<dependency>
    <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
     <version>3.1.0</version>
</dependency>
==========================================
注册中心(上)服务(下)
===========================================
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    <version>3.1.0</version>
</dependency>

4.2.2、配置项

eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false #表示是否向eureka注册中心注册自己
    fetch-registry: false #fetch-registry如果为于false,则表示自己为注册中心
    service-url: #监控页面地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

===================================================
注册中心(上)服务(下)
===================================================
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8001/eureka/

4.2.3、注解

@SpringBootApplication
@EnableEurekaServer // EnableEurekaServer服务端的启动类,可以接受别人注册进来
public class EurekaServer_8001{
        public static void main( String[] args) {
            SpringApplication.run(EurekaServer_8001.class,args);
        }
}
===========================================
注册中心(上)服务(下)
============================================
@SpringBootApplication
@EnableEurekaClient//在服务启动后自动注册到Eureka中
public class DeptProvider_8001 {
    public static void main( String[] args){
        SpringApplication.run( DeptProvider_8001.class,args);
    }
}

4.3、Eureka的自我保护机制

某时刻某一个微服务不可以用了,Eureka不会立刻清理,依旧会对该微服务的信息进行保存!

  • 默认情况下,当eurekaserver在一定时间内没有收到实例的心跳,便会把该实例从注册表中删除(默认是90秒),但是,如果短时间内丢失大量的实例心跳,便会触发eureka server的自我保护机制,比如在开发测试时,需要频繁地重启微服务实例,但是我们很少会把eureka server一起重启(因为在开发过程中不会修改eureka注册中心),当一分钟内收到的心跳数大量减少时,会触发该保护机制。可以在eureka管理界面看到Renews threshold和Renews(last min),当后者(最后一分钟收到的心跳数)小于前者(心跳阈值)的时候,触发保护机制,会出现红色的警告:EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.从警告中可以看到,eureka认为虽然收不到实例的心跳,但它认为实例还是健康的,eureka会保护这些实例,不会把它们从注册表中删掉。
  • 该保护机制的目的是避免网络连接故障,在发生网络故障时,微服务和注册中心之间无法正常通信,但服务本身是健康的,不应该注销该服务,如果eureka因网络故障而把微服务误删了,那即使网络恢复了,该微服务也不会重新注册到eureka server了,因为只有在微服务启动的时候才会发起注册请求,后面只会发送心跳和服务列表请求,这样的话,该实例虽然是运行着,但永远不会被其它服务所感知。所以,eureka server在短时间内丢失过多的客户端心跳时,会进入自我保护模式,该模式下,eureka会保护注册表中的信息,不在注销任何微服务,当网络故障恢复后,eureka会自动退出保护模式。自我保护模式可以让集群更加健壮。
  • 但是我们在开发测试阶段,需要频繁地重启发布,如果触发了保护机制,则旧的服务实例没有被删除,这时请求有可能跑到旧的实例中,而该实例已经关闭了,这就导致请求错误,影响开发测试。所以,在开发测试阶段,我们可以把自我保护模式关闭,只需在eureka server配置文件中加上如下配置即可:eureka.server.enable-self-preservation=false【不推荐关闭自我保护机制】

4.4、Eureka集群

与之前一样只不过在defaultZone配置项增加多个地址
以及在注册时也要写多个地址

eureka:
  instance:
    hostname: eureka7003.com
  client:
    register-with-eureka: false #表示是否向eureka注册中心注册自己
    fetch-registry: false #fetch-registry如果为于false,则表示自己为注册中心
    service-url: #监控页面地址
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
==============================================================
eureka:
  client:
    service-url:
      defaultZone:  http://eureka7001.com:7001/eureka/, http://eureka7002.com:7002/eureka/, http://eureka7003.com:7003/eureka/

4.5、CAP原则

  • C (Consistency) 强一致性
  • A (Availability) 可用性
  • P (Partition tolerance) 分区容错性
    CAP只能三选二:CA、AP、CP

CA:单点集群,满足一致性,可用性的系统,通常可扩展性较差。
CP:满足一致性,分区容错性的系统,通常性能不是特别高
AP:满足可用性,分区容错性的系统,通常可能对一致性要求低一些

Zookeeper保证的是CP
Eureka保证的是AP

【SpringCloud】学习笔记(二)

点此跳转

【SpringCloud】学习笔记(三)

点此跳转

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值