Spring Cloud为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、html
事件总线、全局锁、决策竞选、分布式会话等等
基于Spring Boot,Spring Cloud将各公司成熟服务框架组合起来,经过Spring Boot风格封装屏蔽掉了复杂的java
配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包
开发工具:Spring Tool Suitegit
右键 > New > Spring Starter Project > name:wind-server >github
next:选择cloud discovery->eureka server > Finish
配置服务application.ymlweb
启动一个服务注册中心,使用注解@EnableEurekaServer,这个注解须要在springboot工程的启动application类上加spring
访问:http://localhost:8761 观察Spring Eureka服务注册中心api
当client向server注册时,会提供一些元数据,如主机和端口,URL,主页等浏览器
Eureka server从每一个client实例接收心跳信息,若是心跳超时则将该实例从注册server中删除安全
建立wind-client项目,过程同server相似springboot
配置application.yml 端口8762
在启动类上加@EnableEurekaClient,代表是一个eureka client
在启动类中添加测试方法:home
在服务架构中,业务都会被拆分红一个独立的服务,服务和服务的通信是基于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
连续访问:页面交替出现Hi Apolo,I am from port:8762和Hi Apolo,I am from port:8763
此时的项目架构:
一个服务注册中心,wind-server,端口8761
wind-client工程跑了两个副本,端口分别为876二、8763,分别向服务注册中心注册
wind-ribbon端口为8764,向服务注册中心注册
当wind-ribbon经过restTemplate调用wind-client的hi接口时,由于用ribbon进行负载均衡,会轮流调用wind-client:8762和8763端口的hi接口
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
在微服务架构中,将业务拆分红一个个的服务,服务与服务之间能够相互调用(RPC)
为了保证高可用,高并发服务,单个服务须要集群部署
因为网络缘由或服务自身的缘由,不能保证100%的可用,若单个服务出现问题,调用这个服务就会出现网络延迟,
此时如有大量请求,会造成任务累计,致使服务瘫痪,甚至致使服务"雪崩"
为解决服务"雪崩"的问题,出现了断路器模型
Netflix建立了一个Hystrix库来实现断路器模式。多层服务调用常见于微服务架构中
较底层的服务若是出现故障,会致使连锁故障。当对特定的服务调用达到一个阀值(hystrix是5秒20次)断路器将会打开
断路器打开以后,能够避免连锁故障,fallback方法能够直接返回一个固定值
启动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自带断路器,默认是关闭的
打开,添加配置:feign.hystrix.enabled=true
使用,服务接口SchedualServiceHi注解上添加fallback的指定类SchedualServiceHiHystric
启动并访问:http://localhost:8765/hi?name...,开启关闭wind-client服务观察
为何默认关闭:
Circuit Breaker: Hystrix Dashboard (断路器:hystrix 仪表盘)
监控各个hystrixcommand的各类值
经过dashboards的实时监控来动态修改配置
改造wind-ribbon项目
pom文件添加spring-cloud-starter-hystrix-dashboard
启动类添加注解@EnableHystrixDashboard开启断路器仪表盘
启动访问:http://localhost:8764/hystrix 看到小熊界面
输入http://localhost:8764/hystrix... 点击monitor stream进入监控界面
访问http://localhost:8764/hi?name...,观察监控页面
微服务架构的关键组件:服务注册与发现、服务消费、负载均衡、断路器、智能路由、配置管理,由这几个组件能够组成一个简单的微服务架构
客户端请求 --> 通过负载均衡(zuul、Ngnix) --> 到达服务网关(zuul集群) --> 到具体服务
服务统一注册到高可用服务注册中心集群
服务的全部配置文件由配置服务管理,配置文件存储在git仓库,方便开发人员随时更改
Zuul的主要功能是路由和过滤器
路由功能是微服务的一部分,如/api/user映射到user服务,/api/shop映射到shop服务
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不只是路由,还能过滤,作安全验证
增长过滤MyFilter.java 继承ZuulFilter 加注解@Component
访问:http://localhost:8769/api-a/h... 结果:token is empty
访问:http://localhost:8769/api-a/h... 结果:Hi Apolo,I am from port:8763
春雨中抽出来的柳条,娇艳欲滴 此时的烈日下,显得憔悴而慵懒 两岸的游人稀少,都躲在树下 烈日、大树下,一阵风来,童年的记忆浮现 2017-07-14