SpringCloud

SpringCloud_第1张图片
SpringCloud_第2张图片

一、认识微服务

1.1单体架构

SpringCloud_第3张图片

优点

架构简单

部署成本低

缺点

耦合度高

1.2分布式架构

SpringCloud_第4张图片

优点

降低服务耦合

有利于服务升级拓展

分布式架构的要考虑的问题

服务拆分粒度如何?

服务集群地址如何维护?

服务之间如何实现远程调用?

服务健康状态如何感知?

1.3 微服务

SpringCloud_第5张图片

微服务是一种经过良好架构设计的分布式架构方案,微服务架构特征:

单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责,避免重复业务开发

面向服务:微服务对外暴露业务接口

自治:团队独立、技术独立、数据独立、部署独立

隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题

1.4 微服务技术对比

Dubbo

SpringCloud

SpringCloudAlibaba

注册中心

zookeeper、Redis

Eureka、Consul

Nacos、Eureka

服务远程调用

Dubbo协议

Feign(http协议)

Dubbo、Feign

配置中心

SpringCloudConfig

SpringCloudConfig、Nacos

服务网关

SpringCloudGateway、Zuul

SpringCloudGateway、Zuul

服务监控和保护

dubbo-admin,功能弱

Hystix

Sentinel

二、SpringCloud

服务调用关系:

  1. 服务提供者:暴露接口给其它微服务调用

  1. 服务消费者:调用其它微服务提供的接口

  1. 提供者与消费者角色其实是相对的

  1. 一个服务可以同时是服务提供者和服务消费者

2.1 Eureka注册中心

服务调用出现的问题:

  1. 服务消费者该如何获取服务提供者的地址信息?

  1. 如果有多个服务提供者,消费者该如何选择?

  1. 消费者如何得知服务提供者的健康状态?

2.1.1 Eureka的作用

消费者该如何获取服务提供者具体信息?

  1. 服务提供者启动时向eureka注册自己的信息

  1. eureka保存这些信息

  1. 消费者根据服务名称向eureka拉取提供者信息

如果有多个服务提供者,消费者该如何选择?

  1. 服务消费者利用负载均衡算法,从服务列表中挑选一个

消费者如何感知服务提供者健康状态?

  1. 服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态

  1. eureka会更新记录服务列表信息,心跳不正常会被剔除

  1. 消费者就可以拉取到最新的信息

2.1.2 eureka注册中心开发

2.1.2.1 引入依赖

        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-server
        

2.1.2.2 启动类加注解

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

2.1.2.3 书写配置文件

server:
  port: 10086 #服务端口
spring:
  application:
    name: eurekaserver #eureka服务名称
eureka:
  client:
    service-url: #eureka地址信息
      defaultZone: http://localhost:10086/eureka/

启动。访问http://localhost:10086/

SpringCloud_第6张图片

2.1.3 服务注册

2.1.3.1 引入依赖

        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
        

2.1.3.2 配置文件

spring:
  application:
    name: userservice #eureka服务名称
eureka:
  client:
    service-url: #eureka地址信息
      defaultZone: http://localhost:10086/eureka/

2.1.4 服务发现

  1. 引入eureka-client依赖

  1. 在application.yml中配置eureka地址

  1. 给RestTemplate添加@LoadBalanced注解

  1. 用服务提供者的服务名称远程调用

2.1.5 负载均衡

2.1.5.1负载均衡原理

SpringCloud_第7张图片
SpringCloud_第8张图片

2.1.5.2 负载均衡策略

内置负载均衡规则类

规则描述

RoundRobinRule

简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则

AvailabilityFilteringRule

对以下两种服务器进行忽略:

(1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。

(2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限,可以由客户端的..ActiveConnectionsLimit属性进行配置。

WeightedResponseTimeRule

为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。

ZoneAvoidanceRule

以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。

BestAvailableRule

忽略那些短路的服务器,并选择并发数较低的服务器。

RandomRule

随机选择一个可用的服务器。

RetryRule

重试机制的选择逻辑

2.1.5.3 改变负载均衡的方式

①在主启动类内定义一个新的IRule

该配置针对所有服务

    @Bean
    public IRule randomRule(){
        return new RandomRule();
    }

②配置文件中进行配置

只针对userservice这个微服务

userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

2.1.5.4 饥饿加载

Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。

而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:

ribbon:
  eager-load:
    enable: true
    clients: userservice

2.2 Nacos注册中心

2.2.1 Nacos注册中心

SpringCloud_第9张图片

在nacos安装包的bin路径输入startup.cmd -m standalone开启并进入nacos注册中心

nacos登录账号及密码默认都为nacos

spring-cloud-alilbaba的管理依赖

            
                com.alibaba.cloud
                spring-cloud-alibaba-dependencies
                2.2.5.RELEASE
                pom
                import
            

添加nacos客户端依赖

        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        
  cloud:
    nacos:
      server-addr: localhost:8848
SpringCloud_第10张图片

2.2.2 Nacos服务分级存储模型

  1. 一级是服务,例如userservice

  1. 二级是集群,例如杭州或上海

  1. 三级是实例,例如杭州机房的某台部署了userservice的服务器

服务调用尽可能选择本地集群的服务,跨集群调用延迟较高,本地集群不可访问时,再去访问其它集群

SpringCloud_第11张图片

添加集群属性

spring:
    cloud:
        nacos:
          server-addr: localhost:8848
          discovery:
            cluster-name: SH
SpringCloud_第12张图片

修改3个user service微服务其中两个为HZ集群,一个为SH集群,并且更改order service为HZ集群

启动orderservice调用三次userservice,发现还是轮询机制,并没有优先调用同地域

需要在服务调用者配置中加上以下配置

userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

实现功能如下:

  1. 优先选择同集群服务实例列表

  1. 本地集群找不到提供者,才去其它集群寻找,并且会报警告

  1. 确定了可用实例列表后,再采用随机负载均衡挑选实例

2.2.3 根据权重负载均衡

Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高

SpringCloud_第13张图片
  1. Nacos控制台可以设置实例的权重值,0~1之间

  1. 同集群内的多个实例,权重越高被访问的频率越高

  1. 权重设置为0则完全不会被访问

2.2.4 数据隔离

基于不同状态进行隔离,比如开发、测试、生产环境数据的隔离

SpringCloud_第14张图片
 spring:
     cloud:
        nacos:
          server-addr: localhost:8848
          discovery:
            cluster-name: HZ
            namespace: 948b3f90-24d0-45e9-a952-2233ad82c007

在微服务的配置文件内书写namespace并写入到对应命名空间的uuid,可以注册到对对应命名空间。

将服务提供者及服务消费者放在不同命名空间,则无法访问。如下图

2.2.5 与Eureka的对比

1.Nacos与eureka的共同点

都支持服务注册和服务拉取

都支持服务提供者心跳方式做健康检测

2.Nacos与Eureka的区别

Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式

临时实例心跳不正常会被剔除,非临时实例则不会被剔除

你可能感兴趣的:(微服务,java)