准备工作:
1,安装好 zookeeper (可参考前一篇文章)
2,安装好maven
3,安装git(也可以不安装,直接下载源码)
下面进入正式步骤
1,在 git 命令行下,下载项目源码
git clone https://github.com/dangdangdotcom/dubbox
2,对下载下来的源码进行编译
mvn install -Dmaven.test.skip=true
3,下载下来的有一个文件夹 dubbo-demo ,这里包含了官方demo,可以参考。
官方demo里包含了3个文件夹 dubbo-demo-api(服务接口及传输对象)、dubbo-demo-provider(服务生产者)、dubbo-demo-consumer(服务消费方)
4,下载下来的有一个文件夹 dubbo-admin,这个是dubbo的后台管理,其配置文件在webapp\WEB-INF\底下,名为 dubbo.properties
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
将 dubbo-admin 打成war包,放在tomcat底下,即可以在浏览器进入dubo的后台,进行管理。
注意:zookeeper启动之后会占用8080端口。
5,dubbo-monitor项目用于性能监控
6,模拟官方demo,编写小demo
6.1,新建api项目
pom.xml
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
org.viking
dubbo-hello-api
0.0.1-SNAPSHOT
dubbo-hello-api
com.alibaba
dubbo
2.8.4
javax.validation
validation-api
1.0.0.GA
javax.annotation
javax.annotation-api
1.2
org.codehaus.jackson
jackson-mapper-asl
1.9.12
dubbo-hello-api
SerializationOptimizerImpl.java
/**
* Copyright 1999-2014 dangdang.com.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package viking.dubbo.demo.api;
import com.alibaba.dubbo.common.serialize.support.SerializationOptimizer;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
/**
* This class must be accessible from both the provider and consumer
*
* @author lishen
*/
public class SerializationOptimizerImpl implements SerializationOptimizer {
public Collection getSerializableClasses() {
List classes = new LinkedList();
classes.add(User.class);
return classes;
}
}
User.java
package viking.dubbo.demo.api;
import org.codehaus.jackson.annotate.JsonProperty;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.Serializable;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class User implements Serializable {
@NotNull
@Min(1L)
private Long id;
@JsonProperty("username")
@XmlElement(name = "username")
@NotNull
@Size(min = 6, max = 50)
private String name;
public User() {
}
public User(Long id, String name) {
this.id = id;
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User (" +
"id=" + id +
", name='" + name + '\'' +
')';
}
}
UserRestService.java
package viking.dubbo.demo.api;
import javax.validation.constraints.Min;
public interface UserRestService {
User getUser(@Min(value = 1L, message = "User ID must be greater than 1") Long id);
}
UserService.java
package viking.dubbo.demo.api;
public interface UserService {
User getUser(Long id);
}
6.2,新建provider
pom.xml
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
org.viking
dubbo-hello-provider
0.0.1-SNAPSHOT
dubbo-hello-provider
org.viking
dubbo-hello-api
0.0.1-SNAPSHOT
com.alibaba
dubbo
2.8.4
org.javassist
javassist
3.15.0-GA
org.apache.mina
mina-core
1.1.7
org.glassfish.grizzly
grizzly-core
2.1.4
org.apache.httpcomponents
httpclient
4.2.1
com.alibaba
fastjson
1.1.39
com.thoughtworks.xstream
xstream
1.4.1
org.apache.bsf
bsf-api
3.1
org.apache.zookeeper
zookeeper
3.4.6
com.github.sgroschupf
zkclient
0.1
org.apache.curator
curator-framework
2.5.0
com.googlecode.xmemcached
xmemcached
1.3.6
org.apache.cxf
cxf-rt-frontend-simple
2.6.1
org.apache.cxf
cxf-rt-transports-http
2.6.1
org.apache.thrift
libthrift
0.8.0
com.caucho
hessian
4.0.7
javax.servlet
javax.servlet-api
3.1.0
org.mortbay.jetty
jetty
6.1.26
org.mortbay.jetty
servlet-api
log4j
log4j
1.2.16
org.slf4j
slf4j-api
1.6.2
redis.clients
jedis
2.1.0
javax.validation
validation-api
1.0.0.GA
org.hibernate
hibernate-validator
4.2.0.Final
javax.cache
cache-api
0.4
org.jboss.resteasy
resteasy-jaxrs
3.0.7.Final
org.jboss.resteasy
resteasy-client
3.0.7.Final
org.jboss.resteasy
resteasy-netty
3.0.7.Final
org.jboss.resteasy
resteasy-jdk-http
3.0.7.Final
org.jboss.resteasy
resteasy-jackson-provider
3.0.7.Final
org.jboss.resteasy
resteasy-jaxb-provider
3.0.7.Final
org.apache.tomcat.embed
tomcat-embed-core
8.0.11
org.apache.tomcat.embed
tomcat-embed-logging-juli
8.0.11
com.esotericsoftware.kryo
kryo
2.24.0
de.javakaffee
kryo-serializers
0.26
de.ruedigermoeller
fst
1.55
dubbo-hello-provider
DemoProvider.java
package viking.dubbo.demo.provider;
import java.io.IOException;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class DemoProvider {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath*:META-INF/spring/*.xml");
context.start();
System.out.println("服务已经启动...");
System.in.read();
}
}
UserRestServiceImpl.java
package viking.dubbo.demo.provider;
import com.alibaba.dubbo.rpc.RpcContext;
import com.alibaba.dubbo.rpc.protocol.rest.support.ContentType;
import viking.dubbo.demo.api.User;
import viking.dubbo.demo.api.UserRestService;
import viking.dubbo.demo.api.UserService;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
@Path("users")
@Consumes({MediaType.APPLICATION_JSON, MediaType.TEXT_XML})
@Produces({ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8})
public class UserRestServiceImpl implements UserRestService {
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
@GET
@Path("{id : \\d+}")
public User getUser(@PathParam("id") Long id) {
if (RpcContext.getContext().getRequest(HttpServletRequest.class) != null) {
System.out.println("Client IP address from RpcContext: " + RpcContext.getContext().getRequest(HttpServletRequest.class).getRemoteAddr());
}
if (RpcContext.getContext().getResponse(HttpServletResponse.class) != null) {
System.out.println("Response object from RpcContext: " + RpcContext.getContext().getResponse(HttpServletResponse.class));
}
return userService.getUser(id);
}
}
UserServiceImpl.java
package viking.dubbo.demo.provider;
import viking.dubbo.demo.api.User;
import viking.dubbo.demo.api.UserService;
public class UserServiceImpl implements UserService {
public User getUser(Long id) {
return new User(id, "username" + id);
}
}
dubbo-demo-provider.xml
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
extension="com.alibaba.dubbo.rpc.protocol.rest.support.LoggingFilter"/>
6.3,新建 consumer
pom.xml
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
org.viking
dubbo-hello-consumer
0.0.1-SNAPSHOT
dubbo-hello-consumer
org.viking
dubbo-hello-api
0.0.1-SNAPSHOT
com.alibaba
dubbo
2.8.4
org.javassist
javassist
3.15.0-GA
org.apache.mina
mina-core
1.1.7
org.glassfish.grizzly
grizzly-core
2.1.4
org.apache.httpcomponents
httpclient
4.2.1
com.alibaba
fastjson
1.1.39
com.thoughtworks.xstream
xstream
1.4.1
org.apache.bsf
bsf-api
3.1
org.apache.zookeeper
zookeeper
3.4.6
com.github.sgroschupf
zkclient
0.1
org.apache.curator
curator-framework
2.5.0
com.googlecode.xmemcached
xmemcached
1.3.6
org.apache.cxf
cxf-rt-frontend-simple
2.6.1
org.apache.cxf
cxf-rt-transports-http
2.6.1
org.apache.thrift
libthrift
0.8.0
com.caucho
hessian
4.0.7
javax.servlet
javax.servlet-api
3.1.0
org.mortbay.jetty
jetty
6.1.26
org.mortbay.jetty
servlet-api
log4j
log4j
1.2.16
org.slf4j
slf4j-api
1.6.2
redis.clients
jedis
2.1.0
javax.validation
validation-api
1.0.0.GA
org.hibernate
hibernate-validator
4.2.0.Final
javax.cache
cache-api
0.4
org.jboss.resteasy
resteasy-jaxrs
3.0.7.Final
org.jboss.resteasy
resteasy-client
3.0.7.Final
org.jboss.resteasy
resteasy-netty
3.0.7.Final
org.jboss.resteasy
resteasy-jdk-http
3.0.7.Final
org.jboss.resteasy
resteasy-jackson-provider
3.0.7.Final
org.jboss.resteasy
resteasy-jaxb-provider
3.0.7.Final
org.apache.tomcat.embed
tomcat-embed-core
8.0.11
org.apache.tomcat.embed
tomcat-embed-logging-juli
8.0.11
com.esotericsoftware.kryo
kryo
2.24.0
de.javakaffee
kryo-serializers
0.26
de.ruedigermoeller
fst
1.55
dubbo-hello-consumer
DemoConsumer.java
package viking.dubbo.demo.consumer;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import viking.dubbo.demo.api.UserService;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;
public class DemoConsumer {
public static void main(String[] args) {
final String port = "8888";
//测试Rest服务
getUser("http://localhost:" + port + "/services/users/1.json");
getUser("http://localhost:" + port + "/services/users/1.xml");
//测试常规服务
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath*:META-INF/spring/*.xml");
context.start();
UserService userService = context.getBean(UserService.class);
System.out.println(userService.getUser(1L));
}
private static void getUser(String url) {
System.out.println("Getting user via " + url);
Client client = ClientBuilder.newClient();
WebTarget target = client.target(url);
Response response = target.request().get();
try {
if (response.getStatus() != 200) {
throw new RuntimeException("Failed with HTTP error code : " + response.getStatus());
}
System.out.println("Successfully got result: " + response.readEntity(String.class));
} finally {
response.close();
client.close();
}
}
}
dubbo-hello-consumer.xml
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
7,运行查看结果
首先运行 provider,然后运行 consumer,同时也可以在dubbo的后台管理查看结果
Getting user via http://localhost:8888/services/users/1.json
log4j:WARN No appenders could be found for logger (org.jboss.resteasy.plugins.providers.DocumentProvider).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Successfully got result: {"id":1,"username":"username1"}
Getting user via http://localhost:8888/services/users/1.xml
Successfully got result: 1username1
User (id=1, name='username1')
1. 使用阿里巴巴Druid连接池(高效、功能强大、可扩展性好的数据库连接池、监控数据库访问性能、支持Common-Logging、Log4j和JdkLog,监控数据库访问)
2. 提供高并发JMS消息处理机制
3. 所有功能模块化、所有模块服务化、所有服务原子化的方式,提供可拓展的服务模型,使程序稳定运行,永不宕机
4. 提供Wink Rest、Webservice服务,故可作为独立服务平台部署
框架整合:
Springmvc + Mybatis + Shiro(权限) + REST(服务) + WebService(服务) + JMS(消息) + Lucene(搜搜引擎) + Quartz(定时调度) + Bootstrap Html5(支持PC、IOS、Android)
框架简介:
项目Maven构建,真实大型互联网架构,做到高并发,大数据处理,整个项目使用定制化服务思想,提供模块化、服务化、原子化的方案,将功能模块进行拆分,可以公用到所有的项目中。架构采用分布式部署架构,所有模块进行拆分,使项目做到绝对解耦,稳定压倒一切~~
持续集成:
1. 我的待办工作流服务(提供Webservice服务)
2. 我的待办工作流集成JMS消息服务(支持高并发,可支持成千上万系统集成)
3. 我的任务提供Rest服务,完成日常的工作管理,通过定时调度平台,动态生成我的任务、循环周期任务、定时邮催提醒完成任务等
4. 文件上传、多线程下载服务化、发送邮件、短信服务化、部门信息服务化、产品信息服务化、信息发布服务化、我的订阅服务化、我的任务服务化、公共链接、我的收藏服务化等
系统模块:
1. 用户管理:
用户信息管理(添加、删除、修改、用户授权、用户栏目管理、查询等)
用户组管理(添加、删除、修改、用户组栏目授权,栏目授权、查询、用户组人员添加查询等)
用户角色管理(添加、删除、修改、用户角色授权、用户角色栏目信息查询设置等)
2. 文章管理:
栏目管理:查询无限极栏目树、创建无限极栏目树分类(导航栏目、图片列表栏目、文章列表栏目、文章内容栏目等)、删除、修改栏目信息。
文章管理:创建、删除、修改文章,多维度文章查询,包括已发布、未发布、所有文章等。文章富文本编辑器、文章多文件上传、文章状态控制等。
3. 系统设置:
数据字典管理:支持中、英文信息,支持无限级别分类配置,动态控制是否可用等。
部门信息管理:支持中、英文无限级别部门信息增加,删除,修改操作,部门列表、树心查询等。
日志管理:系统日志列表查询、在线查看、在线下载等
路线管理:集成百度地图API,提供线路查询管理功能
Druid Monitor(监控):集成阿里巴巴连接池,提供在线连接池监控程序,包括:数据源、SQL监控、URL监控、Session监控、Spring监控等
网站信息管理:通过系统配置文件进行网站内容操作,包括邮件服务器配置、公司基本信息配置等。
4.集成REST服务,可以用作独立服务平台(提供大量实例及测试平台,包括:文件上传下载、邮件短信发送、部门、产品、公共连接、我的收藏、我的任务、信息发布等)
5. 集成Quartz调度,可以用作定时调度平台(动态配置调度类、调度时间,使程序自动执行某些业务)
6. Lucene搜索引擎,可以将文件资料索引化,支持文件内容搜索、关键字搜索、高亮关键字等,使信息在毫秒内提取查询出来
7. 用户设置功能:包括修改用户信息,修改密码、发送消息,修改个人图片,查看角色、查看用户组,管理员修改角色、用户、用户组等。
8. 集成Webservice平台,包括jaxws服务、CXF框架,配置双加密的权限认证。使服务集成更加安全。
9. Bootstrap html5提供了两套前台开环境,包括CMS和电子商务网站,使您的开发更加的简洁。
技术点:
1. Springmvc + Mybatis集成、SpringSecurity权限控制、Spring AOP事务处理。
2. Wink Rest服务、Webservice服务:jaxws、CXF等
3. IO 流上传下载文件,多线程操作
4. 发送邮件,配置邮件服务器,发基于html、纯文本格式的邮件
5. MD5加密 (登陆密码校验加密等),用户统一Session、Cookie管理,统一验证码校验等。
6. 数据库连接池统一配置
7. Quartz定时调度任务集成(直接通过配置即可)
8. Httpclient破解验证码,登陆联通充值平台
9. 汉字、英文拆分、可以用作文档关键字搜索等。
10. Base64图片处理,支持PC,Android,IOS
11. Service Socket 、Client Socket 通信技术(已经做过GPRS数据获取,并用到了项目中)
12. 提供大量工具类,可以直接使用
13. Maven项目构建,您可以直接做架构,可以提升自己的学习能力,使您成为真正的架构师。