SpringCloud入门

一. SpringCloud

1. 微服务技术栈有哪些?

服务治理落地技术
服务开发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、Metricx、Spectator
全链路追踪Zipkin、Brave、Dapper
服务部署Docker、OpenStack、Kubernetes
数据流操作开发包SpringCloud Stream
事件消息总线SpringCloud Bu

2. SpringCloud是什么?

        SpringCloud是一个微服务全家桶,是基于SpringBoot提供的一整套微服务解决方案。

3. Springboot和SpringCloud的区别?

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

4. Dubbo和SpringCloud是怎么做技术选型的?优缺点?

  • 开源社区活跃度:SpringCloud活跃、Dubbo不活跃
  • 通信方式:SpringCloud抛弃了Dubbo的RPC通信,使用基于Http的REST通信。(REST方式在一定程度上牺牲了服务调用的性能,但是使用上更加灵活。)
  • 使用方式:SpringCloud可以看做品牌机,有一整套的解决方案,有更高的稳定性;Dubbo可以看做组装机,自由度更高,但是可能因为一个部分不行就不好用了。

二. Eureka服务注册与发现

1. Eureka架构和Dubbo架构

【Eureka架构三大角色】

Euraka Server:提供服务注册与发现

Service Provider : 服务提供方将自身注册到Eureka,从而使服务消费方能找到

Service Consumer:服务消费方从Eureka获取服务注册列表,从而能够消费服务

【Eureka包含两个组件:Euraka Server 和 Eureka Client】

Euraka Server:服务节点启动后需要在Eureka Server进行注册,Euraka Server的服务注册列表会保存所有可用服务节点的信息,比如服务名、ip、端口。

Eureka Client:是一个java客户端,用于简化和Euraka Server的交互。Eureka Client会内置一个负载均衡算法器,从Euraka Server获取服务列表后进行负载均衡调用。在应用启动后,Client会向Server发送心跳包(默认30秒),如果Server一定时间内没收到(默认90秒),Server将会从服务注册列表中把Client移除。

【 Dubbo架构】

2. Eureka的自我保护机制

        某时刻某个微服务不可用了,eureka不会立即清理,依旧会对该微服务的信息进行保存。(设计哲学是:宁可保留错误的服务注册信息,也不盲目注销任何可能是健康的服务实例)

如果在15分钟内,超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时Eureka会这样处理:

  1. Eureka不再从注册列表中移除因为长时间没收到心跳而应该过期的服务
  2. Eureka仍然能够接受新服务的注册和查询请求,但是不会同步到其他节点上
  3. 当网络稳定时,当前实例的新注册信息会被同步到其他节点上

3. 服务注册中心

(1)添加pom依赖

        <!--eureka-server服务端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>

        <!-- 修改后立即生效,热部署 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>springloaded</artifactId>
        </dependency>

(2)YML配置

server: 
  port: 7001

eureka:
  instance:
    hostname: localhost #eureka服务端的实例名称
  client:
    register-with-eureka: false #false表示不向注册中心注册自己。
    fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/        #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。

(3)在主启动类上加上@EnableEurekaServer注解

@SpringBootApplication
@EnableEurekaServer//EurekaServer服务器端启动类,接受其它微服务注册进来
public class EurekaServer7001_App
{
  public static void main(String[] args)
  {
      SpringApplication.run(EurekaServer7001_App.class, args);
  }
}

4. 服务注册

(1)添加POM依赖

   <!-- 将微服务provider侧注册进eureka -->
   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-eureka</artifactId>
   </dependency>

   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-config</artifactId>
   </dependency>

(2)YML配置

eureka:
  client: #客户端注册进eureka服务列表内
    service-url: 
      defaultZone: http://localhost:7001/eureka

(3)在主启动类上加上@EnableEurekaClient注解

@SpringBootApplication
@EnableEurekaClient //本服务启动后会自动注册进eureka服务中
public class DeptProvider8001_App
{
  public static void main(String[] args)
  {
      SpringApplication.run(DeptProvider8001_App.class, args);
  }
}

5. 服务发现

        对于注册进Eureka里的微服务,可以通过服务发现来获得该服务的信息。DiscoveryClient

6. Eureka比Zookeeper好在哪?

        Eureka遵守AP原则,Zookeeper遵守CP原则

  • Zookeepermaster挂掉会进行选举,但是leader选举时间太长,30~120s,选举期间整个zk集群都不可用。
  • Eureka各个节点都是平等的,其中一个节点挂掉,其他节点依然能够提供服务。并且Eureka有自我保护机制,能够很好的应对因为网络故障导致部分节点失去联系的情况。

CAP原则:分布式系统

  • C(Consistency) 强一致性
  • A(Availability) 可用性
  • P(Partition Tolerance) 分区容错性:系统容忍节点之间通信故障

ACID原则:传统数据库,如MySQL

  • A(Atomicity) 原子性
  • C(Consistency) 一致性
  • I (Isolation) 独立性
  • D(Duranbility) 持久性

7.Eureka集群配置

(1)修改hosts文件

127.0.0.1  eureka7001.com
127.0.0.1  eureka7002.com
127.0.0.1  eureka7003.com

(2)修改3台Eureka服务器的yml配置

【7001】

server: 
  port: 7001

eureka: 
  instance:
    hostname: eureka7001.com #eureka服务端的实例名称
  client: 
    register-with-eureka: false     #false表示不向注册中心注册自己。
    fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url: 
      #单机 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/       #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址(单机)。
      defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

 【7002】

server: 
  port: 7002

eureka: 
  instance:
    hostname: eureka7002.com #eureka服务端的实例名称
  client: 
    register-with-eureka: false     #false表示不向注册中心注册自己。
    fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url: 
      #defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/       #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7003.com:7003/eureka/

【7003】

server: 
  port: 7003

eureka: 
  instance:
    hostname: eureka7003.com #eureka服务端的实例名称
  client: 
    register-with-eureka: false     #false表示不向注册中心注册自己。
    fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url: 
      #defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/       #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/

(3)把微服务发布到上面3台eureka集群配置中 microservicecloud-provider-dept-8001

server:
  port: 8001  

mybatis:
  config-location: classpath:mybatis/mybatis.cfg.xml  #mybatis所在路径
  type-aliases-package: com.atguigu.springcloud.entities #entity别名类
  mapper-locations:
  - classpath:mybatis/mapper/**/*.xml #mapper映射文件

spring:
   application:
    name: microservicecloud-dept 
   datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: org.gjt.mm.mysql.Driver
    url: jdbc:mysql://localhost:3306/cloudDB01
    username: root
    password: 123456
    dbcp2:
      min-idle: 5
      initial-size: 5
      max-total: 5
      max-wait-millis: 200

eureka:
  client: #客户端注册进eureka服务列表内
    service-url: 
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
  instance:
    instance-id: microservicecloud-dept8001   #自定义服务名称信息
    prefer-ip-address: true     #访问路径可以显示IP地址

info:
  app.name: atguigu-microservicecloud
  company.name: www.atguigu.com
  build.artifactId: $project.artifactId$
  build.version: $project.version$

三. Ribbon负载均衡

1. Ribbon是什么?

        SpringCloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡。能够将用户的请求平摊的分配到多个服务上。

Ribbon结合Eureka的作用:

        Ribbon和Eureka整合后Consumer可以直接调用服务而不用再关心地址和端口号。

        Ribbon其实就是一个软负载均衡的客户端组件,它可以和其他所需请求的客户端结合使用,和eureka结合只是其中的一个实例。

2. Ribbon配置

(1)添加pom依赖

   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-eureka</artifactId>
   </dependency>

   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-ribbon</artifactId>
   </dependency>

   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-config</artifactId>
   </dependency>

(2)修改application.yml   追加eureka的服务注册地址

server:
  port: 80

eureka:
  client:
    register-with-eureka: false
    service-url: 
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

(3)对ConfigBean进行新注解@LoadBalanced(获得Rest时加入Ribbon的配置)

@Configuration
public class ConfigBean
{
  @Bean
  @LoadBalanced
  public RestTemplate getRestTemplate()
  {
   return new RestTemplate();
  }
}

(4)主启动类添加@EnableEurekaClient

@SpringBootApplication
@EnableEurekaClient
public class DeptConsumer80_App
{
  public static void main(String[] args)
  {
      SpringApplication.run(DeptConsumer80_App.class, args);
  }
}

(5)修改客户端访问类:通过微服务名访问Eureka

3. Ribbon和Nigix的区别

  • Nigix是集中式的负载均衡:即在服务的消费方和提供方之间使用独立的负载均衡设施, 由该设施负责把访问请求通过某种策略转发至服务的提供方。
  • Ribbon是一个进程内的负载均衡:Ribbon只是一个类库,它把负载均衡设备集成到消费端,消费方从服务注册中心获知服务节点列表,然后从列表选择出一个合适的服务器进行调用。

4. 负载均衡

架构说明 

Ribbon在工作时分成两步:

  • 第一步先选择 EurekaServer ,它优先选择在同一个区域内负载较少的server.
  • 第二步再根据用户指定的策略,在从server取到的服务注册列表中选择一个地址。

其中Ribbon提供了多种策略:比如轮询、随机和根据响应时间加权。

5. Ribbon核心组件IRule

IRule:根据特定算法从服务列表中选一个要访问的服务。如轮训、随机、根据响应时间权重

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值