Spring Cloud 源码解析

为什么要看源码

1、学习好的项目
2、调试需要
3、参与维护的需要

  1. 遇到了问题,没有好的文档或论文
  2. 因为源码获得很容易, 代码本身是最准确的讲解
  3. 推测的结论不准
  4. "实验"周期长,代价大
  5. 通过查看历史版本差异, 了解功能演化
  6. 源码面前,了无秘密

看源码要注意的问题

  1. 要从结构上把握,胸中要有全景图
  2. 要从需求出发, 知晓作者是在解决一个什么问题
  3. 重点是作者为什么是这么解决的,好处,坏处,如何取舍的
  4. 你的时间很宝贵, 不要过度纠缠, 要想理解有些关键算法, 学术论文才是正途
  5. 通过源码能解决你的疑问就好

下载源码方法

开源站点

github.com 等

IDE 法

直接点 CTRL + 类, 通常是编译的内容, 可以在不下载源码时简单看一下, 但有时编译效果不好, 也没有注释说明等. 这时最好是下载源码.

IDE 中都有相应功能, IDEA 和 eclipse 都有相应功能
IDEA 中下载源码 [Download Sources], 可以只下载某个 jar 包对应的源码.

 

IDEA download souce

IDEA download souce

maven 命令行法

命令行方式可以一次下载全部源码:

mvn dependency:sources
...
Downloading from ssllrepo: http://dev.myrepo.com/artifactory/repo/com/fasterxml/classmate/1.3.4/classmate-1.3.4-sources.jar
Downloaded from ssllrepo: http://dev.myrepo.com/artifactory/repo/com/fasterxml/classmate/1.3.4/classmate-1.3.4-sources.jar (48 kB at 694 kB/s)
...

下载的代码会保存到本地 maven 库里, 即${user.home}/.m2/repository

查看源码的方法

Windows 平台

CodeInSight

IDE

Eclipse, IDEA

命令行

代码统计
sloccount .

find grep less/vim 组合

查看源码先要了解模块全图, 了解原理

核心功能:

  1. 分布式版本化的配置 Distributed/versioned configuration
  2. 服务注册与发现 Service registration and discovery
  3. 路由 Routing
  4. 服务互调 Service-to-service calls
  5. 负载均衡 Load balancing
  6. 融断机制 Circuit Breakers
  7. 全局锁 Global locks
  8. 主机选举与集群状态 Leadership election and cluster state
  9. 分布消息 Distributed messaging

本教程第一部分只讲基础模块

接口适配部分

如:

spring-cloud-netflix-archaius
spring-cloud-netflix-core
spring-cloud-netflix-eureka-client
spring-cloud-netflix-eureka-server
spring-cloud-netflix-ribbon

实现部分

如:

com.netflix.archaius:archaius-core
com.netflix.eureka:eureka-client
com.netflix.hystrix:hystrix-core
com.netflix.ribbon:ribbon

基础部分

如:

spring-cloud-commons
spring-cloud-config-client
spring-cloud-config-server
spring-cloud-context

Spring Boot 依赖

如:

spring-cloud-starter
spring-cloud-starter-config
spring-cloud-starter-netflix-archaius
spring-cloud-starter-netflix-eureka-client
spring-cloud-starter-netflix-eureka-server
spring-cloud-starter-netflix-ribbon

最好带着问题去看

Spring boot 注解回顾

Spring @Import注解
获取该类对应的bean,此就需要用到@Import注解

@Import(Bean.class)
@Import(Config.class)

问题1: 有哪些配置选项

https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

配置举例:
三种方式
application.properties 或 application.yml 或命令行选项

配置项

# REMOTE DEVTOOLS (RemoteDevToolsProperties)
spring.devtools.remote.context-path=/.~~spring-boot!~ # Context path used to handle the remote connection.
spring.devtools.remote.proxy.host= # The host of the proxy to use to connect to the remote application.
spring.devtools.remote.proxy.port= # The port of the proxy to use to connect to the remote application.
spring.devtools.remote.restart.enabled=true # Whether to enable remote restart.
spring.devtools.remote.secret= # A shared secret required to establish a connection (required to enable remote support).
spring.devtools.remote.secret-header-name=X-AUTH-TOKEN # HTTP header used to transfer the shared secret.

对应的Java类
RemoteDevToolsProperties.java

管方的 Java 包会在通过META-INF目录下的

spring-autoconfigure-metadata.properties
spring-configuration-metadata.json

例如:
~/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/2.0.3.RELEASE/spring-boot-autoconfigure-2.0.3.RELEASE.jar!/META-INF/spring-configuration-metadata.json

```json
{
"hints": [
...,

{
  "name": "spring.datasource.data",
  "providers": [
    {
      "name": "handle-as",
      "parameters": {
        "target": "java.util.List<org.springframework.core.io.Resource>"
      }
    }
  ]
},
{
  "name": "spring.datasource.driver-class-name",
  "providers": [
    {
      "name": "class-reference",
      "parameters": {
        "target": "java.sql.Driver"
      }
    }
  ]
},
...
}

```

JSON 结构比较简单, 容易看懂.
在这个文件里定义了相应的配置项,数值类型,以及可能的备选项进行描述, 从而使得 IDE 可以透过代码提示, 方便用户键入.

问题0: Eureka如何建立点对点的注册

问题2: 最小原型是什么

问题3: 如何调试

问题4: 如何模拟服务失败, 模拟容错

问题5: 如何负载均衡

问题6: 如何进行压力测试, 模拟熔断

问题7: 如何自动布署

用测试代码验证自己的想法

分享