spring cloud《五》

spring cloud 是基于spring boot 的一整套实现微服务的框架。它提供了微服务开发所需的配置管理,服务发现,断路器,智能路由,微代理,控制总线,全局锁,决策竞选,分布式会话,和集群状态管理组建。

spring cloud有众多的子项目,各自之间都有自己的版本号,为了方便统一由spring-cloud-dependencied进行管理,使用时只需引入具体的依赖而不需要提供版本号。

dependency Management是maven 用于管理依赖的一种方式,它只申明依赖并不直接引入。

spring boot 与spring cloud 版本依赖关系如下:

spring boot 与spring cloud 版本依赖关系如下

Angel版本对应spring boot 1.2x

Brixton 版本对应spring boot 1.3x

Camden版本对应spring boot 1.4x

Dalston版本对应spring boot 1.5x

注册中心:与dubbo 一样,spring cloud 支持zookeeper 作为注册中心,但官方更推荐spring cloud netflix 的Eureka。

spring cloud netflix 是spring cloud 的子项目之一,主要内容是对Netflix 公司一系列开源产品的包装,它为spring boot 应用提供了自配置的Netflix oss 整合。通过一些简单的注解,开发者就可以快速的在应用中配置一些常用模块并构建庞大的分布式系统。它主要提供的模块包括:服务发现(Eureka),断路器(Hystrix),智能路由(zuul),客户端负载均衡(Ribbon)等。

创建项目:new--project--spring initializr--1.8--next--projectName --cloud discovery--eureka server--finished。【创建项目后一定将@EnableEurekaServer 加在启动类的上面,不然启动不了/配置文件加在<dependencyManagement>标签中】。

eureka.instance.hostname:使用主机名广播服务。
eureka.instance.prefer-ip-address:使用IP地址广播服务。
eureka.client.register-with-eureka:是否注册到eureka服务器,由于应用本身就是注册中心,所以设置为false。
eureka.client.fetch.registry:是否从eureka服务器检索服务。由于本应用的智能就是维护服务实例,所以设置为false。
eureka.client.service.url:

用于服务注册和服务检索的地址。其中service-url后面需要的是一个Map<String,String> 类型参数,所以defaultZone可以自己定义。${server.port}使用spring EL来获取上面已配置的server.port 参数值。可以通过设置http://username:password@localhost:${server.port}/eureka/为注册于或与服务增加http基础身份验证。

eureka.server.enable-self-preservation:是否关闭eureka自我保护模式。当网路产生波动无法请求成功但服务提供方并未崩溃时,自我保护模式并不会删除已在eureka注册表中注册的服务。在对应用频繁的开发环境中建议关闭,生产环境中开启。
eureka.server.eviction-interval-time-in-ms:服务清理间隔(单位:毫秒,默认:60*1000)。
eureka.instance.lease-renewal-interval-in-seconds:设置服务租约时间(单位:秒,默认:30).开发环境中可以降低比此参数以加快服务注册过程,但生产环境中建议保持默认值。

集群配置:多个eureka server 之间通过eureka.client.service-url 互相注册便可实现集群部署。

eureka server 1配置:

server.port=8082
eureka.instance.prefer-ip-address=true
eureka.client.service-url.defaultZone=http://loclhost:8081/eureka/

eureka.server 2配置:

server.port=8082
eureka.instance.prefer-ip-address=true
eureka.client.service-url.defaultZone=http://loclhost:8082/eureka/

如果由多个eureka server,则再注册时使用逗号分隔,将除自身外的其他所有eureka server 地址进行配置。如下示例:

 
server.port=8082
eureka.instance.prefer-ip-address=true
eureka.client.service-url.defaultZone=http://loclhost:8081/eureka/,http://loclhost:8082/eureka/

注册服务:spring cloud 基于http协议的restful 风格的api 进行服务之间的通信,在注册服务时会明显的发现与编写的spring controller没有太大区别。

创建项目:new--project--spring initializr--1.8--next--projectName--cloud discovery--eureka discovery--next--finished。

@EnableDiscoveryClient :开启 DiscoveryClient 的实例,与eureka server 进行交互,负责注册服务,租约续期,检索服务,取消租约等。
在application.properties 配置如下:
 
spring.application.name=SERVER-NAME
server.port=${PORT:${server_port:0}}
eureka.client.service-url.defaultZone=http://localhost:8082/eureka

spring.application.name:应用名称,在服务调用时将使用此参数做依赖计算。

server.port:应用访问端口号。 ${PORT:${server_port:0}}表示自动分配一个未使用的端口,如果需要直接访问该服务则提供一个具体的端口号即可。
eureka.client.service-url:注册中心所在地址,如果eureka为集群,则通过逗号分隔配置所有的注册中心地址。

调用服务:各个微服务模块都是以HTTP协议暴露服务的,调用服务时只需使用类似jdk的URLConnection或spring 的RestTemplate(http 客户端)便可,而spring cloud netflix 则提供了ribbon 与feign工具来简化调用过程,并且支持客户端负载均衡,熔断等功能。

每一个spring cloud 应用都需要引入eureka discovery来介入到eureka运行环境中,所以需要在sprig boot 入口处通过@EnableDiscoveryClient 注解添加发现服务能力,并且在application.properties 中配置eureka 地址,应用名称,访问端口等基本信息。

ribbon:ribbon 是一个基于HTTP和TCP客户端的负载均衡器,通过客户端中配置的ribbon Server List服务端列表去轮询访问可以达到负载均衡的作用。

                                                                                 ribbon 核心组件:

名称

意义

Rule

从服务列表中如何获取一个有效服务

Ping

后台运行线程用来判断服务是否可用

Server List

服务列表

RestTemplate :通过spring 自带的rest客户端,可以方便的发起HTTP请求并且将结果序列化。

@LoadBalanced :该注解将开启ribbon 的负载均衡模式。开启后ribbon将拦截resttemplate 发起的请求,并实现负载均衡。

http://SERVER/hello?param=cloud 是服务具体所在地址及传递的参数,与URL不同的是原本主机名+端口的地址变成服务名称server,由此可以推断出ribbon 客户端根据服务名称从eureka注册中心寻找具体服务地址。在有多个服务提供者时由eureka 注册中心的服务列表与ribbon配合完成负载均衡。

application.properties 文件中配置ribbon,当请求失败时,如下配置可以让ribbon重试链接及更换其他服务提供方:

spring.cloud.loadbalancer.retry.enabled=true
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000
ribbon.ConnectTimeout=250
ribbon.ReadTimeout=1000
ribbon.OkToRetryOnAllOperations=true
ribbon.MaxAutoRetriesNextServer=2
ribbon.MaxAutoRetries=1

名称

解释

spring.cloud.loadbalancer.retry.enabled

是否开启重试机制,默认为关闭

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds

断路由的超时时间,需要大于ribbon的超时时间,否则不会触发重试

ribbon.ConnectTimeout

请求链接的超时时间

ribbon.ReadTimeout

请求处理的超时时间

ribbon.OkToRetryOnAllOperations

对所有操作请求都进行重试

ribbon.MaxAutoRetriesNextServer

重试负载均衡其他实例的最大重试次数,不包括首次调用

ribbon.MaxAutoRetries

同一个服务提供方最大重试次数,不包括首次调用

配置ribbon 负载均衡策略:

@Configuration
public class RibbonConfiguration {
    @Bean
    public IRule ribbonRule(){
        return new BestAvailableRule();
    }
}

Ribbon提供多种负载策略,由IRule进行管理。通过继承ClientConfigEnabledRoundRobinRule可自定义负载策略。

BestAvailableRule:最大可用策略,即先过滤出故障服务器,然后选择一个当前并发请求数最小的。
AvailabilityFilteringRule:可用过滤策略,先过滤出故障或并发请求大于阀值的一部分服务实例,然后再以线性轮询的方式从过滤后的实例清单中选出一个。
WeightedResponse timeRule:带有加权的轮询策略,对各个服务器响应时间进行加权处理,然后再采用轮询的方式来获取响应的服务器。
RetryRule:在选定的负载均衡策略机上重试机制。
RoundRoBinRule:以轮询的方式依次将请求调度不同的服务器(默认策略)
RandomRule:随机选择一个服务提供方。
ZoneAvoidanceRlue:区域感知轮询负载均衡。
@EnableDiscoveryClient
@RibbonClients(defaultConfiguration = RibbonConfiguration.class)
@SpringBootApplication
public class CloudClientApplication {

    @Bean
   @LoadBalanced
   public RestTemplate restTemplate(){
       return new RestTemplate();
    }

   public static void main(String[] args) {
      SpringApplication.run(CloudClientApplication.class, args);
   }
}

defaultConfiguration 为负载策略配置文件。

如果希望针对某一具体服务配置负载均衡,可以使用CribbonClient注解单独配置:

@Configuration
@RibbonClient(name = "SERVER",configuration = RibbonConfiguration.class)
public class TestConfiguration {
}
name为服务名称,configuration为负载策略配置文件。

Feign:feign 是一个声明式的web服务客户端,通过简单的注解便可像调用本地方法一样调用远程服务。spring cloud为feign添加了spring mvc 的注解支持,并整合了ribbon 和eureka来为feign提供负载均衡功能。

创建项目:new--project--spring initializr--1.8--next--projectName--cloud Routing--feign--next--finished。

@EnableFeignClients:将自动扫面所有@FeignClient注解。

通过接口告知Figin调用信息,定义的方法则是来自于服务提供方暴露的具体服务方法(rest Controller)

@FeignClient(name = "SERVER")
public interface ServerClient {
    @RequestMapping(value = "hello")
    public String hello(@RequestParam("param")String param);
}

Name

服务提供方的应用名称

url

手动指定调用地址

Decode404

是否开启decoder解码。为true时,当请求发生404错误会调用decoder进行解码;否则抛出feignException

configuration

指定配置类,用于自定义encoder,decoder,loglevel,Contract

path

定义当前fegin调用时的统一前缀

Fallback

指定容错处理类,用于减少重复的容错处理类编写

在application.properties中配置Fegin实例:

feign.compression.request.enabled=true
feign.compression.response.enabled=true
feign.compression.request.mime-types=text/xml,application/xml,application/json
feign.compression.request.min-request-size=2048

feign.compression.request.enabled

开启请求压缩

feign.compression.response.enabled

开启返回值压缩

feign.compression.request.mime-types

设置压缩类型

feign.compression.request.min-request-size

设置压缩最小阀值

调用服务:

@Autowired
private ServerClient serverClient;
public String say(){
    return serverClient.hello("could");
}

spring cloud 应用启动时,feign 会扫描标有@feignClient 注解的接口生成代理,为每个接口方法创建一个RequestTemplate对象,并封装发起http请求时所需的所有信息,最终注册到spring容器中

zuul 网关:spring cloud 提供了zuul 作为服务网关,与dubbo服务网关不同的是,zuul 并不是直接调用服务,而是通过动态路由提供代理服务,在具体开发过程中也更为简单。

创建项目:new--project--spring initializr--1.8--next--projectName--cloud Routing--zuul--next--finished。

@EnableZuulProxy:设置一个zuul的服务端点,并开启反向代理过滤器,以达到将请求转发到后端的服务提供方的目的。

application.properties:

spring.application.name=geteway
server.port=8083
eureka.client.service-url.defaultZone=http://localhsot:8082/eureka

zuul.routes.SERVER.path=/server/**
zuul.routes.SERVER.service-id=SERVER
zuul.routes.*.path

拦截请求的路径,其中*为自定义的分组标记,用于路由配置

zuul.routes.*.service-id

根据分组标记(server)将拦截到的请求转发到某服务提供方的名称。

Zuul.routes.*url

根据分组标记(server)将拦截到的请求转发到一个具体的URL地址。

过滤器权限验证:通过集成zuulFilter类 实现过滤功能,与spring mvc 的handlerInterceptor 类似

ShouldFilter()

返回一个Boolean值,标记该过滤器是否开启

filterType

pre

在请求被路由之前调用

Routing

在路由时候被调用

Error

处理请求时发生错误时被调用

Post

在routing和error过滤器之后被调用

filterOrder()

返回一个int,标识该过滤器在过滤器链中执行的顺序

Run()

过滤器的具体逻辑

ctx.setResponseBody("token error");

设置请求返回值

ctx.setSendZuulResponse(false);

设置不对该请求进行路由操作

hystrix 断路由:当远程请求失败时,dubbo 通过mock 实现服务降级与容错,而spring cloud 则提供hystrix 达到同样的目的。与之不同的是hystrix是以框架级别角度解决该问题,而mock则是以功能角度出发。

hystrix通过线程池来隔离资源,在使用时会根据调用的远程服务划分出多个线程池。例如:调用产品服务的command 放入A线程池,调用账户服务的放入B线程池。当调用服务的代码存在bug 或者其他原因导致自己所在线程池被耗尽,不会对系统的其他服务造成影响。

@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public class CloudClientApplication {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(CloudClientApplication.class,args);
    }

    @HystrixCommand(fallbackMethod = "fallback")
    public String say(){
        return restTemplate().getForObject("http://SERVER/hello?param=cloud",String.class);
    }
    public String fallback(){
        return "容错数据";
    }
}

@EnableCircuitBreaker:开启熔断器。

调用服务:ribbon 调用服务发生错误时,熔断机制生效,将调用由注解@HystrixProperty()参数以kv 形式配置。

application.properties:

spring.application.name= CLIENT
server.port=8889
eureka.client.service-url.defaultZone=http://localhost:8082/eureka

hystrix.command.default.execution.isolation.strategy=THREAD
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=1000
hystrix.command.default.execution.timeout.enabled=true
hystrix.command.default.execution.isolation.thread.interruptOnTimeout=true
hystrix.command.default.fallback.enabled=true
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=5000
hystrix.command.default.circuitBreaker.errorThresholdPercentage=50
hystrix.command.default.circuitBreaker.forceOpen=false
hystrix.command.default.circuitBreaker.forceClosed=false
hystrix.threadpool.default.coreSize=10
fallbackMethod

指定一个处理回退逻辑的方法,回退方法应与需要熔断功能的方法具有相同返回值,并且要在同一个类中

CommandKey

该熔断器的名称,默认为default

Groupkey

服务所属分组

IgnoreExceptions

调用时发生异常,则触发熔断机制,此参数可设置排除的异常

threadPoolKey

为该熔断器分配一个自定义名称,配置资源隔离策略时使用

ThreadPoolProperties

配置该熔断器的线程池参数。接受多个

实例:threadPoolProperties={@ HystrixProperty(name=”coreSize”,value=”30”)}

coreSize

核心线程池大小和线程池最大值

MaxQueueSize

线程池队列最大值

KeepAliveTimeMinutes

线程池中空闲线程生存时间

QueueSizeRejectionThreshold

限定当前队列大小

Hystrix.command.*.execution.isolation.strategy

设置熔断器的资源隔离策略

Thread

并发请求受线程池中的线程数量的限制(默认及推荐项)

Semaphore

并发请求受到信号量计数的限制

参数中command后的default为注解中@HystrixCommand的commandKey参数设置的值,默认为default

Hystrix.command*.execution.isolation.thread.timeoutInMilliseconds

超时时间

Hystrix.command*.execution.timeout.enabled

是否开启超时

Hystrix.command*.execution.isolation.thread.interruptOnTimeout

是否打开超时线程中断

Hystrix.command*.fallback.enabled

设置fallback是否可用

hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds

触发熔断的时间间隔

hystrix.command.default.circuitBreaker.errorThresholdPercentage

错误比率阀值,当错误超过或等于该值时,后续的请求将直接调用fallback

hystrix.command.default.circuitBreaker.forceOpen

强制打开熔断器,打开后将强制执行fallback

hystrix.command.default.circuitBreaker.forceClosed

强制关闭熔断器

hystrix.threadpool.default.coreSize

核心线程池大小和线程池最大值

Fegin:figin已经集成了ribbon 和hystrix 依赖,在dalston 版本中默认并未开启,秩序简单配置便可实现熔断功能。

fegin通过接口确定调用信息,回调类只需要实现接口便可,与dubbo 的mock 类似,但不限制回调类的名称。

@Component
public class ServerClientFallback implements ServerClient {
    @Override
    public String hello(String param) {
        return "容错数据";
    }
}

另外还可以通过实现FallbackFactory 接口,在create 方法中返回服务接口的实例以实现回调。

public class DefaultFallback implements FallbackFactory<Object> {
    @Override
    public ServerClient create(Throwable throwable) {
        return new ServerClient() {
            @Override
            public String hello(String param) {
                return "容错数据";
            }
        };
    }
}
@FeignClient(name = "SERVER",fallback = ServerClientFallback.class,fallbackFactory = DefaultFallback.class)
public interface ServerClient {
    @RequestMapping(value = "hello")
    public String hello(@RequestParam("param")String param);
}

fallback 指定具体的回调类,即当前接口的实现类。

fallbackFactory:指定回调工厂的实现类,即实现FallbackFactory接口的类。

在application.properties中开启熔断器:feign.hystrix.enabled=true

fallbackMethod

指定一个处理回退逻辑的方法,回退方法应与需要熔断功能的方法具有相同返回值,并且要在同一个类中

CommandKey

该熔断器的名称,默认为default

Groupkey

服务所属分组

IgnoreExceptions

调用时发生异常,则触发熔断机制,此参数可设置排除的异常

threadPoolKey

为该熔断器分配一个自定义名称,配置资源隔离策略时使用

ThreadPoolProperties

配置该熔断器的线程池参数。接受多个

实例:threadPoolProperties={@ HystrixProperty(name=”coreSize”,value=”30”)}

coreSize

核心线程池大小和线程池最大值

MaxQueueSize

线程池队列最大值

KeepAliveTimeMinutes

线程池中空闲线程生存时间

QueueSizeRejectionThreshold

限定当前队列大小

Hystrix.command.*.execution.isolation.strategy

设置熔断器的资源隔离策略

Thread

并发请求受线程池中的线程数量的限制(默认及推荐项)

Semaphore

并发请求受到信号量计数的限制

参数中command后的default为注解中@HystrixCommand的commandKey参数设置的值,默认为default

Hystrix.command*.execution.isolation.thread.timeoutInMilliseconds

超时时间

Hystrix.command*.execution.timeout.enabled

是否开启超时

Hystrix.command*.execution.isolation.thread.interruptOnTimeout

是否打开超时线程中断

服务监控:将一个应用部署多次,以满足服务高可用需求,而监控每个应用的运行状态则是必不可少的事。因此spring cloud 已经对每个应用的运行状态做了统计,并提供了简单的图形化界面管理工具。同时活跃的spring社区为spring cloud提供了spring-cloud-admin 集成管理工具,低侵入的方式只需简单配置便可完成对分布式环境中各应用的监控。

主要功能如下

显示应用信息

显示在线状态

日志级别管理

Jmx beans 管理

会话和现场管理

应用请求跟踪

应用运行参数信息

显示熔断器信息

spring cloud admin 可以通过eureka 注册中心的数据或专门提供的客户端获取应用信息。在spring cloud 环境下eureka 是最优选择,而客户端方式则常用于spring boot 应用中。

@EnableAdminServer 标识当前应用时spring cloud 监控应用。

application.properties文件配置admin:

spring.application.name=ADMIN
server.port=8082
eureka.client.service-url.defaultZone=http://localhost:8082/eureka

配置客户端:

监控应用中的数据来自于eureka注册中心,所以要对所有eureka 应用进行相应的配置。【再spring boot 入口处添加过 @EnableDiscoveryClient 注解的应用】

再在各位服务应用的pom.xml 文件中设置暴露应用基本信息:

上一章:Dubbo 《四》_welcome to 一点点 home-CSDN博客

下一章:数据持久化《六》_welcome to 一点点 home-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值