天天看点

基于dubbo 的分布式框架

1、pom.xml中添加dubbo相关的依赖

<properties>
	        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	        <spring.version>4.2.0.RELEASE</spring.version>
	        <dubbo.version>2.6.1</dubbo.version>
  	     </properties>
           <dependency>
                <groupId>com.github.sgroschupf</groupId>
                <artifactId>zkclient</artifactId>
                <version>0.1</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.slf4j</groupId>
                        <artifactId>slf4j-log4j12</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>log4j</groupId>
                        <artifactId>log4j</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>org.apache.zookeeper</groupId>
                        <artifactId>zookeeper</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>


            <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
            <dependency>
                <groupId>org.apache.curator</groupId>
                <artifactId>curator-framework</artifactId>
                <version>4.0.1</version>
            </dependency>

            <dependency>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
                <version>3.4.6</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.slf4j</groupId>
                        <artifactId>slf4j-log4j12</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>log4j</groupId>
                        <artifactId>log4j</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>

            <!--dubbo-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>dubbo</artifactId>
                <version>${dubbo.version}</version>
                <exclusions>
                    <exclusion>
                        <artifactId>log4j</artifactId>
                        <groupId>log4j</groupId>
                    </exclusion>
                    <exclusion>
                        <artifactId>commons-logging</artifactId>
                        <groupId>commons-logging</groupId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
		        <groupId>org.slf4j</groupId>
		        <artifactId>slf4j-log4j12</artifactId>
		        <version>1.7.12</version>
	        </dependency>
	        <dependency>
		        <groupId>log4j</groupId>
		        <artifactId>log4j</artifactId>
		        <version>1.2.17</version>
	        </dependency>
            <dependency>
		        <groupId>commons-logging</groupId>
		        <artifactId>commons-logging</artifactId>
	   	        <version>1.1.3</version>
	        </dependency>


           

 2、dubbo服务的注册中心zookeeper的安装和启动

下载地址:http://mirrors.cnnic.cn/apache/zookeeper

参考博文:https://blog.csdn.net/tlk20071/article/details/52028945

3、对原有的Maven项目进行重构

重构之后的目录结构如下:

基于dubbo 的分布式框架

大体上可以拆分为API,BOOT,SERVICE,WEB等几个模块

具体为什么要分模块,以及各个模块的具体作用,可以参考博文:

https://crossoverjie.top/2017/03/04/SSM10/

4、对外提供服务

基于SSM-demo的项目来说,

首先第一步:

在SSM-DEMO-API模块中定义一个接口,例如:

package com.bsk.api;

import com.bsk.dto.UserInfoReq;
import com.bsk.dto.UserInfoRsp;


public interface UserInfoApi {

    /**
     * 获取用户信息
     *
     * @param userInfoReq
     * @return
     * @throws Exception
     */
    UserInfoRsp getUserInfo(UserInfoReq userInfoReq) throws Exception;
}
           

第二步:在SSM-DEMO-SERVICE模块中实现该接口

package com.bsk.api.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.bsk.api.UserInfoApi;
import com.bsk.api.dubbo.entity.T_user;
import com.bsk.api.dubbo.service.T_UserService;
import com.bsk.api.dubbo.util.CommonUtil;
import com.bsk.dto.UserInfoReq;
import com.bsk.dto.UserInfoRsp;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;


@Service
public class UserInfoApiImpl implements UserInfoApi {
    private static Logger logger = LoggerFactory.getLogger(UserInfoApiImpl.class);

    @Autowired
    private T_UserService t_userService ;

    /**
     * 获取用户信息
     *
     * @param userInfoReq
     * @return
     * @throws Exception
     */
    @Override
    public UserInfoRsp getUserInfo(UserInfoReq userInfoReq) throws Exception {
        logger.info("用户查询Id="+userInfoReq.getId());

        //返回对象
        UserInfoRsp userInfoRsp = new UserInfoRsp() ;
        T_user t_user = t_userService.selectByPrimaryKey(userInfoReq.getId()) ;

        //构建
        buildUserInfoRsp(userInfoRsp,t_user) ;

        return userInfoRsp;
    }


    /**
     * 构建返回
     * @param userInfoRsp
     * @param t_user
     */
    private void buildUserInfoRsp(UserInfoRsp userInfoRsp, T_user t_user) {
        if (t_user ==  null){
            t_user = new T_user() ;
        }
        CommonUtil.setLogValueModelToModel(t_user,userInfoRsp);
    }
}
           

 其中值得注意的一点是这里使用的

dubbo

框架所提供的

@service

注解。该注解的作用是声明需要暴露的服务接口。

第三步:在项目中添加几个dubbo相关的配置文件

目录结构如下:

基于dubbo 的分布式框架

其中,spring-dubbo-config.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	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">

	<dubbo:application name="ssm-demo-service" owner="bsk"
		organization="ssm-demo-bsk" logger="slf4j"/>

	<dubbo:registry id="dubbo-registry" address="zookeeper://192.168.36.1:2181"
		file="/tmp/dubbo.cachr" />

	<dubbo:monitor protocol="registry" />

	<dubbo:protocol name="dubbo" port="20880" />

	<dubbo:provider timeout="15000" retries="0" delay="-1" />

	<dubbo:consumer check="false" timeout="15000" />

</beans>
           

这是配置我们服务注册的zk地址,端口号,以及服务名称、超时时间等配置信息。

spring-dubbo-consumer.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	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">

    <dubbo:reference id="userInfoApi"
		inter />
</beans>
           

这里是服务消费者配置项,表明我们需要依赖的其他应用。

比如在这依赖注入了com.bsk.api.UserInfoApi这个应用,。

spring-dubbo-provider.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	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">

	<dubbo:annotation package="com.bsk.api.impl" />
</beans>
           

这里是服务提供者配置项,配置dubbo扫描注解包的位置,一般配置到接口实现包即可。

5、安装管理控制台

安装管理控制台后,就可以看到我们有多少服务、调用情况是怎么样等作用。

具体的安装过程,参考博文:

https://blog.csdn.net/noob_hen/article/details/81200143

需要注意一点的是:

需要将其中的

dubbo.properties

的zk地址修改为自己的服务器的IP地址,

如果Tomcat启动的服务比较多的情况下,建议自行修改端口号。

基于dubbo 的分布式框架

我这里修改了端口号为8088

其中我们可以看到有三个服务以及注册上去了,但是有两个没有消费者,还有一个状态正常,表示有消费者对该服务进行了消费。

注意:项目启动顺序,首先启动zookeeper客户端进程,然后启动服务提供者的功能模块,再次启动服务消费者的功能模块,最后启动dubbo-admin管理控制台程序对我们所发布的服务进行管理。

参考博文:https://crossoverjie.top/2017/04/07/SSM11/