使用dubbo搭建分布式项目

dubbo概述

Dubbo 是一个分布式服务框架,阿里巴巴开源项目,被国内电商及互联网项目中使用。

Dubbo 致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,Dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有Dubbo这样的分布式服务框架的需求,并且本质上是服务调用,是一个远程服务调用的分布式框架。
在这里插入图片描述
节点角色说明:
• Provider: 暴露服务的服务提供方。
• Consumer: 调用远程服务的服务消费方。
• Registry: 服务注册与发现的注册中心。
• Monitor: 统计服务的调用次调和调用时间的监控中心。
• Container: 服务运行容器。
调用关系说明:
• 0. 服务容器负责启动,加载,运行服务提供者。
• 1. 服务提供者在启动时,向注册中心注册自己提供的服务。
• 2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
• 3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推
送变更数据给消费者。
• 4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,
如果调用失败,再选另一台调用。
• 5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计
数据到监控中心。
Zookeeper 介绍
官方推荐使用 zookeeper 注册中心。注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。
Zookeeper 是 Apacahe Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为Dubbo 服务的注册中心,工业强度较高,可用于生产环境。

idea搭建项目流程

在这里插入图片描述
创建如上图所示的项目结构目录,其中record_manager_web和record_service为web项目,父工程为pom工程,其他项目默认为jar工程

在父工程的pom文件中添加依赖信息和版本号

数据访问模块(record_dao)的依赖
对于自己创建的项目只依赖pojo

通用实体类模块(pojo)不需要依赖信息

服务接口模块仅需要依赖pojo

服务模块需要依赖自己的有common、dao和interface其中pojo已经被dao依赖,所以不需要重复依赖

manager_web模块需要依赖自己项目的common和interface,服务(service)通过远程调用实现注入

common项目只需要依赖本项目所需的依赖

详细依赖信息见详细依赖

配置dubbo远程调用相关

在类上加注解都是基于dubbo的注解
dao项目的配置

在这里插入图片描述
db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/youlexuandb?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root

log4j.properties配置

# global level
log4j.rootLogger = error,stdout

#MyBatis logging configuration
# self package level
log4j.logger.com.offcn=debug


log4j.appender.stdout = org.apache.log4j.ConsoleAppender
# standard ouput for black, System.err is red
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern =%d{HH\:mm\:ss} %5p %c - %m%n

my-batis.xml配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

	<settings>
	   	<setting name="logImpl" value="LOG4J"/>
	</settings>

	<plugins>
		<plugin interceptor="com.github.pagehelper.PageInterceptor">
			<!-- 设置数据库方言类型:oracle, mysql -->
			<property name="helperDialect" value="mysql"/>
		</plugin>
	</plugins>
	
</configuration>

spring-dao.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:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
    		http://www.springframework.org/schema/beans/spring-beans.xsd 
    		http://www.springframework.org/schema/context 
    		http://www.springframework.org/schema/context/spring-context.xsd">

	<!-- 加载配置文件 -->
	<context:property-placeholder location="classpath:db.properties" />

	<!-- 数据库连接池 -->
	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
		destroy-method="close">
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<property name="driverClassName" value="${jdbc.driver}" />
		<property name="maxActive" value="10" />
		<property name="minIdle" value="5" />
	</bean>

	<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="configLocation" value="classpath:mybatis-cfg.xml" />
		<property name="mapperLocations" value="classpath:com/weilinyang/mapper/*Mapper.xml" />
	</bean>

	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="com.weilinyang.mapper" />
	</bean>

</beans>

service服务项目的配置
在这里插入图片描述
web.xml配置:在classpath要加*
在这里插入图片描述
classpath后边的*表示将本项目中依赖项目的以spring-开头的xml文件进行加载,如service依赖了dao,就会把dao项目中的spring-dao.xml加载进去
spring-service-application.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:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!--扫描包-->
    <context:component-scan base-package="com.weilinyang"/>
    <!--配置事务-->
    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <tx:advice id="crudAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="get*" read-only="true" />
            <tx:method name="select*" read-only="true" />
            <tx:method name="list*" read-only="true" />
            <tx:method name="query*" read-only="true" />
            <tx:method name="find*" read-only="true" />
            <tx:method name="*" propagation="REQUIRED" />
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <aop:pointcut expression="execution(* com.weilinyang.service..*.*(..))"
                      id="pointcut" />
        <aop:advisor advice-ref="crudAdvice" pointcut-ref="pointcut" />
    </aop:config>

</beans>

spring-service-dubbo.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.xsd
    		http://code.alibabatech.com/schema/dubbo
    		http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

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

    <!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="record_service" />

    <!-- 向zk注册服务 -->
    <dubbo:registry address="zookeeper://192.168.2.123:2181" />

    <!-- 扫描带service注解的类 -->
    <dubbo:annotation package="com.weilinyang.service.impl" />

</beans>

manager_web服务项目的配置
manager_web项目是web服务,主要对外访问不涉及业务实现,不用配置application.xml,仅需配置spring-mvc.xml
在这里插入图片描述

web.xml的配置:classpath后不加*,web项目不依赖本地服务,是通过dubbo远程调用

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		 xmlns="http://xmlns.jcp.org/xml/ns/javaee"
		 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
		 id="WebApp_ID" version="3.1">

	<!-- 避免spring查找WEB-INF/applicationContext.xml -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:spring-*.xml</param-value><!--classpath后不加*,web项目不依赖本地服务,是通过dubbo远程调用-->
	</context-param>

	<!-- springMVC拦截 -->
	<servlet>
		<servlet-name>spMVC</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring-mvc.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>spMVC</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

	<!-- springMVC编码过滤 -->
	<filter>
		<filter-name>charset</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>utf-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>charset</filter-name>
		<url-pattern>*.do</url-pattern>
	</filter-mapping>

</web-app>

spring-dubbo.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.xsd
    		http://code.alibabatech.com/schema/dubbo
    		http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

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

    <!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="record_manager_web" />

    <!-- 向zk注册服务 -->
    <dubbo:registry address="zookeeper://192.168.2.123:2181" />

    <!-- 扫描带controller注解的类 -->
    <dubbo:annotation package="com.weilinyang.manager.controller" />

</beans>

spring-mvc.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:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    		http://www.springframework.org/schema/beans/spring-beans.xsd
    		http://www.springframework.org/schema/context
    		http://www.springframework.org/schema/context/spring-context.xsd
    		http://www.springframework.org/schema/mvc
    		http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 注解包扫描 -->
    <context:component-scan base-package="com.weilinyang" />

    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <bean
                    class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes" value="application/json" />
                <property name="features">
                    <array>
                        <value>WriteMapNullValue</value>
                        <value>WriteDateUseDateFormat</value>
                    </array>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

    <!-- 静态资源处理 -->
    <mvc:default-servlet-handler />


</beans>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值