title: “通信协议” lang: cn ref: communicate-protocol permalink: /cn/docs/users/communicate-protocol/ excerpt: “通信协议” last_modified_at: 2017-08-15T15:01:43-04:00 redirect_from:
{% include toc %}
ServiceComb实现了两种网络通道,包括REST和Highway,均支持TLS加密传输。其中,REST网络通道将服务以标准RESTful形式发布,调用端兼容直接使用http client使用标准RESTful形式进行调用。
参数和返回值的序列化:
当前REST通道的body参数只支持application/json序列化方式,如果要向服务端发送form类型的参数,那么需要在调用端构造好application/json格式的body,不能直接以multipart/form-data格式传递form类型参数。
当前REST通道返回值支持application/json和text/plain两种格式,服务提供者通过produces声明可提供序列化能力,服务消费者通过请求的Accept头指明返回值序列化方式,默认返回application/json格式的数据。
本小节主要介绍ServiceComb微服务的完整线程模型,介绍IO线程和业务线程之间的关系
ServiceComb微服务的完整线程模型如下图所示:
- 业务线程在第一次调用时会绑定某一个网络线程,避免在不同网络线程之间切换,无谓地增加线程冲突的概率
- 业务线程绑定网络线程后,会再绑定该网络线程内部的某个连接,同样是为了避免线程冲突
在microservice.yaml中添加executors配置,为schemaId:operation配置单独的业务线程池:
servicecomb: executors: Provider: [schemaId].[operation]
REST over Servlet对应使用web容器模式部署运行,需要新建一个servlet工程将微服务包装起来,加载到web容器中启动运行,包装微服务的方法有两种,一种完全使用web.xml配置文件配置,另一种仅在web.xml文件中配置listener,在microservice.yaml文件中配置urlPattern,两种方式如下所示:
在web.xml文件中完成全部配置
web.xml文件配置在项目的src/main/webapp/WEB_INF目录,配置内容如下:
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:META-INF/spring/*.bean.xml classpath*:app-config.xml</param-value> </context-param> <listener> <listener-class>org.apache.servicecomb.transport.rest.servlet.RestServletContextListener</listener-class> </listener> <servlet> <servlet-name>RestServlet</servlet-name> <servlet-class>org.apache.servicecomb.transport.rest.servlet.RestServlet</servlet-class> <load-on-startup>1</load-on-startup> <async-supported>true</async-supported> </servlet> <servlet-mapping> <servlet-name>RestServlet</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> </web-app>
在web.xml文件中仅配置listener,在microservice.yaml文件中配置urlPattern
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:META-INF/spring/*.bean.xml classpath*:app-config.xml</param-value> </context-param> <listener> <listener-class>org.apache.servicecomb.transport.rest.servlet.RestServletContextListener</listener-class> </listener> </web-app>
在microservice.yaml文件中需要增加一行配置来指定urlPattern:
servicecomb.rest.servlet.urlPattern: /rest/*
以上两种方式是等效的,两种方式都需要在maven pom文件中添加如下依赖:
<dependency> <groupId>org.apache.servicecomb</groupId> <artifactId>transport-rest-servlet</artifactId> </dependency>
REST over Servlet在microservice.yaml文件中的配置项见下表:
表1 REST over Servlet配置项说明
配置项 | 默认值 | 取值范围 | 是否必选 | 含义 | 注意 |
---|---|---|---|---|---|
servicecomb.rest.address | 0.0.0.0:8080 | - | 否 | 服务监听地址 | - |
servicecomb.rest.timeout | 3000 | - | 否 | 超时时间 | 单位为毫秒 |
servicecomb.request.timeout | 30000 | - | 否 | 请求超时时间 | 同REST over Vertx的配置 |
servicecomb.references.[服务名].transport | rest | 否 | 访问的transport类型 | 同REST over Vertx的配置 | |
servicecomb.references.[服务名].version-rule | latest | - | 否 | 访问实例的版本号 | 同REST over Vertx的配置 |
microservice.yaml文件中的配置示例如下:
servicecomb: rest: address: 0.0.0.0:8080 timeout: 3000
REST over Vertx通信通道对应使用standalone部署运行模式,可直接通过main函数拉起。main函数中需要初始化日志和加载服务配置,代码如下:
import org.apache.servicecomb.foundation.common.utils.BeanUtils; import org.apache.servicecomb.foundation.common.utils.Log4jUtils; public class MainServer { public static void main(String[] args) throws Exception { Log4jUtils.init();//日志初始化 BeanUtils.init(); // Spring bean初始化 } }
使用REST over Vertx网络通道需要在maven pom文件中添加如下依赖:
<dependency> <groupId>org.apache.servicecomb</groupId> <artifactId>transport-rest-vertx</artifactId> </dependency>
REST over Vertx通道在microservice.yaml文件中有以下配置项:
表2 REST over Vertx配置项说明
配置项 | 默认值 | 取值范围 | 是否必选 | 含义 | 注意 |
---|---|---|---|---|---|
servicecomb.rest.address | 0.0.0.0:8080 | - | 否 | 服务监听地址 | 仅服务提供者需要配置 |
servicecomb.rest.server.thread-count | 1 | - | 否 | 服务端线程数 | 仅服务提供者需要配置 |
servicecomb.rest.client.thread-count | 1 | - | 否 | 客户端网络线程数 | 仅服务消费者需要配置 |
servicecomb.rest.client.connection-pool-per-thread | 1 | - | 否 | 客户端每个网络线程中的连接池的个数 | 仅服务消费者需要配置 |
servicecomb.request.timeout | 30000 | - | 否 | 请求超时时间 | |
servicecomb.references.[服务名].transport | rest | 否 | 访问的transport类型 | 仅服务消费者需要配置 | |
servicecomb.references.[服务名].version-rule | latest | - | 否 | 访问实例的版本号 | 仅服务消费者需要配置支持latest,1.0.0+,1.0.0-2.0.2,精确版本。详细参考服务中心的接口描述。 |
microservice.yaml文件中的配置示例:
servicecomb: rest: address: 0.0.0.0:8080 thread-count: 1 references: hello: transport: rest version-rule: 0.0.1
Highway是ServiceComb的高性能私有协议,用户可在有特殊性能需求的场景下选用。
使用Highway网络通道需要在maven pom文件中添加如下依赖:
<dependency> <groupId>org.apache.servicecomb</groupId> <artifactId>transport-highway</artifactId> </dependency>
Highway通道在microservice.yaml文件中的配置项如下表所示:
表3 Highway配置项说明
配置项 | 默认值 | 取值范围 | 是否必选 | 含义 | 注意 |
---|---|---|---|---|---|
servicecomb.highway.address | 0.0.0.0:7070 | - | 否 | 服务监听地址 | - |
servicecomb.highway.server.thread-count | 1 | - | 否 | 服务端网络线程个数 | - |
servicecomb.highway.client.thread-count | 1 | - | 否 | 客户端网络线程个数 | - |
servicecomb.highway.client.connection-pool-per-thread | 1 | - | 否 | 客户端每个网络线程的连接池个数 | - |
servicecomb.request.timeout | 30000 | - | 否 | 请求超时时间 | 同REST over Vertx的配置 |
servicecomb.references.[服务名].transport | rest | 否 | 访问的transport类型 | 同REST over Vertx的配置 | |
servicecomb.references.[服务名].version-rule | latest | - | 否 | 访问实例的版本号 | 同REST over Vertx的配置 |
microservice.yaml文件中的配置示例:
servicecomb: highway: address: 0.0.0.0:7070