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服务注册中心
创建服务提供者
当client向server注册时,会提供一些元数据,如主机和端口,URL,主页等
Eureka server从每个client实例接收心跳信息,如果心跳超时则将该实例从注册server中删除
创建wind-client项目,过程同server类似
配置application.yml 端口8762
在启动类上加@EnableEurekaClient,表明是一个eureka client
在启动类中添加测试方法:home
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
连续访问:页面交替出现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
断路器
出现的背景
在微服务架构中,将业务拆分成一个个的服务,服务与服务之间可以相互调用(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中使用
-
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)
介绍
微服务架构的关键组件:服务注册与发现、服务消费、负载均衡、断路器、智能路由、配置管理,由这几个组件可以组成一个简单的微服务架构
客户端请求 --> 经过负载均衡(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服务过滤
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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。