Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 18 additions & 23 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -186,12 +186,12 @@ Nuxt.js是在vue框架上进行封装的,主要是用来解决单体页面的

#### 插件使用

- [egg-validate参数校验]()
- [egg-view-ejs页面渲染]()
- [egg-redis缓存]()
- [egg-mysql]()
- [egg-sequelize]()
- [egg-socket.io即时通讯]()
- [ ] [egg-validate参数校验]()
- [ ] [egg-view-ejs页面渲染]()
- [ ] [egg-redis缓存]()
- [ ] [egg-mysql]()
- [ ] [egg-sequelize]()
- [ ] [egg-socket.io即时通讯]()

#### 最佳实践

Expand Down Expand Up @@ -221,14 +221,14 @@ Nuxt.js是在vue框架上进行封装的,主要是用来解决单体页面的
- [ ] 索引
- [ ] sql优化
- [ ] [基于GTID主从复制的原理和基础配置]()
- [MySQL日志类型把我难哭了,你学废了吗?]()
- [ ] [MySQL日志类型把我难哭了,你学废了吗?]()

### Redis

- [key命名规范与建议]()
- [redis开发使用规范]()
- [redis基础介绍]()
- [redis的简单安装和部署](https://mp.weixin.qq.com/s/Xe-ZDf2kgUWfYSkuULAdlw)
- [ ] [key命名规范与建议]()
- [ ] [redis开发使用规范]()
- [ ] [redis基础介绍]()
- [ ] [redis的简单安装和部署](https://mp.weixin.qq.com/s/Xe-ZDf2kgUWfYSkuULAdlw)
- [ ] 数据类型
- [ ] [redis简单主从集群部署-docker方式]()
- [ ] [memCache与Redis比较]()
Expand Down Expand Up @@ -349,7 +349,7 @@ Nuxt.js是在vue框架上进行封装的,主要是用来解决单体页面的

### Nacos

> 阿里巴巴出品,适用于微服务下的配置管理,支持Java、Nodejs等主流语言,目前生态良好,技术支持表现一般,属于Apollo替代产品|发、、
> 阿里巴巴出品,适用于微服务下的配置管理,支持Java、Nodejs等主流语言,目前生态良好,技术支持表现一般,属于Apollo替代产品

## 消息中间件

Expand All @@ -364,13 +364,13 @@ Nuxt.js是在vue框架上进行封装的,主要是用来解决单体页面的
### gRPC

> gRPC 一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统,tensorflow分布式与tensorflow
> serving底层通信都是是用的grpc。我自己基于JavaScript技术栈上较多的接触到gRPC,传送门:[基于js下各框架grpc的使用]()
> serving底层通信都是是用的gRPC。我自己基于JavaScript技术栈上较多的接触到gRPC,传送门:[基于js下各框架gRPC的使用]()

- [ ] nodejs下grpc的简单实用
- [ ] grpc集成express框架
- [ ] grpc集成koa框架
- [ ] grpc在egg.js下的应用
- [ ] grpc插件开发示例
- [ ] nodejs下gRPC的简单实用
- [ ] gRPC集成express框架
- [ ] gRPC集成koa框架
- [ ] gRPC在egg.js下的应用
- [ ] gRPC插件开发示例

### Dubbo

Expand All @@ -390,7 +390,6 @@ Nuxt.js是在vue框架上进行封装的,主要是用来解决单体页面的

### Logstash

>
> 数据收集

### Kibana
Expand All @@ -399,8 +398,6 @@ Nuxt.js是在vue框架上进行封装的,主要是用来解决单体页面的

## 监控工具

> 常用工具:Prometheus 、Grafana、zabbix、lepus等

### Prometheus

### Grafana
Expand Down Expand Up @@ -459,8 +456,6 @@ Nuxt.js是在vue框架上进行封装的,主要是用来解决单体页面的

### Redis集群

> 持续整理中...

#### 主从模式

#### 哨兵模式
Expand Down
10 changes: 10 additions & 0 deletions code/node/es6/es5-2009-every.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
const nums = [12, 14, 33, 25, 28]


// 判断数组中的值是否全部超过15的
const over15 = nums.every(num => {
return num > 15
})

// 输出 false
console.log(over15)
8 changes: 8 additions & 0 deletions code/node/es6/es5-2009-forEach.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
const arr = [1, 2, 3]

const result: number[] = []
arr.forEach(a => {
result.push(a * a)
})
// 返回 [1,4,9]
console.log(result)
7 changes: 7 additions & 0 deletions code/node/es6/es5-2009-indexOf.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
const stu = ['142vip', 'Lisa', '142vip']

// 输出 0,数组中角标为0对应的就是142vip
console.log(stu.indexOf('142vip'))

// 支持指定起始索引
console.log(stu.indexOf('142vip', 1))
3 changes: 3 additions & 0 deletions code/node/es6/es5-2009-isArray.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
const arr = [1, 2, 3]
// 返回 true
Array.isArray(arr)
7 changes: 7 additions & 0 deletions code/node/es6/es5-2009-lastIndexOf.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
const stu = ['Tom', 'Lisa', '142vip']

// 输出 2,数组中角标为2对应的就是142vip
console.log(stu.lastIndexOf('142vip'))

// 支持指定起始索引
console.log(stu.lastIndexOf('142vip', 2))
5 changes: 5 additions & 0 deletions code/node/es6/es5-2009-reduceRight.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
const nums = [12, 14, 33, 25, 28]

const reuslt = 1

nums.reduceRight()
10 changes: 10 additions & 0 deletions code/node/es6/es5-2009-some.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
const nums = [12, 14, 33, 25, 28]


// 判断数组中的值是否存在超过15的
const over15 = nums.some(num => {
return num > 15
})

// 输出 true
console.log(over15)
32 changes: 21 additions & 11 deletions docs/manuscripts/microservice/grpc.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ permalink: /manuscripts/microservice/grpc.html

# gRPC

**gRPC 是一种可扩展、松耦合且类型安全的解决方案,与传统的基于 REST/HTTP 的通信相比,它实现了更高效的进程间通信。允许你像本地方法调用一样调用、调试分布式应用程序**
**gRPC 是一种可扩展、松耦合且类型安全的解决方案,与传统的基于 REST/HTTP 的通信相比,它实现了更高效的进程间通信。允许你像本地方法调用一样调用、调试分布式应用程序
**

gRPC 是一个现代开源高性能远程过程调用 (RPC) 框架,可以在任何环境中运行。它可以通过对负载平衡、跟踪、健康检查和身份验证的可插拔支持,
有效地连接数据中心内和跨数据中心的服务,基于Protobuf序列化协议开发,且支持众多开发语言。
Expand Down Expand Up @@ -54,15 +55,17 @@ rpc SayHello(HelloRequest) returns (HelloResponse);

- 服务器流式 RPC

其中客户端向服务器发送请求并获取流以读取一系列消息。客户端从返回的流中读取,直到没有更多消息为止。**gRPC 保证单个 RPC 调用中的消息排序**
其中客户端向服务器发送请求并获取流以读取一系列消息。客户端从返回的流中读取,直到没有更多消息为止。**gRPC 保证单个 RPC
调用中的消息排序**

```protobuf
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);
```

- 客户端流式 RPC

其中客户端写入一系列消息并将它们发送到服务器,再次使用提供的流。客户端完成消息写入后,它会等待服务器读取消息并返回响应。gRPC 再次保证单个 RPC 调用中的消息排序。
其中客户端写入一系列消息并将它们发送到服务器,再次使用提供的流。客户端完成消息写入后,它会等待服务器读取消息并返回响应。gRPC
再次保证单个 RPC 调用中的消息排序。

```protobuf
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);
Expand All @@ -78,15 +81,17 @@ rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);

### 使用 API

从文件中的服务定义开始`.proto`,gRPC 提供生成客户端和服务器端代码的协议缓冲区编译器插件。gRPC 用户通常在客户端调用这些 API,并在服务器端实现相应的 API。
从文件中的服务定义开始`.proto`,gRPC 提供生成客户端和服务器端代码的协议缓冲区编译器插件。gRPC 用户通常在客户端调用这些
API,并在服务器端实现相应的 API。

- 在服务器端,服务器实现服务声明的方法,并运行一个 gRPC 服务器来处理客户端调用。gRPC 基础结构解码传入请求、执行服务方法并对服务响应进行编码。
在客户端,客户端有一个称为存根(对于某些语言,首选术语是客户端)的本地对象,它实现与服务相同的方法。
在客户端,客户端有一个称为存根(对于某些语言,首选术语是客户端)的本地对象,它实现与服务相同的方法。
- 客户端然后可以在本地对象上调用这些方法,这些方法将调用的参数包装在适当的协议缓冲区消息类型中,将请求发送到服务器,并返回服务器的协议缓冲区响应。

### 同步与异步

在响应从服务器到达之前阻塞的同步 RPC 调用最接近于 RPC 所追求的过程调用的抽象。**另一方面,网络本质上是异步的,在许多情况下,能够在不阻塞当前线程的情况下启动 RPC 是很有用的**。
在响应从服务器到达之前阻塞的同步 RPC 调用最接近于 RPC 所追求的过程调用的抽象。**另一方面,网络本质上是异步的,在许多情况下,能够在不阻塞当前线程的情况下启动
RPC 是很有用的**。

## RPC 生命周期

Expand All @@ -101,7 +106,8 @@ rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);

### 服务器流式 RPC

服务器流式 RPC 类似于一元 RPC,不同之处在于服务器返回消息流以响应客户端的请求。发送完所有消息后,服务器的状态详细信息(状态代码和可选的状态消息)和可选的尾随元数据将发送到客户端。这样就完成了服务器端的处理。客户端在收到服务器的所有消息后完成。
服务器流式 RPC 类似于一元
RPC,不同之处在于服务器返回消息流以响应客户端的请求。发送完所有消息后,服务器的状态详细信息(状态代码和可选的状态消息)和可选的尾随元数据将发送到客户端。这样就完成了服务器端的处理。客户端在收到服务器的所有消息后完成。

### 客户端流式 RPC

Expand Down Expand Up @@ -140,17 +146,21 @@ rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);

优点:

- **实现的进程间通信方式高效。** gRPC 不使用 JSON 或 XML 等文本格式,而是使用基于二进制协议的protocol buffer与 gRPC 服务、客户端进行通信。此外,gRPC 是在 HTTP/2 之上实现的protocol buffer,这使得进程间通信更快。
- **具有简单、定义良好的服务接口和协议。** 你首先定义服务接口,然后处理实现细节。因此,与用于RESTful服务定义的 OpenAPI/Swagger 和用于 SOAP Web 服务的 WSDL 不同,gRPC 提供了简单但一致、可靠且可扩展的应用程序开发体验。
- **实现的进程间通信方式高效。** gRPC 不使用 JSON 或 XML 等文本格式,而是使用基于二进制协议的protocol buffer与 gRPC
服务、客户端进行通信。此外,gRPC 是在 HTTP/2 之上实现的protocol buffer,这使得进程间通信更快。
- **具有简单、定义良好的服务接口和协议。** 你首先定义服务接口,然后处理实现细节。因此,与用于RESTful服务定义的
OpenAPI/Swagger 和用于 SOAP Web 服务的 WSDL 不同,gRPC 提供了简单但一致、可靠且可扩展的应用程序开发体验。
- **强类型。** protocol buffer清楚地定义了应用程序之间通信的数据类型,这使得分布式应用程序开发更加稳定。因为静态类型有助于减少你在构建跨多个团队和技术的云原生应用程序时遇到的大多数运行时和交互错误。
- **支持多语言。** gRPC被设计成支持多种编程语言。使用protocol buffer的服务定义与语言无关。因此,你可以选择grpc支持的任意语言,并与任何现有的 gRPC 服务或客户端进行通信。
- **支持多语言。** gRPC被设计成支持多种编程语言。使用protocol buffer的服务定义与语言无关。因此,你可以选择gRPC支持的任意语言,并与任何现有的
gRPC 服务或客户端进行通信。
- **支持双向流式传输。** gRPC 对客户端或服务器端流式传输具有原生支持,这使得开发流媒体服务或流媒体客户端变得更加容易。
- **内置多种高级特性。** gRPC 提供对高级特性的内置支持,例如身份验证、加密、元数据交换、压缩、负载平衡、服务发现等。
- **与云原生生态系统高度集成。** gRPC 是 CNCF 的一部分,大多数现代框架和技术都为 gRPC 提供了开箱即用的原生支持。

缺点:

- **可能不适合面向外部的服务。** 当你想将应用程序或服务提供给外部客户端使用时,gRPC 可能不是最合适的协议,因为大多数外部使用者对 gRPC 还很陌生。而且,gRPC 服务的协议驱动、强类型化特性可能会降低你向外部提供的服务的灵活性,因为外部使用者可以控制的东西要少得多。
- **可能不适合面向外部的服务。** 当你想将应用程序或服务提供给外部客户端使用时,gRPC 可能不是最合适的协议,因为大多数外部使用者对
gRPC 还很陌生。而且,gRPC 服务的协议驱动、强类型化特性可能会降低你向外部提供的服务的灵活性,因为外部使用者可以控制的东西要少得多。
- **生态系统相对较小。** 与传统的 REST/HTTP 协议相比,gRPC 生态系统仍然相对较小。浏览器和移动应用程序对 gRPC 的支持仍处于初级阶段。

## 参考资料
Expand Down
Loading