启用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 主动/主动流量管理

Go In Action 读书笔记 三

并发

Go语言里的并发是指让某个函数可以独立于其他函数运行的能力. 当一个函数创建为goroutine时, Go会将其视为一个独立的工作单元. 这个工作单元会被调度到可用的逻辑处理器上执行.

Go的运行时调度器可以管理所有创建的goroutine, 并为其分配执行时间. 这个调度器在操作系统之上, 将操作系统的线程与逻辑处理器绑定, 并在逻辑处理器执行goroutine. 调度器可以在任何给定的时间, 全面控制哪个goroutine在哪个逻辑处理器上运行.

Go的并发同步模型来自一个叫做通信顺序进程(Communicating Sequential Processes, CSP). CSP是一个消息传递模型, 通过在goroutine之前传递数据来传递消息, 不需要通过加锁实现同步访问. 用于在goroutine间传递消息的数据结构叫做通道(channel).

并发与并行

操作系统的线程(thread)和进程(process).

进程类似应用程序在运行中需要用到和维护的各种资源的容器. 资源包括但不限于: 内存(来自文件系统的代码和数据), 句柄(文件, 设备, 操作系统), 线程.

Go In Action 读书笔记 二

Go语言的类型系统

Go语言是静态类型的变成语言. 编译的时候需要确定类型.

用户定义的类型

type user struct {
    name    string
    email   string
    ext     int
    privileged  bool
}

使用 零值和结构字面量初始化

//引用类型, 各个字段初始化为对应的零值
var bill user #{  0 false}
//创建并初始化, 使用结构字面量
lisa := user{ //{Lisa lisa@email.com 123 true}
    name: "Lisa",
    email: "lisa@email.com",
    ext: 123,
    privileged: true,
}

结构字面量的赋值方式:

  • 不同行声明每一个字段和对应的值, 字段名和字段以:分隔, 末尾以,结尾
  • 不适用字段名, 只声明对应的值. 写在一行里, 以,分隔, 结尾不需要,. 要保证顺序
lisa := {"Lisa", "lisa@email.com", 123, true}