背景 Nginx运行在kubernets中, 反向代理service提供服务. kubernetes版本v1.9.1+a0ce1bc657. 问题:
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上的表现形式。 上边的五部分,我们必须使用的是前三个,因为很多时候根据业务规则或应用的灵活性并没有使用卷组(其实就是有了编制的虚拟磁盘文件),也就没有必要使用存储池。
Spring Cloud Zuul详解
Spring Cloud对Netflix Zuul做了封装集成, 使得在Spring Cloud环境中使用Zuul更方便. Netflix Zuul相关分析请看上一篇.
实现
@EnableZuulProxy 与 @EnableZuulServer
二者的区别在于前者使用了服务发现作为路由寻址, 并使用Ribbon做客户端的负载均衡; 后者没有使用.
Zuul server的路由都通过ZuulProperties
进行配置.
具体实现:
- 使用
ZuulController
(ServletWrappingController
的子类)封装ZuulServlet
实例, 处理从DispatcherServlet
进来的请求. ZuulHandlerMapping
负责注册handler mapping, 将Route
的fullPath
的请求交由ZuulController
处理.- 同时使用
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环境中使用的配置
引入EurekaDiscoveryClientConfiguration
和EurekaClientAutoConfiguration
EurekaDiscoveryClientConfiguration
- 在spring-cloud中(通过是否存在RefreshScopeRefreshedEvent.class判断), 添加
RefreshScopeRefreshedEvent
的listener. 收到事件后重新注册实例. - 在
eureka.client.healthcheck.enabled
设置为true时, 注册EurekaHealthCheckHandler
bean.EurekaHealthCheckHandler
负责将应用状态映射为实例状态InstanceStatus
.
EurekaClientAutoConfiguration
支持spring-cloud和非spring-cloud环境, 在spring-cloud环境中, 下面两个bean要使用@RefreshScope
标注
- 实例化
EurekaClient
bean, 在spring-cloud中使用实现类CloudEurekaClient
. - 使用
EurekaInstanceConfig
实例, 实例化ApplicationInfoManager
bean
初识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 主动/主动流量管理