提交 9251cc41 编写于 作者: Y yanglbme 提交者: GitHub Action

Prettified Code!

上级 8e3bd409
module.exports = {
contents: [ "summary.md" ],
pathToPublic: "pdf/advanced-java.pdf",
pdfOptions: "<options for puppeteer.pdf()>",
removeTemp: true,
emulateMedia: "screen",
}
\ No newline at end of file
contents: ["summary.md"],
pathToPublic: "pdf/advanced-java.pdf",
pdfOptions: "<options for puppeteer.pdf()>",
removeTemp: true,
emulateMedia: "screen",
};
......@@ -229,7 +229,6 @@ Doocs 技术社区,致力于打造一个内容完整、持续成长的互联
</tr>
</table>
关注「**Doocs 开源社区**」公众号,回复 **PDF**,即可获取本项目离线 PDF 文档(283 页精华),学习更加方便!
![](./images/pdf.png)
\ No newline at end of file
![](./images/pdf.png)
<p align="center"><iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=330 height=86 src="//music.163.com/outchain/player?type=2&id=1334849028&auto=1&height=66"></iframe></p>
<p align="center">本单曲受版权保护,可<a href="https://music.163.com/#/mv?id=10859500">点击观看 MV</a></p>
> 受伤的得到疗愈,挣扎的得到出口<br>
> _Let those who hurt heal, let those who struggle find hope_.
> 受伤的得到疗愈,挣扎的得到出口<br> > _Let those who hurt heal, let those who struggle find hope_.
```
告别的时刻已到了
......
## 电商网站的商品详情页系统架构
### 小型电商网站的商品详情页系统架构
小型电商网站的页面展示采用页面全量静态化的思想。数据库中存放了所有的商品信息,页面静态化系统,将数据填充进静态模板中,形成静态化页面,推入 Nginx 服务器。用户浏览网站页面时,取用一个已经静态化好的 html 页面,直接返回回去,不涉及任何的业务逻辑处理。
![e-commerce-website-detail-page-architecture-1](./images/e-commerce-website-detail-page-architecture-1.png)
......@@ -9,11 +10,11 @@
```html
<html>
<body>
商品名称:#{productName}<br>
商品价格:#{productPrice}<br>
商品描述:#{productDesc}
</body>
<body>
商品名称:#{productName}<br />
商品价格:#{productPrice}<br />
商品描述:#{productDesc}
</body>
</html>
```
......@@ -24,17 +25,17 @@
**坏处**在于,仅仅适用于一些小型的网站,比如页面的规模在几十到几万不等。对于一些大型的电商网站,亿级数量的页面,你说你每次页面模板修改了,都需要将这么多页面全量静态化,靠谱吗?每次渲染花个好几天时间,那你整个网站就废掉了。
### 大型电商网站的商品详情页系统架构
大型电商网站商品详情页的系统设计中,当商品数据发生变更时,会将变更消息压入 MQ 消息队列中。**缓存服务**从消息队列中消费这条消息时,感知到有数据发生变更,便通过调用数据服务接口,获取变更后的数据,然后将整合好的数据推送至 redis 中。Nginx 本地缓存的数据是有一定的时间期限的,比如说 10 分钟,当数据过期之后,它就会从 redis 获取到最新的缓存数据,并且缓存到自己本地。
用户浏览网页时,动态将 Nginx 本地数据渲染到本地 html 模板并返回给用户。
![e-commerce-website-detail-page-architecture-2](./images/e-commerce-website-detail-page-architecture-2.png)
虽然没有直接返回 html 页面那么快,但是因为数据在本地缓存,所以也很快,其实耗费的也就是动态渲染一个 html 页面的性能。如果 html 模板发生了变更,不需要将所有的页面重新静态化,也不需要发送请求,没有网络请求的开销,直接将数据渲染进最新的 html 页面模板后响应即可。
在这种架构下,我们需要**保证系统的高可用性**
如果系统访问量很高,Nginx 本地缓存过期失效了,redis 中的缓存也被 LRU 算法给清理掉了,那么会有较高的访问量,从缓存服务调用商品服务。但如果此时商品服务的接口发生故障,调用出现了延时,缓存服务全部的线程都被这个调用商品服务接口给耗尽了,每个线程去调用商品服务接口的时候,都会卡住很长时间,后面大量的请求过来都会卡在那儿,此时缓存服务没有足够的线程去调用其它一些服务的接口,从而导致整个大量的商品详情页无法正常显示。
这其实就是一个商品接口服务故障导致缓存服务资源耗尽的现象。
\ No newline at end of file
这其实就是一个商品接口服务故障导致缓存服务资源耗尽的现象。
# 微服务架构
- [微服务架构整个章节内容属额外新增,后续抽空更新,也欢迎读者们参与补充完善](https://github.com/doocs/advanced-java)
- [关于微服务架构的描述](/docs/micro-services/microservices-introduction.md)
## Spring Cloud 微服务架构
- 什么是微服务?微服务之间是如何独立通讯的?
- Spring Cloud 和 Dubbo 有哪些区别?
- Spring Boot 和 Spring Cloud,谈谈你对它们的理解?
- 什么是服务熔断?什么是服务降级?
- 微服务的优缺点分别是什么?说一下你在项目开发中碰到的坑?
- 你所知道的微服务技术栈都有哪些?
- Eureka 和 Zookeeper 都可以提供服务注册与发现的功能,它们有什么区别?
- ......
---
## 公众号
GitHub 技术社区 [Doocs](https://github.com/doocs) 旗下唯一公众号「**Doocs 开源社区**」​,欢迎扫码关注,**专注分享技术领域相关知识及行业最新资讯**。当然,也可以加我个人微信(备注:GitHub),拉你进技术交流群。
关注「**Doocs 开源社区**」公众号,回复 **PDF**,即可获取本项目离线 PDF 文档(283 页精华),学习更加方便!
![](./images/pdf.png)
<table>
<tr>
<td align="center" style="width: 200px;">
<a href="https://github.com/doocs">
<img src="./images/qrcode-for-doocs.jpg" style="width: 400px;"><br>
<sub>公众平台</sub>
</a><br>
</td>
<td align="center" style="width: 200px;">
<a href="https://github.com/yanglbme">
<img src="./images/qrcode-for-yanglbme.jpg" style="width: 400px;"><br>
<sub>个人微信</sub>
</a><br>
</td>
</tr>
</table>
# 微服务架构
- [微服务架构整个章节内容属额外新增,后续抽空更新,也欢迎读者们参与补充完善](https://github.com/doocs/advanced-java)
- [关于微服务架构的描述](/docs/micro-services/microservices-introduction.md)
## Spring Cloud 微服务架构
- 什么是微服务?微服务之间是如何独立通讯的?
- Spring Cloud 和 Dubbo 有哪些区别?
- Spring Boot 和 Spring Cloud,谈谈你对它们的理解?
- 什么是服务熔断?什么是服务降级?
- 微服务的优缺点分别是什么?说一下你在项目开发中碰到的坑?
- 你所知道的微服务技术栈都有哪些?
- Eureka 和 Zookeeper 都可以提供服务注册与发现的功能,它们有什么区别?
- ......
---
## 公众号
GitHub 技术社区 [Doocs](https://github.com/doocs) 旗下唯一公众号「**Doocs 开源社区**」​,欢迎扫码关注,**专注分享技术领域相关知识及行业最新资讯**。当然,也可以加我个人微信(备注:GitHub),拉你进技术交流群。
关注「**Doocs 开源社区**」公众号,回复 **PDF**,即可获取本项目离线 PDF 文档(283 页精华),学习更加方便!
![](./images/pdf.png)
<table>
<tr>
<td align="center" style="width: 200px;">
<a href="https://github.com/doocs">
<img src="./images/qrcode-for-doocs.jpg" style="width: 400px;"><br>
<sub>公众平台</sub>
</a><br>
</td>
<td align="center" style="width: 200px;">
<a href="https://github.com/yanglbme">
<img src="./images/qrcode-for-yanglbme.jpg" style="width: 400px;"><br>
<sub>个人微信</sub>
</a><br>
</td>
</tr>
</table>
# 微服务技术栈
- Author: [HuiFer](https://github.com/huifer)
- Description: 该文简单介绍微服务技术栈有哪些分别用来做什么。
## 技术栈
### 微服务开发
作用:快速开发服务。
- Spring
- Spring MVC
- Spring Boot
[Spring](https://spring.io/) 目前是 JavaWeb 开发人员必不可少的一个框架,SpringBoot 简化了 Spring 开发的配置目前也是业内主流开发框架。
### 微服务注册发现
作用:发现服务,注册服务,集中管理服务。
#### Eureka
- Eureka Server : 提供服务注册服务, 各个节点启动后,会在 Eureka Server 中进行注册。
- Eureka Client : 简化与 Eureka Server 的交互操作。
- Spring Cloud Netflix : [GitHub](https://github.com/spring-cloud/spring-cloud-netflix)[文档](https://cloud.spring.io/spring-cloud-netflix/reference/html/)
#### Zookeeper
> ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services.
[Zookeeper](https://github.com/apache/zookeeper) 是一个集中的服务, 用于维护配置信息、命名、提供分布式同步和提供组服务。
#### Zookeeper 和 Eureka 区别
Zookeeper 保证 CP,Eureka 保证 AP:
- C:数据一致性;
- A:服务可用性;
- P:服务对网络分区故障的容错性,这三个特性在任何分布式系统中不能同时满足,最多同时满足两个。
### 微服务配置管理
作用:统一管理一个或多个服务的配置信息, 集中管理。
#### [Disconf](https://github.com/knightliao/disconf)
Distributed Configuration Management Platform(分布式配置管理平台) , 它是专注于各种分布式系统配置管理 的通用组件/通用平台, 提供统一的配置管理服务, 是一套完整的基于 zookeeper 的分布式配置统一解决方案。
#### [SpringCloudConfig](https://github.com/spring-cloud/spring-cloud-config)
#### [Apollo](https://github.com/ctripcorp/apollo)
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,用于微服务配置管理场景。
### 权限认证
作用:根据系统设置的安全规则或者安全策略, 用户可以访问而且只能访问自己被授权的资源,不多不少。
#### [Spring Security](https://spring.io/projects/spring-security)
#### [Apache Shiro](http://shiro.apache.org/)
> Apache Shiro™ is a powerful and easy-to-use Java security framework that performs authentication, authorization, cryptography, and session management. With Shiro’s easy-to-understand API, you can quickly and easily secure any application – from the smallest mobile applications to the largest web and enterprise applications.
### 批处理
作用: 批量处理同类型数据或事物
#### [Spring Batch](https://spring.io/projects/spring-batch)
### 定时任务
> 作用: 定时做什么。
#### [Quartz](http://www.quartz-scheduler.org/)
### 微服务调用 (协议)
> 通讯协议
#### Rest
- 通过 HTTP/HTTPS 发送 Rest 请求进行数据交互
#### RPC
- Remote Procedure Call
- 它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC 不依赖于具体的网络传输协议,tcp、udp 等都可以。
#### [gRPC](https://www.grpc.io/)
> A high-performance, open-source universal RPC framework
所谓 RPC(remote procedure call 远程过程调用) 框架实际是提供了一套机制,使得应用程序之间可以进行通信,而且也遵从 server/client 模型。使用的时候客户端调用 server 端提供的接口就像是调用本地的函数一样。
#### RMI
- Remote Method Invocation
- 纯 Java 调用
### 服务接口调用
> 作用:多个服务之间的通讯
#### [Feign(HTTP)](https://github.com/OpenFeign/feign)
Spring Cloud Netflix 的微服务都是以 HTTP 接口的形式暴露的,所以可以用 Apache 的 HttpClient 或 Spring 的 RestTemplate 去调用,而 Feign 是一个使用起来更加方便的 HTTP 客戶端,使用起来就像是调用自身工程的方法,而感觉不到是调用远程方法。
### 服务熔断
> 作用: 当请求到达一定阈值时不让请求继续.
#### [Hystrix](https://github.com/Netflix/Hystrix)
> Hystrix is a latency and fault tolerance library designed to isolate points of access to remote systems, services and 3rd party libraries, stop cascading failure and enable resilience in complex distributed systems where failure is inevitable.
#### [Sentinel](https://github.com/alibaba/Sentinel)
> A lightweight powerful flow control component enabling reliability and monitoring for microservices. (轻量级的流量控制、熔断降级 Java 库)
### 服务的负载均衡
> 作用:降低服务压力, 增加吞吐量
#### [Ribbon](https://github.com/Netflix/ribbon)
> Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具, 它基于 Netflix Ribbon 实现
#### [Nginx](https://github.com/nginx/nginx)
Nginx (engine x) 是一个高性能的 HTTP 和反向代理 web 服务器, 同时也提供了 IMAP/POP3/SMTP 服务
#### Nginx 与 Ribbon 区别
Nginx 属于服务端负载均衡,Ribbon 属于客户端负载均衡。Nginx 作用与 Tomcat,Ribbon 作用与各个服务之间的调用 (RPC)。
### 消息队列
> 作用: 解耦业务, 异步化处理数据
#### [Kafka](http://kafka.apache.org/)
#### [RabbitMQ](https://www.rabbitmq.com/)
#### [RocketMQ](http://rocketmq.apache.org/)
#### [activeMQ](http://activemq.apache.org/)
### 日志采集 (elk)
> 作用: 收集各服务日志提供日志分析、用户画像等
#### [Elasticsearch](https://github.com/elastic/elasticsearch)
#### [Logstash](https://github.com/elastic/logstash)
#### [Kibana](https://github.com/elastic/kibana)
### API 网关
> 作用: 外部请求通过 API 网关进行拦截处理, 再转发到真正的服务
#### [Zuul](https://github.com/Netflix/zuul)
> Zuul is a gateway service that provides dynamic routing, monitoring, resiliency, security, and more.
### 服务监控
> 作用: 以可视化或非可视化的形式展示出各个服务的运行情况 (CPU、内存、访问量等)
#### [Zabbix](https://github.com/jjmartres/Zabbix)
#### [Nagios](https://www.nagios.org/)
#### [Metrics](https://metrics.dropwizard.io)
### 服务链路追踪
> 作用: 明确服务之间的调用关系
#### [Zipkin](https://github.com/openzipkin/zipkin)
#### [Brave](https://github.com/openzipkin/brave)
### 数据存储
> 作用: 存储数据
#### 关系型数据库
##### [MySql](https://www.mysql.com/)
##### [Oracle](https://www.oracle.com/index.html)
##### [MsSQL](https://docs.microsoft.com/zh-cn/sql/?view=sql-server-ver15)
##### [PostgreSql](https://www.postgresql.org/)
#### 非关系型数据库
##### [Mongodb](https://www.mongodb.com/)
##### [Elasticsearch](https://github.com/elastic/elasticsearch)
### 缓存
> 作用: 存储数据
#### [redis](https://redis.io/)
### 分库分表
> 作用: 数据库分库分表方案.
#### [ShardingSphere](http://shardingsphere.apache.org/)
#### [Mycat](http://www.mycat.io/)
### 服务部署
> 作用: 将项目快速部署、上线、持续集成.
#### [Docker](http://www.docker.com/)
#### [Jenkins](https://jenkins.io/zh/)
#### [Kubernetes(K8s)](https://kubernetes.io/)
#### [Mesos](http://mesos.apache.org/)
# 微服务技术栈
- Author: [HuiFer](https://github.com/huifer)
- Description: 该文简单介绍微服务技术栈有哪些分别用来做什么。
## 技术栈
### 微服务开发
作用:快速开发服务。
- Spring
- Spring MVC
- Spring Boot
[Spring](https://spring.io/) 目前是 JavaWeb 开发人员必不可少的一个框架,SpringBoot 简化了 Spring 开发的配置目前也是业内主流开发框架。
### 微服务注册发现
作用:发现服务,注册服务,集中管理服务。
#### Eureka
- Eureka Server : 提供服务注册服务, 各个节点启动后,会在 Eureka Server 中进行注册。
- Eureka Client : 简化与 Eureka Server 的交互操作。
- Spring Cloud Netflix : [GitHub](https://github.com/spring-cloud/spring-cloud-netflix)[文档](https://cloud.spring.io/spring-cloud-netflix/reference/html/)
#### Zookeeper
> ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services.
[Zookeeper](https://github.com/apache/zookeeper) 是一个集中的服务, 用于维护配置信息、命名、提供分布式同步和提供组服务。
#### Zookeeper 和 Eureka 区别
Zookeeper 保证 CP,Eureka 保证 AP:
- C:数据一致性;
- A:服务可用性;
- P:服务对网络分区故障的容错性,这三个特性在任何分布式系统中不能同时满足,最多同时满足两个。
### 微服务配置管理
作用:统一管理一个或多个服务的配置信息, 集中管理。
#### [Disconf](https://github.com/knightliao/disconf)
Distributed Configuration Management Platform(分布式配置管理平台) , 它是专注于各种分布式系统配置管理 的通用组件/通用平台, 提供统一的配置管理服务, 是一套完整的基于 zookeeper 的分布式配置统一解决方案。
#### [SpringCloudConfig](https://github.com/spring-cloud/spring-cloud-config)
#### [Apollo](https://github.com/ctripcorp/apollo)
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,用于微服务配置管理场景。
### 权限认证
作用:根据系统设置的安全规则或者安全策略, 用户可以访问而且只能访问自己被授权的资源,不多不少。
#### [Spring Security](https://spring.io/projects/spring-security)
#### [Apache Shiro](http://shiro.apache.org/)
> Apache Shiro™ is a powerful and easy-to-use Java security framework that performs authentication, authorization, cryptography, and session management. With Shiro’s easy-to-understand API, you can quickly and easily secure any application – from the smallest mobile applications to the largest web and enterprise applications.
### 批处理
作用: 批量处理同类型数据或事物
#### [Spring Batch](https://spring.io/projects/spring-batch)
### 定时任务
> 作用: 定时做什么。
#### [Quartz](http://www.quartz-scheduler.org/)
### 微服务调用 (协议)
> 通讯协议
#### Rest
- 通过 HTTP/HTTPS 发送 Rest 请求进行数据交互
#### RPC
- Remote Procedure Call
- 它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC 不依赖于具体的网络传输协议,tcp、udp 等都可以。
#### [gRPC](https://www.grpc.io/)
> A high-performance, open-source universal RPC framework
所谓 RPC(remote procedure call 远程过程调用) 框架实际是提供了一套机制,使得应用程序之间可以进行通信,而且也遵从 server/client 模型。使用的时候客户端调用 server 端提供的接口就像是调用本地的函数一样。
#### RMI
- Remote Method Invocation
- 纯 Java 调用
### 服务接口调用
> 作用:多个服务之间的通讯
#### [Feign(HTTP)](https://github.com/OpenFeign/feign)
Spring Cloud Netflix 的微服务都是以 HTTP 接口的形式暴露的,所以可以用 Apache 的 HttpClient 或 Spring 的 RestTemplate 去调用,而 Feign 是一个使用起来更加方便的 HTTP 客戶端,使用起来就像是调用自身工程的方法,而感觉不到是调用远程方法。
### 服务熔断
> 作用: 当请求到达一定阈值时不让请求继续.
#### [Hystrix](https://github.com/Netflix/Hystrix)
> Hystrix is a latency and fault tolerance library designed to isolate points of access to remote systems, services and 3rd party libraries, stop cascading failure and enable resilience in complex distributed systems where failure is inevitable.
#### [Sentinel](https://github.com/alibaba/Sentinel)
> A lightweight powerful flow control component enabling reliability and monitoring for microservices. (轻量级的流量控制、熔断降级 Java 库)
### 服务的负载均衡
> 作用:降低服务压力, 增加吞吐量
#### [Ribbon](https://github.com/Netflix/ribbon)
> Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具, 它基于 Netflix Ribbon 实现
#### [Nginx](https://github.com/nginx/nginx)
Nginx (engine x) 是一个高性能的 HTTP 和反向代理 web 服务器, 同时也提供了 IMAP/POP3/SMTP 服务
#### Nginx 与 Ribbon 区别
Nginx 属于服务端负载均衡,Ribbon 属于客户端负载均衡。Nginx 作用与 Tomcat,Ribbon 作用与各个服务之间的调用 (RPC)。
### 消息队列
> 作用: 解耦业务, 异步化处理数据
#### [Kafka](http://kafka.apache.org/)
#### [RabbitMQ](https://www.rabbitmq.com/)
#### [RocketMQ](http://rocketmq.apache.org/)
#### [activeMQ](http://activemq.apache.org/)
### 日志采集 (elk)
> 作用: 收集各服务日志提供日志分析、用户画像等
#### [Elasticsearch](https://github.com/elastic/elasticsearch)
#### [Logstash](https://github.com/elastic/logstash)
#### [Kibana](https://github.com/elastic/kibana)
### API 网关
> 作用: 外部请求通过 API 网关进行拦截处理, 再转发到真正的服务
#### [Zuul](https://github.com/Netflix/zuul)
> Zuul is a gateway service that provides dynamic routing, monitoring, resiliency, security, and more.
### 服务监控
> 作用: 以可视化或非可视化的形式展示出各个服务的运行情况 (CPU、内存、访问量等)
#### [Zabbix](https://github.com/jjmartres/Zabbix)
#### [Nagios](https://www.nagios.org/)
#### [Metrics](https://metrics.dropwizard.io)
### 服务链路追踪
> 作用: 明确服务之间的调用关系
#### [Zipkin](https://github.com/openzipkin/zipkin)
#### [Brave](https://github.com/openzipkin/brave)
### 数据存储
> 作用: 存储数据
#### 关系型数据库
##### [MySql](https://www.mysql.com/)
##### [Oracle](https://www.oracle.com/index.html)
##### [MsSQL](https://docs.microsoft.com/zh-cn/sql/?view=sql-server-ver15)
##### [PostgreSql](https://www.postgresql.org/)
#### 非关系型数据库
##### [Mongodb](https://www.mongodb.com/)
##### [Elasticsearch](https://github.com/elastic/elasticsearch)
### 缓存
> 作用: 存储数据
#### [redis](https://redis.io/)
### 分库分表
> 作用: 数据库分库分表方案.
#### [ShardingSphere](http://shardingsphere.apache.org/)
#### [Mycat](http://www.mycat.io/)
### 服务部署
> 作用: 将项目快速部署、上线、持续集成.
#### [Docker](http://www.docker.com/)
#### [Jenkins](https://jenkins.io/zh/)
#### [Kubernetes(K8s)](https://kubernetes.io/)
#### [Mesos](http://mesos.apache.org/)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>互联网 Java 工程师进阶知识完全扫盲</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta
name="keywords"
content="doc,docs,doocs,documentation,github,gitee,advanced-java,yanglbme"
/>
<meta
name="description"
content="互联网 Java 工程师进阶知识完全扫盲,项目维护者:杨立滨"
/>
<meta
name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"
/>
<link
rel="stylesheet"
href="//cdn.jsdelivr.net/npm/docsify/lib/themes/vue.css"
/>
<link
rel="stylesheet"
href="//cdn.jsdelivr.net/npm/docsify-dark-mode@0.6.1/dist/style.css"
/>
<link
rel="icon"
type="image/png"
sizes="32x32"
href="images/favicon-32x32.png"
/>
<link
rel="icon"
type="image/png"
sizes="16x16"
href="images/favicon-16x16.png"
/>
</head>
<head>
<meta charset="UTF-8">
<title>互联网 Java 工程师进阶知识完全扫盲</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="keywords" content="doc,docs,doocs,documentation,github,gitee,advanced-java,yanglbme">
<meta name="description" content="互联网 Java 工程师进阶知识完全扫盲,项目维护者:杨立滨">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify/lib/themes/vue.css">
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify-dark-mode@0.6.1/dist/style.css" />
<link rel="icon" type="image/png" sizes="32x32" href="images/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="images/favicon-16x16.png">
</head>
<body>
<nav>
<ul>
<li>
分类
<ul>
<li><a href="#/?id=高并发架构">高并发</a></li>
<li><a href="#/?id=分布式系统">分布式</a></li>
<li><a href="#/?id=高可用架构">高可用</a></li>
<li><a href="#/?id=微服务架构">微服务</a></li>
<li><a href="#/?id=海量数据处理">海量数据</a></li>
</ul>
</li>
<li>
页面
<ul>
<li><a href="#">封面</a></li>
<li><a href="#/README">首页</a></li>
<li><a href="#/docs/extra-page/advanced">进阶</a></li>
<li><a href="#/docs/extra-page/offer">Offer</a></li>
</ul>
</li>
</ul>
</nav>
<div id="app">本系列知识由 Doocs 开源社区总结发布</div>
<script>
window.$docsify = {
name: "advanced-java",
repo: "doocs/advanced-java",
maxLevel: 3,
auto2top: true,
coverpage: true,
coverpage: "docs/extra-page/cover.md",
loadSidebar: "summary.md",
alias: {
"/.*/.*/summary": "summary.md",
"/.*/summary.md": "summary.md",
},
pagination: {
previousText: "上一篇",
nextText: "下一篇",
crossChapter: true,
crossChapterText: true,
},
search: {
maxAge: 1800000,
paths: [
"/docs/high-concurrency/",
"/docs/distributed-system/",
"/docs/high-availability/",
"/docs/micro-services/",
"/docs/big-data/",
],
depth: 3,
},
darkMode: {
light: {
toggleBtnBg: "#42b983",
},
},
plugins: [
function (hook, vm) {
hook.beforeEach(function (content) {
const en = vm.route.file.indexOf("README_EN") > -1;
if (/githubusercontent\.com/.test(vm.route.file)) {
url = vm.route.file
.replace("raw.githubusercontent.com", "github.com")
.replace(/\/master/, "/blob/master");
} else {
url =
"https://github.com/doocs/advanced-java/blob/master/" +
vm.route.file;
}
<body>
<nav>
<ul>
<li>分类
<ul>
<li><a href="#/?id=高并发架构">高并发</a></li>
<li><a href="#/?id=分布式系统">分布式</a></li>
<li><a href="#/?id=高可用架构">高可用</a></li>
<li><a href="#/?id=微服务架构">微服务</a></li>
<li><a href="#/?id=海量数据处理">海量数据</a></li>
</ul>
</li>
<li>页面
<ul>
<li><a href="#">封面</a></li>
<li><a href="#/README">首页</a></li>
<li><a href="#/docs/extra-page/advanced">进阶</a></li>
<li><a href="#/docs/extra-page/offer">Offer</a></li>
</ul>
</li>
</ul>
const github = `[GitHub](${url})`;
const gitee = `[Gitee](${url.replace("github", "gitee")})`;
</nav>
<div id="app">本系列知识由 Doocs 开源社区总结发布</div>
<script>
window.$docsify = {
name: 'advanced-java',
repo: 'doocs/advanced-java',
maxLevel: 3,
auto2top: true,
coverpage: true,
coverpage: 'docs/extra-page/cover.md',
loadSidebar: 'summary.md',
alias: {
'/.*/.*/summary': 'summary.md',
'/.*/summary.md': 'summary.md'
},
pagination: {
previousText: '上一篇',
nextText: '下一篇',
crossChapter: true,
crossChapterText: true
},
search: {
maxAge: 1800000,
paths: [
'/docs/high-concurrency/',
'/docs/distributed-system/',
'/docs/high-availability/',
'/docs/micro-services/',
'/docs/big-data/',
],
depth: 3
},
darkMode: {
light: {
toggleBtnBg: '#42b983'
}
},
plugins: [
function (hook, vm) {
hook.beforeEach(function (content) {
const en = vm.route.file.indexOf('README_EN') > -1
if (/githubusercontent\.com/.test(vm.route.file)) {
url = vm.route.file
.replace('raw.githubusercontent.com', 'github.com')
.replace(/\/master/, '/blob/master')
} else {
url = 'https://github.com/doocs/advanced-java/blob/master/' + vm.route.file
}
const github = `[GitHub](${url})`
const gitee = `[Gitee](${url.replace("github", "gitee")})`
const editHtml = en ? `:memo: Edit on ${github} / ${gitee}\n` : `:memo: 在 ${github} / ${gitee} 编辑\n`;
const editHtml = en
? `:memo: Edit on ${github} / ${gitee}\n`
: `:memo: 在 ${github} / ${gitee} 编辑\n`;
if (vm.route.path == '/') {
return editHtml + content;
}
const subscription = `
if (vm.route.path == "/") {
return editHtml + content;
}
const subscription = `
## 公众号
[Doocs](https://github.com/doocs) 技术社区旗下唯一公众号「**Doocs开源社区**」​,欢迎扫码关注,**专注分享技术领域相关知识及业内最新资讯**。当然,也可以加我个人微信(备注:GitHub),拉你进技术交流群。
......@@ -117,35 +145,34 @@
</td>
</tr>
</table>
`
return editHtml + content + `\n` + subscription
})
`;
return editHtml + content + `\n` + subscription;
});
hook.afterEach(function (html) {
const footer = [
'<footer>',
'<span>Copyright © 2018-2020 <a href="https://github.com/doocs" target="_blank">Doocs</a>. All rights reserved.',
'</footer>'
].join('')
return html + footer
})
}
]
}
</script>
<script src="//cdn.jsdelivr.net/npm/docsify/lib/docsify.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/prismjs/components/prism-c.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/prismjs/components/prism-bash.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/prismjs/components/prism-cpp.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/prismjs/components/prism-json.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/prismjs/components/prism-java.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/prismjs/components/prism-python.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/docsify-copy-code"></script>
<script src="//cdn.jsdelivr.net/npm/docsify/lib/plugins/search.js"></script>
<script src="//cdn.jsdelivr.net/npm/docsify/lib/plugins/emoji.js"></script>
<script src="//cdn.jsdelivr.net/npm/docsify/lib/plugins/zoom-image.js"></script>
<script src="//cdn.jsdelivr.net/npm/docsify-dark-mode@0.6.1/dist/index.js"></script>
<script src="//cdn.jsdelivr.net/npm/docsify-pagination/dist/docsify-pagination.min.js"></script>
</body>
</html>
\ No newline at end of file
hook.afterEach(function (html) {
const footer = [
"<footer>",
'<span>Copyright © 2018-2020 <a href="https://github.com/doocs" target="_blank">Doocs</a>. All rights reserved.',
"</footer>",
].join("");
return html + footer;
});
},
],
};
</script>
<script src="//cdn.jsdelivr.net/npm/docsify/lib/docsify.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/prismjs/components/prism-c.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/prismjs/components/prism-bash.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/prismjs/components/prism-cpp.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/prismjs/components/prism-json.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/prismjs/components/prism-java.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/prismjs/components/prism-python.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/docsify-copy-code"></script>
<script src="//cdn.jsdelivr.net/npm/docsify/lib/plugins/search.js"></script>
<script src="//cdn.jsdelivr.net/npm/docsify/lib/plugins/emoji.js"></script>
<script src="//cdn.jsdelivr.net/npm/docsify/lib/plugins/zoom-image.js"></script>
<script src="//cdn.jsdelivr.net/npm/docsify-dark-mode@0.6.1/dist/index.js"></script>
<script src="//cdn.jsdelivr.net/npm/docsify-pagination/dist/docsify-pagination.min.js"></script>
</body>
</html>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册