Netflix组件总结,cloud方案思考

 DynamicServerListLoadBalancer 

upms例子

  • 需要引入dubbo xml配置,引入jar包
  • 理想模型,和springboot一样引入jar,配置yml就可以
  • 需要可以加入@EnableUpms这样的注解更方便控制

源码地址

  • 请求经过zuul,反向代理到内部其他子服务 [需要网关后台配置子服务IP]
  • 内部服务调用dubbo;内部框架新项目已经全部迁移到spring-boot

spring-boot简介

zuul

  • 默认整合了Eureka、Ribbon、Hystrix等,可以实现如下功能:
    • 身份认证与安全
    • 审查与监控
    • 动态路由
    • 压力测试
    • 负载分配
    • 静态响应处理
    • 多区域弹性
  • 如果依赖了spring
    security,则默认会忽略:Pragma、Cache-Control、X-Frame-Options、X-Content-Type-Options、X-XSS-Protection、Expires等头信息。
  • 如果代理文件上传,需要注意上传大小、超时时间等
  • 可以自定义实现熔断、回退。
  • 可以实现请求的聚合,但一般不会这么做,耦合服务
  • 默认使用Apache的HTTPClient发起http请求,可以使用RestClient或者OkHttpClient,通过配置ribbon.[restclient|okhttp].enabled=true进行切换
  • /routes 端点可以管理zuul路由 POST会强制刷新路由,GET返回列表
    [注:需要设置 management.security.enabled=false]
  • 路由配置支持,指定服务,正则,忽略指定服务,增加前缀等;也可以自定义实现;header可控
  • 过滤器:PRE(请求前)、ROUTING(将请求路由到服务,用于构建发给服务的请求,可以使用httpClient或ribbon)、POST(可以添加响应header等)、ERROR(发生错误时执行)和自定义过滤器
  • 禁用过滤器:zuul.[过滤器类名].[过滤器类型].disabled=true即可,zuul默认有:DebugFilter、FormBodyWarpperFilter、PreDecorationFilter等过滤器位于filters包下
  • 在工程中创建一个新的模块upms-cloud-api
  • upms-cloud-api引用原来给dubbo服务的upms-api

配置中心

澳门网上正规赌场网址 1

image.png

  • 当前业务系统不是很多,管理还是可以控制
  • 当一个集群有几百台,修改配置是一件很麻烦的事情
  • 配置中心的优势,配置变量的灰度就有了很大的优势
  • 推荐:
    https://github.com/ctripcorp/apollo
  • 演示

zipkin

  • 链路监控收集 配合 sleuth使用
  • 可以指定采样的请求百分比,默认0.1,即10%
  • eureka http rest
    api

缺点

  • 使用简单,学习难度增加,用好用灵活不是很简单

hystrix

  • 熔断,基于archaius实现动态配置
  • 通过/health基于查看断路器是否打开,默认是5秒内20次失败,则会打开
  • dashboard监控单个,turbine聚合多个
  • turbine可以配置mq进行收集信息,客户端需要引入mq,修改注解为@EnableTurbineStream,并移除配置,采用mq配置即可
  • 属性说明地址:
  • 线上需要部署三台或者两台,集群部署

groot commmon

  • 统一api基础使用规范
  • 屏蔽web层封装,简单处理统一异常

ribbon

  • 负载均衡 配合 eureka 实现通过虚拟机主名称调用服务
  • 虚拟主机名称不能有”_”,否则调用时会报错
  • 澳门网上正规赌场网址,自定义ribbon属性
    clientName.ribbon.[ILoadBalancer|IRule|IPing|ServerList|ServerListFilter]实现类
  • 支持其他非eureka支持的
    实现负载均衡,只需配置clientName.ribbon.listOfServers:[host:port,host2:port2]

spring cloud

澳门网上正规赌场网址 2

image.png

eureka

  • 实现cap中的ap,每个客户端都有一份副本,这样不会在server挂了不可用;
  • 默认90秒没收到服务的心跳信息则会注销该服务,提供自我保护模式,防止网络异常导致注销大量服务;
  • client默认30秒向server发送心跳;
  • client会缓存服务注册表中的信息,可以提高性能,降低server压力,高可用;
  • 主要配置:
    • eureka.client.registerWithEureka是否将自己注册到server,默认true
    • eureka.client.fetchRegistry是否从server获取信息,默认true
    • eureka.client.serviceUrl.defaultZone设置server地址
    • eureka.client.healthcheck.enabled是否开启健康检查,即调用/health来确定是否服务可用,而不只通过心跳来检测
    • eureka.instance.leaseRenewalIntervalInSeconds设置服务注册心跳秒数,默认30秒
  • 配合security增加用户认证
  • 提供REST端点,集成其他非JAVA微服务
  • 提供多网卡环境配置
  • eureka说明地址:

集成分布式追踪

  • 使用zipkin
  • 部署zipkin server

<dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-server</artifactId> </dependency> <dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-autoconfigure-ui</artifactId> </dependency>

@SpringBootApplication@EnableZipkinServerpublic class ZipkinApplication { public static void main(String[] args) { SpringApplication.run(ZipkinApplication.class, args); }}
  • 访问:

目前现状

  • springboot + dubbo

环境信息

  • eureka-server
    • 2台 30000 30001
  • u-service
    • 2台 30002 30003
  • u-consumer
    • 2台 30004 30005
  • zipkin
    • 1台 30006
  • hystrix-dashboard
    • 1台 30008
  • turbine
    • 1台 30010
  • zuul
    • 2台 30012 30013
  • sidecar
    • 2台 30014 30015
  • dubbo

    • 2台 30016 30017
  • 注意:hystrix、ribbon、zuul等即代理,遇到文件上传,需要主要timeout设置

怎么做

// 提供一套dubbo-spring-boot-starter

sidecar

  • 整合了zuul
  • 用于整合非eureka的微服务,即通过sidecar进行转发,多了一层sidecar的转发,如dubbo
  • sidecar 会获取非eureka微服务的健康状态,并传播到eureka
  • 消费方要使用dubbo服务,通过Ribbon或者Feign进行sidecarServiceId/dubboApi调用
  • /hosts/serviceId 获取sidecar代理的实例
    实际上整合也就是通过该接口获取到被整合的服务的地址和端口,再进行转发
  • /routes 可以看到被代理的springCloud服务
  • 非springCloud需要实现/health接口,并返回
    {status:”UP”}的json文档,让sidecar判断服务是否可用。
  • 首先引进 Eureka,作为注册中心
  • 网关转发集成 Eureka
  • 对于内部dubbo调用,可以尝试在提供一套spring cloud api
  • 尝试所有的服务都使用jar包启动
  • 所有都http,方便测试

最佳实践

  • 全面采用javaconfig,方便的yml配置等
  • 使用spring-boot组件,如starter,@EnableReids等集成通用模块不在原来的spring基础上更进一步支持简单业务处理,甚至是controller,比较类似
    spring-cloud-zuul其实就是一个spring-boot服务

sleuth

  • 链路监控
    • span(跨度):基本工作单元,初始化span被称为”root span”
    • trace(跟踪):一组共享”root span”的span组成的树状结构称为trace
    • annotation(标注):用来记录事件的存在,核心annotation用来定义请求的开始和结束
    • CS:客户端发送一个请求
    • SR:服务端接收请求并准备处理它,如果SR-CS则为网络延迟
    • SS:服务端发送,表示完成请求处理,SS-SR则为服务端处理请求所需时间
    • CR:客户端接收,span结束的标记,CR-CS则表示客户端发送请求到接收到响应所需时间
    • 同ELK整合日志输出
    • 整合Zipkin,可视化查看追踪日志信息

问题

  • 没有完善的dubbo测试工具,有的可能需求提供两套接口
  • 现有公司的业务的高可用 其实在一套架构下就可以支持
  • 如果切换到cloud,需要一套规范,使用规范等,如何定义

SpringCloud

spring cloud微服务最小组件

  • 服务发现 spring cloud eureka
  • 负载均衡 spring cloud ribbon
  • http客户端 spring cloud feign
  • 服务隔离、熔断(也可以称为断路)、降级等 spring cloud hystrix 【可选】
  • 服务链路追踪 Spring Cloud Sleuth 【可选】

feign

  • 声明式REST调用 整合了 eureka、ribbon和hystrix
  • 支持请求或响应压缩
  • hytrix支持
    • 熔断时,可以通过FallbackFactory检查回退的原因
    • 如果要监控,需要单独引入hystrix并开启EnableCircuitBreaker注解
    • 配置feign.hystrix.enabled是否禁用熔断,全局
      也可以通过configuration指定配置类,局部禁用熔断

澳门网上正规赌场网址 3现状.png

对于整个分布式系统

  • 分布式任务系统
  • 监控等
  • SpringCloud
    • 环境信息
    • eureka
    • ribbon
    • hystrix
    • sleuth
    • zipkin
    • feign
    • zuul
    • sidecar
    • config
    • 源码地址

自定义spring-boot starter

  • @Conditional等注解 决定什么时候去启用
  • https://docs.spring.io/spring-boot/docs/1.5.6.RELEASE/reference/htmlsingle/\#boot-features-developing-auto-configuration
  • 例子

monitor-common

MonitorAutoConfiguration

config

  • 统一配置管理
  • 基于端点发送refresh手动刷新
  • 基于Bus[依赖mq]实现自动刷新,轻量级消息代理
  • 关于微服务命名的规范:业务服务都有 xxx-upms-service 命名
    xxx最好是业务组
  • 消费方调用这个接口的时候 引入jar包

目前的架构

  • 可能扩展性不够,需要持续优化
  • 动态添加新服务
  • 灰度策略修改,使用Eureka

优点

  • 方便简单, 处理重复不必要的copy工作

服务发现

  • 我们有必要花一些时间来了解一下Eureka的元数据,这样就可以添加一些自定义的数据以适应特定的业务场景。像主机名、IP地址、端口号、状态页url和健康检查url都是Eureka定义的标准元数据。这些元数据会被保存在Eureka
    Server的注册信息中,客户端会读取这些数据来向需要调用的服务直接发起连接。你可以使用以eureka.instance.metadataMap开头的参数来添加你自定义的元数据,所有客户端都会读取到该信息。通过这种方式你能给客户端自定义一些行为。

澳门网上正规赌场网址 4

image.png

澳门网上正规赌场网址 5image.png

进一步简化封装

  • 如何处理web层通用异常
  • 如何处理dubbo层异常
  • 如何避免swagger重复引用
  • 同时配置Feign

优点

  • 基于spring4以上,简化spring开发的生态
  • 提倡注解,集成方便简单,很好的处理了依赖问题
  • 组件集成功能,注解等更加完善,同时也是spring-cloud的基础
  • 支持jar启动,改善运维能力

澳门网上正规赌场网址 6image.png

缺点

  • 网关根据ip+port转发,无服务发现能力
  • dubbo目前xml形势,非常不利于集成
  • 消费方调用 例子

目前项目集成简单梳理

  • 例子
  • 配置eureka

  • 服务配置ip,一两台服务没问题,40台怎么办?引入注册中心

  • 接口的写法如下
  • 统一ribbon负载规则和策略
  • 结合eureka的metamap使用灰度,流量切换等功能
  • 思路参考:

服务调用规范

  • 是否需要安装业务组,每个组同zuul提供唯一的对外接口
  • 组内服务的内部调用使用feign
  • 组内服务是否需要分层,下层服务不能调用上层服务
  • 通过扩展ribbon使用metadata,控制服务调用
@EnableFeignClients( basePackageClasses = SkillGroupApi.class)@Configurablepublic class ApiConfig {}
/** * @date: 17/10/24 */@FeignClient("upms-service")@RequestMapping("/upms/skillGroup")public interface SkillGroupApi { /** * 获取员工所属技能组 * * @param jobNo 员工工号 * @return */ @GetMapping("/getListByJobNo") GrootResult<List<SkillGroupInfoDto>> getListByJobNo(@RequestParam String jobNo);}
/** * @date: 17/10/24 */@Api(tags = "test", description = "测试")@RestController@RequestMappingpublic class TestController extends AbstractController { // 注入 SkillGroupApi 即可 @Autowired private SkillGroupApi skillGroupApi; @ApiOperation @GetMapping("skillGroup") public List<SkillGroupInfoDto> skillGroup(String jobNo) { GrootResult<List<SkillGroupInfoDto>> result = skillGroupApi.getListByJobNo; return result.getResult(); }}
 <dependency> <groupId>com.yyfq.groot.upms</groupId> <artifactId>upms-cloud-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency>

*这样就只需要添加一套api的接口,dto和其他的都不用改变

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注