mirror of
https://github.com/doocs/advanced-java.git
synced 2025-01-15 05:30:11 +08:00
docs: update what's-microservice-how-to-communicate.md
更新文档
This commit is contained in:
parent
63eb4f0132
commit
fbf115a603
@ -1,25 +1,26 @@
|
|||||||
# 什么是微服务?微服务之间是如何独立通讯的?
|
# 什么是微服务?微服务之间是如何独立通讯的?
|
||||||
- Author: [HuiFer](https://github.com/huifer)
|
- Author: [HuiFer](https://github.com/huifer)
|
||||||
- Description: 介绍微服务的定义,服务之间的通讯,对RPC 和
|
- Description: 介绍微服务的定义以及服务间的通信。
|
||||||
|
|
||||||
## 什么是微服务
|
## 什么是微服务
|
||||||
> 微服务架构是一个分布式系统, 按照业务进行划分成为不同的服务单元, 解决单体系统性能等不足.
|
- 微服务架构是一个分布式系统, 按照业务进行划分成为不同的服务单元, 解决单体系统性能等不足。
|
||||||
> 微服务是一种架构风格, 一个大型软件应用由多个服务单元组成. 系统中的服务单元可以单独部署, 各个服务单元之间是松耦合的.
|
- 微服务是一种架构风格,一个大型软件应用由多个服务单元组成。系统中的服务单元可以单独部署,各个服务单元之间是松耦合的。
|
||||||
|
|
||||||
> 微服务概念起源: [Microservices](https://martinfowler.com/articles/microservices.html)
|
> 微服务概念起源: [Microservices](https://martinfowler.com/articles/microservices.html)
|
||||||
>
|
|
||||||
## 微服务之间是如何独立通讯的
|
## 微服务之间是如何独立通讯的
|
||||||
### 同步
|
### 同步
|
||||||
#### REST HTTP 协议
|
#### REST HTTP 协议
|
||||||
> REST 请求在微服务中是最为常用的一种通讯方式, 它依赖于 HTTP\HTTPS 协议.
|
REST 请求在微服务中是最为常用的一种通讯方式, 它依赖于 HTTP\HTTPS 协议。RESTFUL 的特点是:
|
||||||
- RESTFUL特点
|
|
||||||
|
|
||||||
1. 每一个URI代表1种资源
|
1. 每一个 URI 代表 1 种资源
|
||||||
2. 客户端使用 GET、POST、PUT、DELETE 4个表示操作方式的动词对服务端资源进行操作: GET 用来获取资源, POST 用来新建资源(也可以用于更新资源), PUT 用来更新资源, DELETE 用来删除资源
|
2. 客户端使用 GET、POST、PUT、DELETE 4 个表示操作方式的动词对服务端资源进行操作: GET 用来获取资源, POST 用来新建资源(也可以用于更新资源), PUT 用来更新资源, DELETE 用来删除资源
|
||||||
3. 通过操作资源的表现形式来操作资源
|
3. 通过操作资源的表现形式来操作资源
|
||||||
4. 资源的表现形式是 XML 或者 HTML
|
4. 资源的表现形式是 XML 或者 HTML
|
||||||
5. 客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都必须包含理解请求所必需的信息
|
5. 客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都必须包含理解请求所必需的信息
|
||||||
##### 例子
|
|
||||||
- 有一个服务方提供了如下接口.
|
举个例子,有一个服务方提供了如下接口:
|
||||||
|
|
||||||
```java
|
```java
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/communication")
|
@RequestMapping("/communication")
|
||||||
@ -30,7 +31,9 @@ public class RestControllerDemo {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
- 另外一个服务需要去调用该接口, 调用方只需要根据 API 文档发送请求即可获取返回结果.
|
|
||||||
|
另外一个服务需要去调用该接口,调用方只需要根据 API 文档发送请求即可获取返回结果。
|
||||||
|
|
||||||
```java
|
```java
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/demo")
|
@RequestMapping("/demo")
|
||||||
@ -45,25 +48,28 @@ public class RestDemo{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
- 通过这样的方式可以实现服务之间的通讯
|
|
||||||
|
通过这样的方式可以实现服务之间的通讯。
|
||||||
|
|
||||||
|
|
||||||
#### RPC TCP协议
|
#### RPC TCP协议
|
||||||
> RPC(Remote Procedure Call)远程过程调用, 简单的理解是一个节点请求另一个节点提供的服务
|
RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务。它的工作流程是这样的:
|
||||||
>
|
|
||||||
>工作流程
|
1. 执行客户端调用语句,传送参数
|
||||||
> 1. 执行客户端调用语句,传送参数
|
2. 调用本地系统发送网络消息
|
||||||
> 2. 调用本地系统发送网络消息
|
3. 消息传送到远程主机
|
||||||
> 3. 消息传送到远程主机
|
4. 服务器得到消息并取得参数
|
||||||
> 4. 服务器得到消息并取得参数
|
5. 根据调用请求以及参数执行远程过程(服务)
|
||||||
> 5. 根据调用请求以及参数执行远程过程(服务)
|
6. 执行过程完毕,将结果返回服务器句柄
|
||||||
> 6. 执行过程完毕,将结果返回服务器句柄
|
7. 服务器句柄返回结果,调用远程主机的系统网络服务发送结果
|
||||||
> 7. 服务器句柄返回结果,调用远程主机的系统网络服务发送结果
|
8. 消息传回本地主机
|
||||||
> 8. 消息传回本地主机
|
9. 客户端句柄由本地主机的网络服务接收消息
|
||||||
> 9. 客户端句柄由本地主机的网络服务接收消息
|
10. 客户端接收到调用语句返回的结果数据
|
||||||
> 10. 客户端接收到调用语句返回的结果数据
|
|
||||||
- 这个不知道如何具体描述直接上代码.
|
举个例子。
|
||||||
- 首先需要一个服务端
|
|
||||||
|
首先需要一个服务端:
|
||||||
|
|
||||||
```java
|
```java
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -169,7 +175,9 @@ public class RPCServer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
- 其次需要一个客户端
|
|
||||||
|
其次需要一个客户端:
|
||||||
|
|
||||||
```java
|
```java
|
||||||
|
|
||||||
import java.io.ObjectInputStream;
|
import java.io.ObjectInputStream;
|
||||||
@ -226,7 +234,9 @@ public class RPCclient<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
- 再来一个测试的远程方法
|
|
||||||
|
再来一个测试的远程方法。
|
||||||
|
|
||||||
```java
|
```java
|
||||||
public interface Tinterface {
|
public interface Tinterface {
|
||||||
String send(String msg);
|
String send(String msg);
|
||||||
@ -240,7 +250,9 @@ public class TinterfaceImpl implements Tinterface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
- 测试代码
|
|
||||||
|
测试代码如下:
|
||||||
|
|
||||||
```java
|
```java
|
||||||
|
|
||||||
import com.huifer.admin.rpc.Tinterface;
|
import com.huifer.admin.rpc.Tinterface;
|
||||||
@ -269,10 +281,11 @@ public class RunTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
- 输出`send message rpc 测试用例`
|
|
||||||
|
输出 `send message rpc 测试用例`。
|
||||||
|
|
||||||
|
|
||||||
### 异步
|
### 异步
|
||||||
#### 消息中间件
|
#### 消息中间件
|
||||||
> 常见的消息中间件有 Kafka、ActiveMQ、RabbitMQ、RocketMQ , 常见的协议有AMQP、MQTTP、STOMP、XMPP. 这里不对消息队列进行拓展了, 具体如何使用还是请移步官网.
|
> 常见的消息中间件有 Kafka、ActiveMQ、RabbitMQ、RocketMQ , 常见的协议有AMQP、MQTTP、STOMP、XMPP. 这里不对消息队列进行拓展了, 具体如何使用还是请移步官网.
|
||||||
>
|
>
|
||||||
|
Loading…
Reference in New Issue
Block a user