资讯专栏INFORMATION COLUMN

Spring Cloud 体验

NotFound / 3356人阅读

摘要:多层服务调用常见于微服务架构中较底层的服务如果出现故障,会导致连锁故障。

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

启动并访问: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

断路器

出现的背景

在微服务架构中,将业务拆分成一个个的服务,服务与服务之间可以相互调用(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服务观察

为什么默认关闭:

http://www.cnblogs.com/devzxd...

https://github.com/spring-clo...

监控管理

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

源码下载:

百度云盘地址:链接:http://pan.baidu.com/s/1dEI9oqP 密码:va9l

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67376.html

相关文章

  • 部署微服务:Spring Cloud vs. Kubernetes

    摘要:而微服务架构能否成功实践,利用各种工具解决潜在问题是关键。因此,微服务本身可以通过库和运行时代理解决客户端服务发现负载均衡配置更新统计跟踪等。与相比,解决了更广的微服务架构问题。和处理了不同范围的微服务架构技术点,而且是用了不同的方法。 Spring Cloud vs. Kubernetes,谁才是部署微服务的最佳拍档? Spring Cloud和Kubernetes都声称自己是开发和...

    YanceyOfficial 评论0 收藏0
  • 分布式微服务架构选项

    摘要:分布式架构五大核心套件服务发现云端服务发现,一个基于的服务,用于定位服务,以实现云端中间层服务发现和故障转移。 1 后端技术框架我们选择Spring Cloud作为微服务的分布式架构:Spring Cloud vs Dubbo? 背景 Dubbo,是阿里巴巴服务化治理的核心框架,并被广泛应用于阿里巴巴集团的各成员站点。Spring Cloud,是Spring Source的产物...

    Rocture 评论0 收藏0
  • 分布式微服务架构选项

    摘要:分布式架构五大核心套件服务发现云端服务发现,一个基于的服务,用于定位服务,以实现云端中间层服务发现和故障转移。 1 后端技术框架我们选择Spring Cloud作为微服务的分布式架构:Spring Cloud vs Dubbo? 背景 Dubbo,是阿里巴巴服务化治理的核心框架,并被广泛应用于阿里巴巴集团的各成员站点。Spring Cloud,是Spring Source的产物...

    Labradors 评论0 收藏0
  • EDAS再升级!全面支持Spring Cloud应用

    摘要:摘要近日,阿里中间件的企业级分布式应用服务宣布再次升级,全面支持应用。在阿里巴巴的使用历史可以追溯到年,并且成功通过了每年双海量应用的严峻考验。经过多年的历练,目前已经成为阿里巴巴主要的分布式应用服务工具,日均调用超千亿次。 摘要: 近日,阿里中间件(Aliware)的企业级分布式应用服务EDAS宣布再次升级,全面支持Spring Cloud应用。 点此查看原文:http://clic...

    _DangJin 评论0 收藏0
  • Spring Cloud Alibaba基础教程:支持的几种服务消费方式

    摘要:那么为什么可以带给我们这样的完美编码体验呢实际上,这完全归功于的封装,由于在服务注册与发现客户端负载均衡等方面都做了很好的抽象,而上层应用方面依赖的都是这些抽象接口,而非针对某个具体中间件的实现。 通过《Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现》一文的学习,我们已经学会如何使用Nacos来实现服务的注册与发现,同时也介绍如何通过LoadBala...

    curlyCheng 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<