项目地址:
https://github.com/FateSolo/Dubbo-Test
目录:
- 0. 序
- 1. Maven构建项目
- 2. Gradle构建项目
- 3. 搭建Spring + Dubbo框架
- 4. 支持RESTful Remoting
- 5. Dubbo服务集群
- 6. ZooKeeper集群
- 7. Nginx + Tomcat集群
- 8. Redis共享session
本章将对dubbo-server进行优化,包括为dubbo协议替换高效二进制序列化实现Kryo和增加RESTful协议(均是当当网维护的Dubbox项目所增加的功能)。
1. 替换序列化实现:
dubbo协议采用单一长连接和NIO异步通讯,是Dubbo框架所推荐的协议,其缺省采用Hessian序列化方式。
Kryo是Dubbox中引入的两个高效序列化实现中的一个(另一个是FST),其性能显著优于Hessian。
1) 打开dubbo-parent下的build.gradle,添加Kryo的依赖:1
2compile 'com.esotericsoftware.kryo:kryo:2.24.0'
compile 'de.javakaffee:kryo-serializers:0.41'
2) 在dubbo-api中添加子包serialization,并创建SerializationOptimizerImpl类:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21package com.fatesolo.dubbo.api.serialization;
import com.alibaba.dubbo.common.serialize.support.SerializationOptimizer;
import com.fatesolo.dubbo.api.bean.Book;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
public class SerializationOptimizerImpl implements SerializationOptimizer {
@Override
public Collection<Class> getSerializableClasses() {
List<Class> classes = new LinkedList<>();
classes.add(Book.class);
return classes;
}
}
dubbo-api此时没有Dubbo的依赖,因此无法找到SerializationOptimizer接口
3) 再次打开dubbo-parent下的build.gradle,将对Dubbo 2.8.4的依赖由configure移至subprojects下,令dubbo-api拥有对Dubbo框架的依赖。
4) 打开dubbo-server.xml,更改dubbo:protocol标签如下:1
2<dubbo:protocol name="dubbo" port="20880" serialization="kryo"
optimizer="com.fatesolo.dubbo.api.serialization.SerializationOptimizerImpl"/>
至此序列化实现已经切换至Kryo,此后所有需要序列化的类都应该在SerializationOptimizerImpl中添加。
2. 增加RESTful协议:
目前dubbo-server采用了缺省的Dubbo协议,即TCP协议(Netty) + 二进制序列化(Kryo)。
在Dubbox中增加了对RESTful的支持,即Http协议 + Json,由于此协议能同时支持REST服务和RPC调用,故称为RESTful Remoting。
1) 打开dubbo-parent下的build.gradle,增加subprojects下的依赖:1
compile 'org.jboss.resteasy:resteasy-client:3.1.3.Final'
增加configure下的依赖:1
compile 'org.jboss.resteasy:resteasy-jackson-provider:3.1.3.Final'
2) 打开dubbo-server下的build.gradle,增加如下依赖:1
2
3
4
5
6dependencies {
compile 'javax.validation:validation-api:1.0.0.GA'
compile 'org.apache.tomcat.embed:tomcat-embed-core:8.0.11'
compile 'org.apache.tomcat.embed:tomcat-embed-logging-juli:8.0.11'
}
3) 打开dubbo-api下的BookService,更改如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26package com.fatesolo.dubbo.api.service;
import com.fatesolo.dubbo.api.bean.Book;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import java.util.List;
@Path("/book")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public interface BookService {
@GET
@Path("/{id}")
Book getBookById(@PathParam("id") int id);
@GET
@Path("/")
List<Book> getBooks();
@POST
@Path("/")
Boolean addBook(Book book);
}
这里将addBook方法的返回类型由boolean更改为了Boolean,因此同时也要修改dubbo-server中的BookServiceImpl:1
2@Override
public Boolean addBook(Book book) {
4) 打开dubbo-server.xml,增加一个协议:1
<dubbo:protocol name="rest" port="7110" server="tomcat" contextpath="dubbo-server"/>
更改BookService使用的协议:1
2<dubbo:service interface="com.fatesolo.dubbo.api.service.BookService"
ref="bookServiceImpl" protocol="rest"/>
3. 测试RESTful Remoting:
1) 分别运行dubbo-server和dubbo-client。
2) 使用dubbo-client添加一条数据:1
curl -d "name=Book1&author=Fate" http://localhost:8080/dubbo-client/book
3) 访问http://localhost:8080/dubbo-client/book ,得到如下结果:1
[{"id":1,"name":"Book1","author":"Fate"}]
4) 使用dubbo-server添加一条数据:1
curl -H "Content-Type:application/json" -d "{\"name\":\"Book2\",\"author\":\"Fate\"}" http://localhost:7110/dubbo-server/book
5) 访问http://localhost:7110/dubbo-server/book ,得到如下结果:1
[{"id":1,"name":"Book1","author":"Fate"},{"id":2,"name":"Book2","author":"Fate"}]
至此,dubbo-server的RESTful协议已经同时支持REST服务和RPC调用。
作者 [@FateSolo]
2017 年 06月 02日