SpringCloud五大组件

  1. Spring Cloud Netflix是什么?

             Spring Cloud中包含了非常多的子框架,Spring Cloud netflix就是其中一套框架,是先由Netflix开发,后来又并入Spring Cloud大家庭,它的主要提供模块有:服务发现、断路器和监控、智能路由、客户端负载均衡等

 1.Eureka,服务注册和发现,它提供了一个服务注册中心、服务发现的客户端,还有一个方便的查看所有注册的服务的界面。 所有的服务使用Eureka的服务发现客户端来将自己注册到Eureka的服务器上。

2.1Ribbon,即负载均衡,Zuul网关将一个请求发送给某一个服务的应用的时候,如果一个服务启动了多个实例,就会通过Ribbon来通过一定的负载均衡策略来发送给某一个服务实例。

2.2Feign,服务客户端,服务之间如果需要相互访问,可以使用RestTemplate,也可以使用Feign客户端访问。它默认会使用Ribbon来实现负载均衡。

3.Hystrix,监控和断路器。我们只需要在服务接口上添加Hystrix标签,就可以实现对这个接口的监控和断路器功能

4.Zuul,网关,所有的客户端请求通过这个网关访问后台的服务。他可以使用一定的路由配置来判断某一个URL由哪个服务来处理。并从Eureka获取注册的服务来转发请求。

5.

1.注册中心Eureka服务

        注册于发现:

  1. 什么是Eureka

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

1.原理讲解:

        Eureka的基本架构:

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

2.三大角色:

  1. Eureka Server提供服务的注册与发现
  2. Service Provider:将自身服务注册到Eureka中,从而使消费方能够找到。
  3. Service Consumer:服务消费方从Eureka中获取注册服务列表,从而找到消费服务。

3.Eureka的自我保护机制:

     一句话总结:某时刻某一个服务不可以使用了,eureka不会立刻清理,依旧会对微服务的信息进行保存。

  1. 默认情况:如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销改实例。但是当网络分区故障发生时,微服务与Eureka之间无法正常通行,以上行为可能变得非常危险,因为微服务本身其实是健康的,此时不应该注销这个服务。Eureka通过自我保护机制来解决这个问题--当Eureka Server节点在短时间内丢失过多客户端时,那么这个节点就会自我保护模式。一旦进入模式,Eureka Server就会保护注册表中的信息,不在删除服务注册表中的数据(也就是不会注销任何服务),当网络故障恢复,该Eureka Server节点会自动退出自我保护模式。
  2. 在自我保护模式中,Eureka Server会保护服务注册表中的信息,不在注销任何服务实例。当他收到心跳数重新恢复时,该Eureka Server就会自动退出自我保护模式。它的设计哲学就是宁可保留错误的服务注册信息,也不盲目注销任何健康的服务实例。一句话:好死不如赖活着。
  3. 综上,自我保护模式是一种应对网络异常的安全保护措施,它的架构哲学是宁可同事保留所有的微服务(健康的微服务和不健康的微服务都会保留),也不盲目注销任何不健康的微服务,使用自我保护机制,可以让Eureka集群更加健壮和稳定。
  4. Springcloud中,可以使用eureka-server-enable-self-presertion=false禁用自我保护模式。
  5. Eureka的配置:

                5.1eureka依赖:

 <dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka-server</artifactId>
        <version>1.4.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

<!--版本问题导致eureka服务器启动正常,但是浏览器访问是404-->

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-netflix-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

5.2application.yml配置:

    

​server:
  port: 8081
eureka:
  instance:
    hostname: localhost     #eureka服务端的实例名称
#    instance-id: springcloud-provider-8081  #修改eureka网页上的默认描述信息
#    prefer-ip-address: true             #true , 可以显示服务的IP地址
  client:
    register-with-eureka: false #表示是否像eureka注册中心注册自己
    fetch-registry: false  #fetch-registry如果为false,则表示自己为注册中心
    service-url:   #注册中心提供的注册地址
      defaultZone: http://localhost:8081/eureka/

5.3启动类的注解配置

   //启动之后访问:localhost:8083
@SpringBootApplication
@EnableEurekaServer  //服务端的启动类,可以接受别人注册进来

6.provider服务端配置:

    6.1  1.pom依赖:

<dependencies>
      <!--添加api的实体类-->
      <dependency>
          <groupId>com.neu</groupId>
         <artifactId>springcloud-api</artifactId>
          <version>1.0-SNAPSHOT</version>
      </dependency>
      <!--添加eureka依赖-->
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-eureka</artifactId>
          <version>1.4.6.RELEASE</version>
      </dependency>
      <!--actuator完善监控信息-->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-actuator</artifactId>
      </dependency>

      <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
      </dependency>

      <!--数据库包-->
      <dependency>
          <groupId>com.oracle</groupId>
          <artifactId>ojdbc6</artifactId>
          <version>11.2.0</version>
      </dependency>

      <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <version>1.16.10</version>
      </dependency>

      <!--log4j-->
      <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>1.2.17</version>
      </dependency>

      <!--springboot启动器-->
      <dependency>
          <groupId>org.mybatis.spring.boot</groupId>
          <artifactId>mybatis-spring-boot-starter</artifactId>
          <!-- 请不要使用1.0.0版本,因为还不支持拦截器插件,1.0.1-SNAPSHOT 是博主写
帖子时候的版本,大家使用最新版本即可 -->
          <version>1.3.2</version>
      </dependency>

      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
      </dependency>

      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
          <version>2.1.4.RELEASE</version>
      </dependency>
      <!-- Spring Boot JDBC -->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-jdbc</artifactId>
          <version>2.1.4.RELEASE</version>
      </dependency>

      <!--热部署-->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-devtools</artifactId>
          <!-- 有人说optional一定要配置成true才有效, 但我调试完感觉不加optional也有效 -->
          <optional>true</optional>
      </dependency>


  </dependencies>

        6.2  application.yml配置

server:
  port: 8082
spring:
  application:
    name: springcloud-provider-8082
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&serverTimezone=UTC
    username: root
    password: 123456

#    driver-class-name: oracle.jdbc.driver.OracleDriver   #orcal配置
#          url: jdbc:oracle:thin:@127.0.0.1:1521:orcl
#          username: scott
#          password: tiger


mybatis:
  type-aliases-package: com.neu.entity
  mapper-locations: classpath:/mapper/*Mapper.xml
#Eureka的配置,服务注册到哪里
eureka:
  client:
    service-url:
       defaultZone: http://localhost:8081/eureka/ #注册中心的地址

   #集群配置修改localhost镜像地址C:\Windows\System32\drivers\etc\hosts

        6.3  启动类注解配置:

                @SpringBootApplication
@EnableEurekaClient  //在服务启动后自动注册到eureka中
@EnableDiscoveryClient //开启服务发现

2.1Ribbon负载均衡

1什么是ribbon:

  1. spring cloud Ribbon 是基于Netflix Ribbon实现的一套客户端负载均衡的工具。
  2. 简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon的客户端组件提供一系列完整的配置项如:连接超时,重试等等。简单的说,就是在配置文件中列出LoadBalancer(简称:LB负载均衡)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。

2.Ribbon能干嘛?

        1.LB:既负载均衡,在负载均衡(Load Balance),在微服务或分布式集群中京城使用的一种应用。

        2.负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用)。

        3.常见的负载均衡软件Netflix ,Lvs等等。

        4.负载均衡简单分类:

            1.集中式LB

       即在服务的消费方和提供方之间使用独立的LB设施,如Nginx,由该设施负责把访问请求通过你某种策略转发至服务的提供方!

            2.进程式LB

        将LB逻辑继承到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些选出一个合适的服务。

        Ribbon就属于进程LB,他只有一个类库,继承与消费方进程,消费方通过它来获取到服务提供方的地址。

消费者配置依赖:

<!--配置ribbon-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
@Configuration
public class ResetConfig {
    @Bean
    @LoadBalanced   //实现负载均衡,以轮巡的方式使每个服务均匀执行
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

    @Bean
    public IRule Myrole(){      //服务提供者以随机的方式被访问
        return new RandomRule();
    }
}
@RestController
@RequestMapping("user")
public class UserController {
    @Autowired
    private RestTemplate restTemplate;
    //以注册中心的provider的id名字进行访问
    private static final String REST_URL_PREFIX="http://SPRINGCLOUD-PROVIDER-USER";
    @GetMapping(value = "/findAll")
    public List<User> findAll(){
        return restTemplate.getForObject(REST_URL_PREFIX+"/user/findAll",List.class);
    }
}

2.2Feign调用服务

        2.2.1.什么是feign:

feign是声明式的web service客户端,它让微服务之间的调用变得更简单,类似controller调用service,Springcloud集成了Ribbon和Eureka,可在使用Feign时提供负载均衡的http客户端。

只需要创建一个接口,然后添加注解即可。

Feign,主要是社区,大家都习惯面向接口编程。这个是很多开发人员的规范,调用微服务访问的两种方式。

  1. 微服务的名字(ribbon)
  2. 接口注解(feign)

        2.2.2.feign能干什么:

      1.feign旨在使编写java http客户端变的更容易。

      2.前面在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模板化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个服务自行封装一些客户端来包装这些依赖服务的调用。所以,feign再次基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义,在feign的实现下,我们只需要创建一个接口并使用注解的方式来配置它,(类似与以前Dao接口上标注的Mapper注解,现在是一个微服务接口上面标注一个feign注解即可。)即可完成对服务提供方的接口绑定,简化了使用spring cloud ribbon时,自动封装服务调用客户端的开发量。

        2.2.3.feign集成ribbon:

        利用ribbon维护了MicroServiceCloud-dept的服务列表信息,并且通过轮询实现了客户端的负载均衡,而与ribbon不同的是,通过feign只需要定义服务绑定接口且以声明式的方法,优雅而且简单的实现了服务调用。

消费者服务和api服务添加依赖:

<!--配置feign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>

feign接口定义:

@Service("userClientBiz")
@FeignClient(value = "SPRIGNCLOUD-PROVIDER-HYSTRIX-8084")
public interface UserClientBiz {
    //测试provider-8082中的feign
    @GetMapping(value = "/user/findAll")
    public List<User> findAll();

}

消费者控制器调用:

@RestController
@RequestMapping("user")
public class UserController {
    @Autowired
    private UserClientBiz userClientBiz;
    @GetMapping(value = "/findAll")
    public List<User> findAll(){
        return userClientBiz.findAll();
    }

    @GetMapping(value = "findById/{id}")
    public User findById(@PathVariable("id")int id){
        return userClientBiz.findById(id);
    }

}

消费者启动类加注解打开feign:

@EnableFeignClients(basePackages = {"com.neu"})//扫描api  com.neu下的所有文件
@ComponentScan("com.neu") //扫描本服务(消费者)com.neu下的所有文件

3.Hystrix断路器

1. 分布式系统面临的问题:

   复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免的失败!

2.服务雪崩:

多个服务之间的调用时,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他服务,这就是所谓的“扇出”、如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起崩溃,所谓的“雪崩效应”。

对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障,这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系失败,不能取消整个应用程序或系统。

3.什么是hystrix:

hystrix是一个用于处理分布式系统的延迟和容错开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时,异常等。Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障。以提高分布式系统的弹性。

4.断路器:

     断路器本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控,向调用方放回一个服务预期的,可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方法无法处理的异常,这样就可以保证了服务调用方法的线程不会被长时间,不必要的占用。从而避免了故障在分布式系统中的蔓延,乃至雪崩。

5.服务熔断是什么:

      熔断机制是对应雪崩效应的一种微服务链路保护机制。

  当扇出链路的某个微服务不可用或者响应时间太长,会进行服务降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。当检测到改节点微服务调用响应正常后恢复调用链路。在springcloud框架里熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况。当失败的调用到一定的阈值,缺省是5秒内20次调用失败就会启动熔断机制。熔断机制的注解是@HystrixCommand.

provider服务添加依赖:

<!--添加hystrix依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>

provider控制类:

@HystrixCommand注解是方法级别的,在你需要捕获的方法上加上注解

@RestController
@RequestMapping("user")
public class UserController {
    @Autowired
    private UserBiz userBiz;
    @GetMapping(value = "/findById/{id}")

    @HystrixCommand(fallbackMethod = "hystrix_findById")        //熔断器跳转备用方法
    public User findById(@PathVariable("id")int id){
        User user =userBiz.findById(id);
        if (user==null){
            throw new RuntimeException("id=>"+id+",不存在该用户或者找不到");
        }
        return user;
    }
    public User hystrix_findById(@PathVariable("id") int id){
        User user = new User();
        user.setId(id);
        user.setUname("id没有对应的信息");
        return user;
    }
}

provider启动类添加注解:

@EnableCircuitBreaker    //加上@EnableCircuitBreaker注解之后,就可以使用断路器功能

hystrix还可以做 服务降级:客户端、从整体网站请求负载考虑,当某个服务熔断或者关闭之后,服务将不再被调用~   。此时在客户端,我们可以准备一个 FallbackFactory,返回一个默认的值(缺省值),整体的服务水平下降了~但是,好歹能用

4.Zuul路由网关:

        1.什么是zuul:

Zuul包含了对请求的路由和过滤两个最主要的功能:

其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验,服务聚合等功能的基础。Zull和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他微服务的信息,也即以后的访问微服务都是通过Zuul跳转后获得。

注意:Zuul服务最终还是会注册进Eureka.

提供:代理+路由+过滤三大功能。

        2.zull能干嘛:

                1.路由

                2.过滤

 

文章参考:(10条消息) springCloud五大核心组件介绍_明快de玄米61的博客-CSDN博客_springcloud五大核心组件

Spring Cloud Netflix 中文文档 参考手册 中文版

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值