Spring Cloud 体验

简介

  • Spring Cloud为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、

    事件总线、全局锁、决策竞选、分布式会话等等
  • 基于Spring Boot,Spring Cloud将各公司成熟服务框架组合起来,通过Spring Boot风格封装屏蔽掉了复杂的

    配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包
    

创建服务注册中心

  • 开发工具:Spring Tool Suite

  • 右键 > New > Spring Starter Project > name:wind-server >

    next:选择cloud discovery->eureka server > Finish
  • 配置服务application.yml

  • 启动一个服务注册中心,使用注解@EnableEurekaServer,这个注解需要在springboot工程的启动application类上加

  • 访问:http://localhost:8761 观察Spring Eureka服务注册中心

clipboard.png

创建服务提供者

  • 当client向server注册时,会提供一些元数据,如主机和端口,URL,主页等

  • Eureka server从每个client实例接收心跳信息,如果心跳超时则将该实例从注册server中删除

  • 创建wind-client项目,过程同server类似

  • 配置application.yml 端口8762

  • 在启动类上加@EnableEurekaClient,表明是一个eureka client

  • 在启动类中添加测试方法:home

  • 启动并访问:http://localhost:8762/hi?name...

ribbon

  • 在服务架构中,业务都会被拆分成一个独立的服务,服务和服务的通讯是基于http restful的

  • cloud有两种调用方式:ribbon+restTemplate和feign

  • ribbon是一个负载均衡客户端,可以很好的控制http和tcp的一些行为

  • feign也用到了ribbon,当你使用@FeignClient,ribbon自动被应用

  • 启动wing-server和wind-client,更改wind-client端口为8763并启动,在服务注册中心就会有两个服务,模拟出一个小的集群

  • 创建服务消费者:wind-ribbon 过程同上

  • 配置服务application.yml

  • 在启动类上加注解@EnableDiscoveryClient,向服务中心注册一个新的服务,这时wind-ribbon既是服务提供者也是服务消费者

  • 在启动类中注册了一个bean: restTemplate;通过@LoadBalanced注册表明,这个restRemplate是负载均衡的

  • 新建测试类HelloControler和HelloService

  • 启动并访问:http://localhost:8764/hi?name...

  • 连续访问:页面交替出现Hi Apolo,I am from port:8762和Hi Apolo,I am from port:8763

  • 此时的项目架构:

    • 一个服务注册中心,wind-server,端口8761

    • wind-client工程跑了两个副本,端口分别为8762、8763,分别向服务注册中心注册

    • wind-ribbon端口为8764,向服务注册中心注册

    • 当wind-ribbon通过restTemplate调用wind-client的hi接口时,因为用ribbon进行负载均衡,会轮流调用wind-client:8762和8763端口的hi接口

feign

  • Feign是一个声明式的web服务客户端,它使得写web服务变得更简单

  • 只需创建一个接口并注解,具有可插拔的注解特性,包括Feign注解和JAX-RS注解

  • 同时支持可插拔的编码器和解码器

  • 当使用Feign的时候,Spring Cloud整合了Ribbon和Eureka去提供负载均衡

  • 启动wind-server,端口为8761; 启动wind-client 两次,端口分别为8762 、8773.

  • 创建项目:wind-feign 过程同上并添加spring-cloud-starter-feign和spring-boot-starter-web到pom.xml

  • 配置服务application.yml

  • 在启动类上加注解@EnableFeignClients开启feign,向服务注册中心注册,wind-feign是服务者和消费者

  • 定义一个feign的接口类,使用@FeignClient(“服务名”)来指定调用哪个服务

  • 启动并访问:http://localhost:8765/hi?name... 浏览器交替显示不同端口

  • 更改feign配置

    • 在声明feignclient的时候,不仅要指定服务名,同时需要制定服务配置类 StoreClient

    • 重写配置,需要加@Configuration注解,并重写下面的两个bean 例子:FooConfiguration

断路器

clipboard.png

出现的背景

  • 在微服务架构中,将业务拆分成一个个的服务,服务与服务之间可以相互调用(RPC)

  • 为了保证高可用,高并发服务,单个服务需要集群部署

  • 由于网络原因或服务自身的原因,不能保证100%的可用,若单个服务出现问题,调用这个服务就会出现网络延迟,

    此时若有大量请求,会形成任务累计,导致服务瘫痪,甚至导致服务"雪崩"
  • 为解决服务"雪崩"的问题,出现了断路器模型

  • Netflix创建了一个Hystrix库来实现断路器模式。多层服务调用常见于微服务架构中

  • 较底层的服务如果出现故障,会导致连锁故障。当对特定的服务调用达到一个阀值(hystrix是5秒20次)断路器将会打开

  • 断路器打开之后,可以避免连锁故障,fallback方法可以直接返回一个固定值

在ribbon中使用

  • 启动wind-server 工程;启动wind-client工程,它的端口为8762

  • 改造wind-ribbon工程

    • pom.xml文件中添加 spring-cloud-starter-hystrix

    • 程序入口(启动类)添加注解@EnableHystrix

    • 服务类HelloService,服务方法上加注解@HystrixCommand,并指定fallbackMethod,返回固定值

  • 启动并访问:http://localhost:8764/hi?name...

    • 正常:Hi Apolo,I am from port:8762

    • 关闭wind-client服务:Hi,Apolo,sorry,error! 断路器生效了

在feign中使用

监控管理

  • Circuit Breaker: Hystrix Dashboard (断路器:hystrix 仪表盘)

路由网关(zuul)

介绍

  • 微服务架构的关键组件:服务注册与发现、服务消费、负载均衡、断路器、智能路由、配置管理,由这几个组件可以组成一个简单的微服务架构

  • 客户端请求 --> 经过负载均衡(zuul、Ngnix) --> 到达服务网关(zuul集群) --> 到具体服务

  • 服务统一注册到高可用服务注册中心集群

  • 服务的所有配置文件由配置服务管理,配置文件存储在git仓库,方便开发人员随时更改

Zuul简介

  • Zuul的主要功能是路由和过滤器

  • 路由功能是微服务的一部分,如/api/user映射到user服务,/api/shop映射到shop服务

  • Zuul也实现了负载均衡

Zuul使用

  • 创建wind-zuul项目,pom文件添加spring-cloud-starter-zuul

  • 启动类上添加注解@EnableZuulProxy,启动zuul

  • 添加配置文件application.yml

    • 首先向eureka注册自己,端口8769,服务名service-zuul

    • 以/api-a/开头的路由指向service-ribbon

    • 以/api-b/开头的路由指向service-feign

  • 一次启动5个工程,分别访问
    http://localhost:8769/api-a/h...
    http://localhost:8769/api-b/h...
    结果一致,表明路由起作用了

Zuul服务过滤

源码下载:

参考:http://blog.csdn.net/forezp/a...

春雨中抽出来的柳条,娇艳欲滴
此时的烈日下,显得憔悴而慵懒
两岸的游人稀少,都躲在树下
烈日、大树下,一阵风来,童年的记忆浮现
                2017-07-14

麦冬
315 声望13 粉丝

越成熟的稻穗,越饱满厚实