最近项目使用了dubbo进行服务治理,搭建了一套基于注解方式的dubbo+spring mvc的框架,注册中心使用zookeeper。
关于dubbo的介绍就不多说了,网上有很多可以自行搜索,直接上代码。
项目使用的maven,采用多模块方式。先看一下示例项目框架。
其中dubbo-config模块管理所有项目所需的配置文件,在打包时打入对应的服务内。
一、项目包依赖 pom.xml
4.0.0
com.sanjinbest.dubbo
sanjinbest.dubbo
pom
1.0-SNAPSHOT
user-service
dubbo-web
dubbo-config
UTF-8
3.0.1
4.3.7.RELEASE
4.12
0.2
2.5.4
com.alibaba
dubbo
${dubbo.version}
org.springframework
spring
com.101tec
zkclient
${zookeeper.version}
javax.servlet
javax.servlet-api
${servlet.version}
junit
junit
${junit.version}
test
org.hamcrest
hamcrest-core
1.3
org.springframework
spring-core
${springframework.version}
org.springframework
spring-context
${springframework.version}
org.springframework
spring-web
${springframework.version}
org.springframework
spring-beans
${springframework.version}
org.springframework
spring-aop
${springframework.version}
org.springframework
spring-expression
${springframework.version}
org.springframework
spring-aspects
${springframework.version}
org.springframework
spring-context-support
${springframework.version}
org.springframework
spring-tx
${springframework.version}
org.springframework
spring-webmvc
${springframework.version}
org.springframework
spring-test
${springframework.version}
org.springframework.mobile
spring-mobile-device
${spring.mobile.version}
org.springframework
spring-jdbc
${springframework.version}
二、dubbo服务端
1、服务端配置
这里使用的注册中心是zookeeper。
2、服务端applicationContext.xml
classpath*:dubbo.properties
3、服务接口类
package com.sanjinbest.dubbo.user.api;
/**
*
*
* @author lixin
* @create 2017/11/3
*/
public interface IUserInfoService {
String getName();
int getAge();
}
这里提供了一个返回name 和 age的方法。当发布服务给第三方的时候,只需要将该接口打成jar包发布即可。
4、接口实现类
package com.sanjinbest.dubbo.user.provider;
import com.sanjinbest.dubbo.user.api.IUserInfoService;
/**
*
*
* @author lixin
* @create 2017/11/3
*/
@com.alibaba.dubbo.config.annotation.Service
@org.springframework.stereotype.Service
public class UserInfoServiceProvider implements IUserInfoService{
@Override
public String getName() {
return "sanjinbest";
}
@Override
public int getAge() {
return 29;
}
}
这里有一个需要注意的地方,该实现类内使用了2个service注解:
@com.alibaba.dubbo.config.annotation.Service dubbo服务对外暴露服务
@org.springframework.stereotype.Service spring容器注入
5、dubbo本地测试启动
package mock;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.IOException;
/**
*
*
* @author lixin
* @create 2017/9/18
*/
public class UserProviderMock {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"classpath*:spring/applicationContext.xml"});
System.out.println("user provider start...");
context.start();
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
}
如果是线上使用,可以使用运行jar包的方式运行,下面是打jar包的配置:
user-provider
org.apache.maven.plugins
maven-jar-plugin
3.0.2
${project.build.directory}/classes/
com.alibaba.dubbo.container.Main
false
true
lib/
.
org.apache.maven.plugins
maven-dependency-plugin
copy-dependencies
package
copy-dependencies
jar
jar
${project.build.directory}/lib
false
true
true
true
false
../../dubbo-config/config/
${project.build.directory}/classes
src/main/resources
true
**/*.xml
**/*.properties
${project.build.directory}/classes/META-INF/spring
src/main/resources/spring
true
applicationContext.xml
最后看一下dubbo的配置参数:
#服务注册中心(如果注册中心为集群,这里需要使用“,”分隔)
dubbo.user.registry.server=127.0.0.1:2181
#服务暴露端口
dubbo.user.protocol.port=20080
#请求超时时间
dubbo.user.timeout=3000
#请求失败重试次数
dubbo.user.retries=0
#客户端(如果订阅的服务为集群,这里需要使用“,”分隔)
dubbo.user.client=127.0.0.1:2181
到此,一个简单的dubbo服务就搭建好了,我们启动一下看看。
直接运行类UserProviderMock.java
如果看到"user provider start..."就证明启动成功了!
下面我们来看一下dubbo的客户端。
三、dubbo客户端
1、dubbo客户端配置
然后将其import进入applicationContext.xml即可。
先跑一下单元测试。
2、单元测试
package com.sanjinbest.dubbo.mock;
import com.alibaba.dubbo.config.annotation.Reference;
import com.sanjinbest.dubbo.user.api.IUserInfoService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
*
*
* @author lixin
* @create 2017/9/18
*/
@RunWith(SpringJUnit4ClassRunner.class) //使用junit4进行测试
@ContextConfiguration(locations={"classpath*:spring/applicationContext.xml"}) //加载配置文件
public class MockDubbo {
@Reference
private IUserInfoService iUserInfoService;
@Test
public void test(){
System.out.println("Hello : " + iUserInfoService.getName());
System.out.println("age : " + iUserInfoService.getAge());
}
}
3、与spring mvc结合
完成了单元测试,在尝试与spring mvc进行结合使用。与spring mvc的结合用其实非常简单,spring mvc的配置不变,只需要将spring-mvc与dubbo配置都交给applictionContext.xml进行管理就好。
spring-mvc.xml
applictionContext.xml
classpath*:dubbo.properties
web.xml
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
true
encoding
UTF-8
encodingFilter
/*
SpringMVC
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath*:spring/applicationContext.xml
1
true
SpringMVC
/
Archetype Created Web Application
在看一下测试的controller和service
package com.sanjinbest.dubbo.controller;
import com.sanjinbest.dubbo.service.IndexService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
/**
*
*
* @author lixin
* @create 2017/11/6
*/
@Controller
public class IndexController{
@Autowired
private IndexService indexService;
@RequestMapping(value="/user",method = RequestMethod.GET)
@ResponseBody
public String user(){
return indexService.userInfo();
}
}
controller的写法没有特殊变化,主要看一下service的。
package com.sanjinbest.dubbo.service;
import com.alibaba.dubbo.config.annotation.Reference;
import com.sanjinbest.dubbo.user.api.IUserInfoService;
import org.springframework.stereotype.Service;
/**
*
*
* @author lixin
* @create 2017/11/6
*/
@Service
public class IndexService {
@Reference
private IUserInfoService iUserInfoService;
public String userInfo(){
return iUserInfoService.getName() + "," + iUserInfoService.getAge();
}
}
service这里注入dubbo接口,需要使用注解@Reference
启动后看一下测试结果:
最后,我们看一下dubbo-admin后台。
dubbo-admin.war可以在dubbo的官网上下载,下载后放到tomcat webapps内,解压war包,修改配置文件webapps/dubbo-admin/WEB-INF/dubbo.properties
设置dubbo.registry.address参数,我使用的是本地的zookeeper。
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
启动tomcat,然后请求地址http://127.0.0.1:8080/dubbo-admin/
用户名和密码都是root。
dubbo-admin的功能有很多,就不作详细说明了,到此一个使用dubbo服务的spring mvc示例就介绍结束。
本文只对dubbo的搭建作一个初步的介绍,后续会有一些dubbo的线上使用介绍。
示例项目下载地址 : https://pan.baidu.com/s/1nvj3XpB 密码: 46vr
写的比较粗糙,可能会存在一些错误。欢迎大家反馈交流。