Spring Cloud Ribbon 详解

客户端负载均衡, Ribbon的核心概念是命名的客户端.

使用

引入Ribbon依赖和配置

加入spring-cloud-starter-netflix-ribbon依赖

代码中使用RibbonClient注解

@Configuration 
@RibbonClient(name = "foo", configuration = FooConfiguration.class) public class TestConfiguration {}
@Configuration protected static class FooConfiguration {

    @Bean 
    public ZonePreferenceServerListFilter serverListFilter() {
        ZonePreferenceServerListFilter filter = new ZonePreferenceServerListFilter();
        filter.setZone("myTestZone");
        return filter; 
    }

    @Bean 
    public IPing ribbonPing() { 
        return new PingUrl(); 
    }

}

Ribbon客户端的配置, 如果不指定会使用默认的实现:

  • IClientConfig 客户端相关配置
  • IRule 定义负载均衡策略
  • IPing 定义如何ping目标服务实例来判断是否存活, ribbon使用单独的线程每隔一段时间(默认10s)对本地缓存的ServerList做一次检查
  • ServerList 定义如何获取服务实例列表. 两种实现基于配置的ConfigurationBasedServerList和基于Eureka服务发现的DiscoveryEnabledNIWSServerList
  • ServerListFilter 用来使用期望的特征过滤静态配置动态获得的候选服务实例列表. 若未提供, 默认使用ZoneAffinityServerListFilter
  • ILoadBalancer 定义了软负载均衡器的操作的接口. 一个典型的负载均衡器至少需要一组用来做负载均衡的服务实例, 一个标记某个服务实例不在旋转中的方法, 和对应的方法调用从实例列表中选出某一个服务实例.
  • ServerListUpdater DynamicServerListLoadBalancer用来更新实例列表的策略(推EurekaNotificationServerListUpdater/拉PollingServerListUpdater, 默认是拉)

Jenkins CI/CD (一) 基于角色的授权策略

最近开始客串运维做CI/CD的规划设计, 主要是基于’Pipeline as Code in Jenkins’. 整理了下思路和技术点, 慢慢的写.

这一篇是关于基于角色的授权策略, 用的是Role-Based Authorization Strategy Plugin.

授权在CI/CD流程中比较常见, 比如我们只让某些特定用户才可以构建Pre-Release的Job. 而更高级的Release发布, 又会需要某些用户的审批才可以进行. 需要授权时, 可能还需要发邮件提醒用户.

UI上如何使用就不提了, 这里只说Pipeline as Code. 后面的几篇也会是这个背景.

参考的这篇文章, 文章里的代码运行失败, 做了修复.

配置

安装完插件, 需要开始基于角色的授权策略. 同时添加角色和为用户分配角色.

使用Role-Based Strategy作为验证方式

Manage Jenkins / Configure Global Security / Configure Global Security

KVM安装手册

添加虚拟机流程:

1. 配置网络
2. 配置存储池
3. 上传镜像
4. 安装虚拟机,指定配置

安装KVM虚拟机

1. 关闭防火墙,selinux

# service iptables stop
# setenforce 0 临时关闭
# chkconfig NetworkManager off

2. 安装kvm虚拟机

# yum install kvm libvirt libvirt-devel python-virtinst python-virtinst qemu-kvm virt-viewer bridge-utils virt-top libguestfs-tools ca-certificates audit-libs-python device-mapper-libs virt-install
# 启动服务
# service libvirtd restart
下载virtio-win-1.5.2-1.el6.noarch.rpm 如果不安装window虚拟机或者使用带virtio驱动的镜像可以不用安装
# rpm -ivh virtio-win-1.5.2-1.el6.noarch.rpm

3. Libvirt在管理本地或远程Hypervisor时的表现形式如下。

在libvirt内部管理了五部分:

  • 节点:所谓的节点就是我们的物理服务器,一个服务器代表一个节点,上边存放着Hyper和Domain
  • Hypervisor:即VMM,指虚拟机的监控程序,在KVM中是一个加载了kvm.ko的标准Linux系统。
  • 域(Domain):指虚拟机,一个域代表一个虚拟机(估计思路来源于Xen的Domain0)
  • 存储池(Storage Pool):存储空间,支持多种协议和网络存储。作为虚拟机磁盘的存储源。
  • 卷组(Volume):虚拟机磁盘在Host上的表现形式。 上边的五部分,我们必须使用的是前三个,因为很多时候根据业务规则或应用的灵活性并没有使用卷组(其实就是有了编制的虚拟磁盘文件),也就没有必要使用存储池。

启用Jenkins CLI

Jenkins CLI提供了SSH和Client模式. Docker运行Jenkins version:'3'services:jenkins:image:jenkins/jenkins:alpineports:- 8080:8080- 50000:50000- 46059:46059volumes:- "/Users/addo/DevApps/Docker/data/jenkins:/var/jenkins_home"note: 以为是docker运行, ssh端口设置选用了固定端口. Client 从h

Spring Cloud Zuul详解

Spring Cloud对Netflix Zuul做了封装集成, 使得在Spring Cloud环境中使用Zuul更方便. Netflix Zuul相关分析请看上一篇.

实现

@EnableZuulProxy 与 @EnableZuulServer 二者的区别在于前者使用了服务发现作为路由寻址, 并使用Ribbon做客户端的负载均衡; 后者没有使用. Zuul server的路由都通过ZuulProperties进行配置.

具体实现:

  1. 使用ZuulController(ServletWrappingController的子类)封装ZuulServlet实例, 处理从DispatcherServlet进来的请求.
  2. ZuulHandlerMapping负责注册handler mapping, 将RoutefullPath的请求交由ZuulController处理.
  3. 同时使用ServletRegistrationBean注册ZuulServlet, 默认使用/zuul作为urlMapping. 所有来自以/zuul开头的path的请求都会直接进入ZuulServlet, 不会进入DispatcherServlet.

使用注解

  • @EnableZuulProxy引入了ZuulProxyMarkerConfiguration, ZuulProxyMarkerConfiguration只做了一件事, 实例化了内部类Marker.

    @Configuration
    public class ZuulProxyMarkerConfiguration {
        @Bean
        public Marker zuulProxyMarkerBean() {
            return new Marker();
        }
    
        class Marker {
        }
    }
    
  • @EnableZuulServer引入了ZuulServerMarkerConfiguration, ZuulServerMarkerConfiguration也只做了一件事: 实例化了内部类Marker

    @Configuration
    public class ZuulServerMarkerConfiguration {
        @Bean
        public Marker zuulServerMarkerBean() {
            return new Marker();
        }
    
        class Marker {
        }
    }
    

Spring Cloud - Eureka服务注册

之前分析过Spring Cloud的Eureka服务发现, 今天分析一下服务注册.

配置

BootstrapConfiguration

EurekaDiscoveryClientConfigServiceBootstrapConfiguration

spring-cloud-config环境中使用的配置

引入EurekaDiscoveryClientConfigurationEurekaClientAutoConfiguration

EurekaDiscoveryClientConfiguration
  1. 在spring-cloud中(通过是否存在RefreshScopeRefreshedEvent.class判断), 添加RefreshScopeRefreshedEvent的listener. 收到事件后重新注册实例.
  2. eureka.client.healthcheck.enabled设置为true时, 注册EurekaHealthCheckHandlerbean. EurekaHealthCheckHandler负责将应用状态映射为实例状态InstanceStatus.
EurekaClientAutoConfiguration

支持spring-cloud和非spring-cloud环境, 在spring-cloud环境中, 下面两个bean要使用@RefreshScope标注

  1. 实例化EurekaClientbean, 在spring-cloud中使用实现类CloudEurekaClient.
  2. 使用EurekaInstanceConfig实例, 实例化ApplicationInfoManagerbean

初识Netflix Zuul

嵌入式的zuul代理

使用了Netfilx OSS的其他组件:

  • Hystrix 熔断
  • Ribbon 负责发送外出请求的客户端, 提供软件负载均衡功能
  • Trubine 实时地聚合细粒度的metrics数据
  • Archaius 动态配置

介绍

由于2.0停止开发且会有bug, 故下面的分析基于1.x版本.

特性

  • Authentication 认证
  • Insights 洞察
  • Stress Testing 压力测试
  • Canary Testing 金丝雀测试
  • Dynamic Routing 动态路由
  • Multi-Region Resiliency 多区域弹性
  • Load Shedding 负载脱落
  • Security 安全
  • Static Response handling 静态响应处理
  • Multi-Region Resiliency 主动/主动流量管理