前瞻java Dubbo搭建

Codesys—Modbus RTU称重变送器通讯案例 Codesys控制器使用标准的Modbus库,与支持ModbusRTU的称重变送器进行通讯的案例 阅读详情

1. 简介

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC(Remote Procedure Cal远程过程调用)远程服务调用方案。

 2. 架构


Provider: 暴露服务的服务提供方。

Consumer: 调用远程服务的服务消费方。

Registry: 服务注册与发现的注册中心。 

Monitor: 统计服务的调用次调和调用时间的监控中心。 

Container: 服务运行容器。

 关于Dubbo的详细介绍请参考http://dubbo.io/

3. 用Eclipse搭建Dubbo项目(使用Maven进行项目管理)
Dubbo项目一般分为两个部分,一个是service-api,一个是service.其中api为暴露在外的Dubbo服务接口,为提供者和消费者所公用。而Dubbo服务则部署在服务器上不对外公开。
作为Dubbo消费者(调用方)只需要知道有哪些接口、接口需要的参数以及接口能做的事情,而具体怎么实现交给dubbo服务来实现,dubbo服务作为提供者provider 在注册中心注册。
3.1. 搭建Dubbo Api
3.1.1. 搭建Maven项目
File- new – others 或者使用快捷键ctrl+n
下一步
选择 maven-archetype-quickstart,下一步
输入GAV,这三项为一个项目区别其它项目的“指纹”,
点击完成
Grop Id- 项目组名称,大项目名称
Atifact Id- 子项目名
Version –版本号
这个时候一个简单的maven项目搭建完成,打开POM文件可以看到刚才输入的GAV,如下
<groupId>com.mldn</groupId>
<artifactId>mldn-user-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
如果其他项目需要调用本项目的api 则需要在其POM文件中添加以上的依赖即可。
3.1.2. 增加maven 编译插件
在项目开发中,时常会需要执行更新maven的操作,如果不固定编译的JDK版本,所依赖的JRE系统包会变回默认版本,所以在POM中加入以下内容
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source><!-- 源码JDK版本 -->
<target>1.8</target><!-- 生成class的编译版本 -->
<encoding>utf-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
3.1.3. 增加maven 打包发布插件
一般团队开发都要使用到maven私服,用来统一管理jar包,需要将Dubbo api 发布jar包到私服 或者install到本地仓库使用,打包插件配置如下:  执行 mvn install,maven会自动将source install到repository 。  执行 mvn deploy,maven会自动将source deploy到remote-repository 。  执行 mvn source:jar,单独打包源码
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source><!-- 源码JDK版本 -->
<target>1.8</target><!-- 生成class的编译版本 -->
<encoding>utf-8</encoding>
</configuration>
</plugin> <plugin><!-- 打包插件 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
3.1.4. 编写Dubbo接口
在base package(com.mldn)下新建api包
在api包中新建api接口
代码示例
package com.mldn.api;
publicinterface userApi {
publicboolean Insert();
}
此时 Dubbo api部分搭建完成,下面搭建Dubbo服务项目
3.2. 搭建Dubbo Service
3.2.1. 搭建Maven项目
步骤跟api搭建一样, 不同的是GAV
http://dubbo.io/. 新建assembly ,用于项目打包
在main目录下新建assembly 文件夹,并将maven打包插件配置文件拷进文件夹
文件来源:http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html
3.2.3. 新建bin,用于linux上执行脚本
在main目录下新建bin文件夹,来源:mave jar包:
3.2.4. 建立profliles,用于定义不同环境的DB和Dubbo连接
在main目录下新建profiles 文件夹,在profiles 下新建 dev, beta-gn, product 三个profile 存放三 个不同环境的配置文件,dev 用于开发环境,beta-gn用于测试环境,product用于生产环境(线 上环境),存放的配置文件有:主要有三个 数据库配置文件、Dubbo配置文件、日志文件。
在每个profile下放入logback.xml 日志文件,然后在每个profile下新建conf放入 数据库配置 db.properties和dubbo配置文件dubbo.properties。profiles配置完成
3.2.5. 数据库连接配置(db.properties)详解:
数据库连接池使用alibaba的druid 连接池,配置详解如下:
#################alibabadruiddatasource###############
# 数据库连接驱动
driver=com.mysql.jdbc.Driver
# 数据库连接url
account.url=jdbc:mysql://127.0.01:3306/demo?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
# 数据库账户名
account.username = root
# 数据库密码
account.password = mysqladmin
# 初始化连接数量
druid.initialSize = 5
# 最大并发连接数
druid.maxActive = 10
# 最小空闲连接数
druid.minIdle = 3
# 配置获取连接等待超时的时间
druid.maxWait = 60000
# 超过时间限制是否回收
druid.removeAbandoned = true
# 超过时间限制多长
druid.removeAbandonedTimeout = 180
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
druid.timeBetweenEvictionRunsMillis = 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
druid.minEvictableIdleTimeMillis = 300000
# 用来检测连接是否有效的sql,要求是一个查询语句
druid.validationQuery = SELECT1FROMDUAL
# 申请连接的时候检测
druid.testWhileIdle = true
# 申请连接时执行validationQuery检测连接是否有效,配置为true会降低性能
druid.testOnBorrow = false
# 归还连接时执行validationQuery检测连接是否有效,配置为true会降低性能
druid.testOnReturn = false
# 打开PSCache,并且指定每个连接上PSCache的大小
druid.poolPreparedStatements = true
druid.maxPoolPreparedStatementPerConnectionSize = 50
# 监控统计用的filter:stat
druid.filters = stat
此配置会在以下XML中引用
src/main/resources/META-INF/spring/spring-datasource.xmlspring-datasource.xml
3.2.6. Dubbo配置文件(dubbo.properties)详解
# 当前应用名称,用于注册中心计算应用间依赖关系,注意:消费者和提供者应用名不要一样,此参数不是匹配条件,你当前项目叫什么名字就填什么,和提供者消费者角色无关
dubbo.application.name=mldn-user-service
# 远程服务调用超时时间(毫秒)
dubbo.provider.timeout=10000000
# 注册中心配置 使用multicast广播注册中心暴露服务地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#用dubbo协议在9327端口暴露服务
dubbo.protocol.port=9327
# 服务版本
dubbo.iterface.version=dev
# dubbo会默认会在本地缓存注册中心的信息文件,默认路径在//home/[user]/.dubbo/dubbo-registry-192.168.1.109.cache
dubbo.registry.file=/data/www/log/dubbo/dubbo-registry.properties
# 监控中心服务地址
dubbo.monitor.address=127.0.0.1:6066
此配置会在以下XML中引用
src/main/resources/META-INF/spring/provider.xml
3.2.7. 新建resources 目录, 配置XML
在main目录下新建resources 文件夹,在resources文件夹内新建MATE-INF文件夹,然后再MATE-INF下新建mybatis 和 spring 两个文件夹。分别用来存放mybatis和spring配置文件。其中mybatis 下复制进去准备好的mybatis 配置mybatis-config.xml。在spring文件下复制进以下三个文件:
provider.xml(Dubbo提供者配置文件)
spring-common.xml(spring配置文件)
spring-datasource.xml(数据源配置文件)
这三个文件的变量位于profiles下的properties文件
最后在mybatis文件夹下新建map文件夹,用来存放mybatis mapper文件,XML配置完成,结构如下
这样布局的原因是: Dubbo 在运行的时候会自动加载META-INF/spring目录下的所有Spring配置。
配置详解:
mybatis-config.xml mybatis配置 <configuration>
<settings>
<!-- 这个配置使全局的映射器启用或禁用缓存。默认true -->
<settingname="cacheEnabled"value="true"/>
<!-- 全局启用或禁用延迟加载。默认true,为true的会使用cglib作代理 -->
<settingname="lazyLoadingEnabled"value="false"/>
<!-- 允许或不允许多种结果集从一个单独的语句中返回。默认true -->
<settingname="multipleResultSetsEnabled"value="true"/>
<!-- 启用自动映射到骆驼标识 -->
<settingname="mapUnderscoreToCamelCase"value="true"/>
<!-- 使用列标签代替列名。默认true -->
<settingname="useColumnLabel"value="true"/>
<!-- 允许JDBC支持生成的键。需要适合的驱动。默认false -->
<settingname="useGeneratedKeys"value="false"/>
<!-- 。REUSE执行器重用预处理语句。BATCH执行器重用语句和批量更新 。默认SIMPLE -->
<settingname="defaultExecutorType"value="SIMPLE"/>
<!-- 设置超时时间,它决定驱动等待一个数据库响应的时间。 -->
<settingname="defaultStatementTimeout"value="25000"/>
</settings>
</configuration>
spring-common.xml spring 配置入口
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:util="http://www.springframework.org/schema/util"
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/util
http://www.springframework.org/schema/util/spring-util-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 开启注解 -->
<context:annotation-config/>
<context:component-scanbase-package="com.mldn"/>
<!-- 声明资源文件存放位置 -->
<context:property-placeholderlocation="classpath:conf/*.properties"/>
</beans>
provider.xml Dubbo提供者配置
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<dubbo:applicationname="${dubbo.application.name}"/><!--当前应用名称, -->
<!--注册中心配置 使用multicast广播注册中心暴露服务地址 -->
<dubbo:registryprotocol="zookeeper"address="${dubbo.registry.address}"/>
<!--用dubbo协议在xxx端口暴露服务 -->
<dubbo:protocolname="dubbo"port="${dubbo.protocol.port}"/>
<!--远程服务调用超时时间(毫秒) -->
<dubbo:providertimeout="${dubbo.provider.timeout}"/>
<!--监控中心 -->
<dubbo:monitoraddress="${dubbo.monitor.address}"/>
<!-- 声明需要暴露的服务接口 -->
<dubbo:serviceinterface="com.mldn.api.UserApi"ref="userApi"version="${dubbo.iterface.version}"/>
</beans>
spring-datasource.xml 数据源配置
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- dataSource -->
<!-- 配置数据源 Druid -->
<beanname="dataSource"id="dataSource"class="com.alibaba.druid.pool.DruidDataSource"
init-method="init"destroy-method="close">
<propertyname="driverClassName"value="${driver}"/>
<propertyname="url"value="${account.url}"/>
<propertyname="username"value="${account.username}"/>
<propertyname="password"value="${account.password}"/>
<!-- 初始化连接数量 -->
<propertyname="initialSize"value="${druid.initialSize}"/>
<!-- 最大并发连接数 -->
<propertyname="maxActive"value="${druid.maxActive}"/>
<!-- 最小空闲连接数 -->
<propertyname="minIdle"value="${druid.minIdle}"/>
<!-- 配置获取连接等待超时的时间 -->
<propertyname="maxWait"value="${druid.maxWait}"/>
<!-- 超过时间限制是否回收 -->
<propertyname="removeAbandoned"value="${druid.removeAbandoned}"/>
<!-- 超过时间限制多长; -->
<propertyname="removeAbandonedTimeout"value="${druid.removeAbandonedTimeout}"/>
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<propertyname="timeBetweenEvictionRunsMillis"value="${druid.timeBetweenEvictionRunsMillis}"/>
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<propertyname="minEvictableIdleTimeMillis"value="${druid.minEvictableIdleTimeMillis}"/>
<!-- 用来检测连接是否有效的sql,要求是一个查询语句 -->
<propertyname="validationQuery"value="${druid.validationQuery}"/>
<!-- 申请连接的时候检测 -->
<propertyname="testWhileIdle"value="${druid.testWhileIdle}"/>
<!-- 申请连接时执行validationQuery检测连接是否有效,配置为true会降低性能 -->
<propertyname="testOnBorrow"value="${druid.testOnBorrow}"/>
<!-- 归还连接时执行validationQuery检测连接是否有效,配置为true会降低性能 -->
<propertyname="testOnReturn"value="${druid.testOnReturn}"/>
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
<propertyname="poolPreparedStatements"value="${druid.poolPreparedStatements}"/>
<propertyname="maxPoolPreparedStatementPerConnectionSize"value="${druid.maxPoolPreparedStatementPerConnectionSize}"/>
<!-- 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:
监控统计用的filter:stat
日志用的filter:log4j
防御SQL注入的filter:wall -->
<propertyname="filters"value="${druid.filters}"/>
<propertyname="proxyFilters">
<list>
<refbean="log-filter"/>
</list>
</property>
</bean>
<beanid="log-filter"class="com.alibaba.druid.filter.logging.Log4jFilter">
<propertyname="statementExecutableSqlLogEnable"value="true"/>
<propertyname="statementExecuteAfterLogEnabled"value="false"/>
<propertyname="statementCreateAfterLogEnabled"value="false"/>
<propertyname="statementPrepareAfterLogEnabled"value="false"/>
<propertyname="statementPrepareCallAfterLogEnabled"value="false"/>
<propertyname="statementParameterClearLogEnable"value="false"/>
<propertyname="statementParameterSetLogEnabled"value="false"/>
</bean>
<!-- dataSource -->
<!-- mybatis -->
<beanid="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean">
<propertyname="dataSource"ref="dataSource"/>
<propertyname="configLocation"
value="classpath:META-INF/mybatis/mybatis-config.xml"/>
<propertyname="mapperLocations">
<list>
<value>classpath:META-INF/mybatis/mapper/*.xml</value>
<value>classpath:META-INF/mybatis/ReuseSQL.xml</value>
</list>
</property>
</bean>
<!-- 配置Mybatis模版 -->
<beanid="orderSqlSessionTemplate"class="org.mybatis.spring.SqlSessionTemplate">
<constructor-argindex="0"ref="sqlSessionFactory"/>
</bean>
<!--集成 spring jdbc template -->
<!-- <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource"ref="dataSource"></property>
</bean> -->
<beanid="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<propertyname="dataSource"ref="dataSource"/>
</bean>
<tx:adviceid="txAdvice"transaction-manager="txManager">
<tx:attributes>
<tx:methodname="insert*"propagation="REQUIRED"isolation="READ_COMMITTED"/>
<tx:methodname="save*"propagation="REQUIRED"isolation="READ_COMMITTED"/>
<tx:methodname="update*"propagation="REQUIRED"isolation="READ_COMMITTED"/>
<tx:methodname="exec*"propagation="REQUIRED"isolation="READ_COMMITTED"/>
<tx:methodname="delete*"propagation="REQUIRED"isolation="READ_COMMITTED"/>
<tx:methodname="remove*"propagation="REQUIRED"isolation="READ_COMMITTED"/>
<tx:methodname="add*"propagation="REQUIRED"isolation="READ_COMMITTED"/>
<tx:methodname="minus*"propagation="REQUIRED"isolation="READ_COMMITTED"/>
<tx:methodname="find*"propagation="REQUIRED"isolation="READ_COMMITTED"
read-only="true"/>
<tx:methodname="get*"propagation="REQUIRED"isolation="READ_COMMITTED"
read-only="true"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcutid="txPointcut"
expression="execution(* com.mldn.service..*.*(..))"/>
<aop:advisorpointcut-ref="txPointcut"advice-ref="txAdvice"/>
</aop:config>
<tx:annotation-driventransaction-manager="txManager"/>
</beans>
3.2.8. POM 配置:
这里要引入Dubbo api的依赖以及其他依赖包,并配置maven插件
<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mldn</groupId>
<artifactId>mldn-user-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mldn-user-service</name>
<url>http://maven.apache.org</url>
<properties>
<project.artifactId>cloud-live-service</project.artifactId><!-- 项目名 -->
<profiles.dir>src/main/profiles</profiles.dir><!--profie根目录 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!-- 构建编码 -->
<druid.version>1.0.0</druid.version>
<dubbo-version>2.4.10</dubbo-version>
<zookeeper-version>3.4.5</zookeeper-version>
<zkclient.version>0.4</zkclient.version>
<mybatis-version>3.2.8</mybatis-version>
<mybatis-spring-version>1.2.1</mybatis-spring-version>
<mysql-version>5.1.29</mysql-version>
<logback-version>1.1.3</logback-version>
<org.slf4j-version>1.7.5</org.slf4j-version>
<commons-beanutils-version>1.9.1</commons-beanutils-version>
<commons-lang3-version>3.1</commons-lang3-version>
<net.sf.json-version>2.3</net.sf.json-version>
<spring-version>4.0.4.RELEASE</spring-version>
<aspectj-version>1.7.0</aspectj-version>
</properties>
<dependencies>
<!—api依赖引入 -->
<dependency>
<groupId>com.mldn</groupId>
<artifactId>mldn-user-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!--Druid连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!--dubbo依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo-version}</version>
<exclusions>
<exclusion>
<artifactId>spring</artifactId><!-- 移除依赖,有版本冲突 -->
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<!--zookeeper依赖 s-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zookeeper-version}</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<!-- <exclusion>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
</exclusion> -->
</exclusions>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>${zkclient.version}</version>
<exclusions>
<exclusion>
<artifactId>log4j</artifactId>
<groupId>log4j</groupId>
</exclusion>
<exclusion>
<artifactId>zookeeper</artifactId>
<groupId>org.apache.zookeeper</groupId>
</exclusion>
</exclusions>
</dependency>
<!--zookeeper依赖 e-->
<!-- mybatis 依赖 s -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis-version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring-version}</version><!--MyBatis-Spring integrates MyBatis
seamlessly with Spring -->
</dependency>
<!-- mybatis 依赖 e -->
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-version}</version>
</dependency>
<!--日志 s -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>${org.slf4j-version}</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j-version}</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback-version}</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback-version}</version>
</dependency>
<!--日志 e -->
<!--工具类依赖 s-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3-version}</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>${commons-beanutils-version}</version>
<exclusions>
<exclusion>
<artifactId>commons-logging</artifactId>
<groupId>commons-logging</groupId>
</exclusion>
</exclusions>
</dependency>
<!--工具类依赖 e-->
<!--JSON -->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>${net.sf.json-version}</version>
<classifier>jdk15</classifier>
<scope>compile</scope>
</dependency>
<!--集成Spring 和 spring JDBC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring-version}</version>
</dependency>
<!-- Spring AOP所要用到的包 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj-version}</version>
</dependency>
</dependencies>
<profiles>
<profile>
<id>dev</id>
<properties>
<profile.dir>${profiles.dir}/dev</profile.dir>
</properties>
<activation>
<activeByDefault>true</activeByDefault><!-- 默认激活 -->
</activation>
</profile>
<profile>
<id>beta-gn</id>
<properties>
<profile.dir>${profiles.dir}/beta-gn</profile.dir>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>product</id>
<properties>
<profile.dir>${profiles.dir}/product</profile.dir>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
</profiles>
<build>
<finalName>${project.artifactId}</finalName>
<defaultGoal>package</defaultGoal><!-- 预定义执行的目标或者阶段,必须和命令行的参数相同 -->
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
<resource>
<directory>${profile.dir}</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptor>src/main/assembly/assembly.xml</descriptor><!--描述文件路径 -->
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase><!-- 绑定到package生命周期阶段上 -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<encoding>utf-8</encoding>
<excludes>
<exclude>conf/</exclude>
<exclude>META-INF/</exclude>
<exclude>logback.xml</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
3.2.9. 实现api服务
这块跟平时service曾的实现接口并进行逻辑处理基本相同。
3.3. 编写本地测试程序
Dubbo服务在开发的过程中需要本地调试,因此在maven生成的test下编写本地启动程序:
在test下的com.mldn目录下新建ProviderStartup类
package com.mldn;
import com.alibaba.dubbo.container.Main;
publicclass ProviderStartup {
publicstaticvoid main(String[] args) {
Main.main(args);
}
}
3.4. 配置build path
项目要想正常本地启动,需要配置相应的build path,步骤如下:
右击项目 Build Path Configure Build Path
点击add Folder
勾选resources 和profiles下的dev
完整的source列表是:
3.5. 配本地启动Dubbo服务
首先在本地启动zookeeper 或者服务器上启动。
然后右击ProviderStartup类,Run as Java Application,看到以下日志输出,Dubbo项目启动成功。
16-09-23.00:53:36.910 [main ] INFO Main - [DUBBO] Dubbo SpringContainer started!, dubbo version: 2.4.10, current host: 127.0.0.1
[2016-09-23 00:53:36] Dubbo service server started!
深入解析:如何基于开源OpENer开发EtherNet/IP从站服务 通过OpENer开源库,开发者可以快速实现符合ODVA规范的EtherNet/IP从站设备,降低开发成本并提高系统灵活性。本文详细介绍了EtherNet/IP协议原理、OpENer库的特点与优缺点,以及二次开发的完整流程。通过遵循本文提供的指南,开发者可以成功构建出工业级的EtherNet/IP通信设备。 阅读详情

相关推荐

【信息安全】seed-labs实验-Firewall Exploration Lab

本实验主要就是基于LKM和Netfilter实现简单的防火墙,重点是后者。路由器是有两个ip的,一个是外网ip,一个是内网ip每一次做完实验,都要做好收尾工作(比如:模块装入之后,要记得移除;iptables命令设置完规则之后,要把对应规则删掉)

可乐大牛的博客 5995

spring-boot系列6:事务的配置方法

关于事务的意思我就不说了,百度一大堆。 我所最简单的理解就是你所操作的要么全都执行,要么都不执行。 在以前开发SSM(或者SSH)框架项目的时候,事务的配置都习惯性的用XML配置。 <!-- (事务管理)transaction manager--> <bean id="transactionManager" class="org.springframework...

我不起名字 546

TSEND_C指令错误代码解析与实战排错指南

本文详细解析西门子PLC中TSEND_C指令的常见错误代码,包括连接建立、参数配置、资源限制和网络通信等错误类型。针对错误代码80C4等典型问题提供实战排错指南,帮助工程师快速诊断和解决工业通信中的连接故障,提升系统可靠性。

backprop5master的博客 413

java 搭建dubbo项目_使用spring boot快速搭建一个dubbo的服务端项目

dubbo是国内JAVA开源框架中,一款比较有名的服务化框架,我们在SOA架构的时候,一般会使用dubbo作为基础构建,先看下dubbo框架的基本架构图:image.pngprovider就是服务的提供方,接下来,我们将使用lion项目来实现一个基于dubbo的服务端。1 引入dubbo的依赖项目中引入依赖,我们一般会在父级项目中做一个声明,也就是在dependencyManagement元素中加...

weixin_31209173的博客 392

OmniQuant:全方位校准实现大语言模型高效量化与移动端部署

模型量化是一种通过降低模型权重和激活值的数值精度来压缩模型大小、减少内存占用和计算开销的核心技术。其原理在于将高精度浮点数映射到低精度整数表示,从而在保持模型性能的同时,显著提升存储和计算效率。这项技术的价值在于,它使得大规模语言模型能够在消费级硬件和资源受限的移动设备上运行,极大地拓宽了AI应用场景。OmniQuant作为一项前沿的量化技术,通过引入可学习权重裁剪和可学习等价变换机制,实现了对权重分布不均匀和激活值异常值问题的协同优化,从而在极低的比特数下仍能保持优异的模型性能。本文深入探讨了OmniQu

weixin_30719711的博客 484

告别 RPA 和 Selenium,MCP + Playwright 成为自动化开发新宠!

摘要: 随着数字化转型加速,传统自动化工具(如RPA和Selenium)在复杂场景中暴露出开发成本高、灵活性不足等问题。新一代解决方案MCP(Model Context Protocol)与Playwright的结合,通过AI与自动化的无缝对接,实现了智能化的任务处理。MCP支持自然语言交互和上下文感知,开发者无需编写复杂代码即可生成自动化脚本;Playwright则提供多浏览器支持、高性能和易用性。二者结合显著提升开发效率,使自动化更智能、灵活。文章还对比了VS Code与Trae中配置Playwrigh

我先测了 2208

dubbo(提供者、消费者)基于java的实现

1、安装好jdk、zookeeper以后可以尝试开发代码进行dubbo的学习和练习。 首先创建Dubbo的Provider配置。创建一个maven project工程。 RPC框架,不希望Consumer知道具体实现.如果实现类和接口在同一个项目中,Consumer依赖这个项目时,就会知道实现类具体实现。 所以Provider和Consumer创建不同的项目。 然后接...

HiterCoder 530

无线网卡选购指南:哪些型号支持Kali Linux的监听模式?附免驱动网卡推荐

本文详细解析了如何在Kali Linux下选购支持监听模式的无线网卡。核心在于选择兼容的芯片组,如Atheros AR9271和Ralink RT3070等经典型号,并提供了免驱动网卡推荐与实战配置指南,帮助安全研究人员和爱好者快速搭建无线测试环境。

wind6的博客 1555

java编写简单的dubbo提供者

1.先建一个项目 pom.xml文件 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4...

anrenxiao9916的博客 143

同态加密与SEAL库实战:CKKS参数调优避坑指南

本文深入探讨了同态加密技术中CKKS方案的参数调优实践,重点解析了SEAL库中`poly_modulus_degree`、`coeff_modulus`和`scale`三大核心参数的配置技巧与避坑指南。通过实战案例展示了如何平衡计算深度、精度与性能,为开发者提供了一套完整的参数优化方法论,帮助避免常见的'scale out of bounds'等错误,显著提升同态加密应用的可靠性和效率。

weixin_29315569的博客 228

把审批体验做成一体化:SAP Business Workflow 里的 Secondary Method、Before Method 与 After Method

摘要:SAP Business Workflow 中,Task 的 Secondary、Before 和 After 三类方法对提升审批体验和可追溯性至关重要。Secondary Method 可自动展示辅助信息(如审批时弹出排班报表),但需注意其独立会话特性;Before Method 适合预处理和审计留痕;After Method 确保收尾动作可靠执行。三类方法按特定顺序调用,且错误不影响主流程。合理使用这些方法能减少事务码切换,增强审计能力,优化用户体验。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 189

Dubbo:Java分布式服务框架

Dubbo是一种高性能、轻量级的开源Java分布式服务框架,由阿里巴巴公司开发并开源。它提供了一种可靠的RPC(远程过程调用)通信机制,使得应用程序可以通过网络相互调用,实现分布式服务的协同工作。Dubbo的目标是简化分布式服务的开发和部署,提供高性能和可扩展性,并且具备良好的容错和负载均衡能力。通过使用Dubbo,开发人员可以将复杂的分布式系统拆分成多个可独立开发、部署和扩展的服务,从而提高系统的可维护性和可扩展性。

果酱 の 博客 1303

Python 爬虫实战:爬取 GitHub 热门项目(星数 / 语言 / 作者)

本文系统介绍了使用Python爬虫技术获取GitHub热门项目数据的完整方案。通过分析GitHub Trending页面和官方API两种数据源,详细讲解了HTML解析、JSON数据处理、反爬应对策略等关键技术。采用requests、BeautifulSoup、pandas等工具链,实现了项目信息(名称、星数、语言等)的结构化爬取,并配套数据清洗、统计分析及可视化功能。特别强调遵守GitHub API使用规范,包括Token认证、请求频率控制等合规要求。该方案为开发者提供了一种高效、合法的数据采集方法,适用于

2503_91057718的博客 2343

Dubbo 3.0 前瞻:重塑 Spring Cloud 服务治理

作者 | 小马哥 **导读:**Dubbo 社区策划了【Dubbo 云原生之路】系列文章,和大家一起回顾 Apache Dubbo 产品和社区的发展,并展望未来发展。系列文章主要涵盖 Dubbo 技术解读、社区运营、应用案例解析三大部分。本文为系列第 3 篇。 前言 在 Java 微服务生态中,Spring Cloud 成为了开发人员的首选技术栈,然而随着实践的深入和运用规模的扩大,大家逐渐意识到 Spring Cloud 的局限性。 在服务治理方面,相较于Dubbo 而言,Spr.

阿里巴巴云原生的博客 3134

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Dubbo的服务治理是指什么_Dubbo 3.0 前瞻之:重塑 Spring Cloud 服务治理

喜欢就关注我们吧!Dubbo 与开源中国共同策划【Dubbo 云原生之路】系列文章,和大家一起回顾 Apache Dubbo 产品和社区的发展,并展望未来发展。系列文章主要涵盖 Dubbo 技术解读、社区运营、应用案例解析三大部分。本篇为系列第三篇。系列文章:Spring Cloud与Service Mesh夹击,Dubbo云原生之路如何走?迈出云原生重要一步 — Dubbo 3 应用...

weixin_39605463的博客 106

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

springcloud完整项目_Dubbo 3.0前瞻之重塑Spring Cloud服务治理

Dubbo 与开源中国共同策划【Dubbo 云原生之路】系列文章,和大家一起回顾 Apache Dubbo 产品和社区的发展,并展望未来发展。系列文章主要涵盖 Dubbo 技术解读、社区运营、应用案例解析三大部分。本篇为系列第三篇。作者:小马哥(mercyblitz),Java 劝退师,《Spring Boot 编程思想》作者,Apache Dubbo PMC、Spring Cloud Aliba...

weixin_39757743的博客 794

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Dubbo 3.0 前瞻之对接 Kubernetes 原生服务

Kubernetes 是当前全球最流行的容器服务平台,在 Kubernetes 集群中,Dubbo 应用的部署方式往往需要借助第三方注册中心实现服务发现。Dubbo 与 Kubernetes 的调度体系的结合,可以让原本需要管理两套平台的运维成本大大减低,而且 Dubbo 适配了 Kubernetes 原生服务也可以让框架本身更加融入云原生体系。基于 Dubbo 3.0 的全新应用级服务发现模型可以更容易对齐 Kubernetes 的服务模型。 Kubernetes Native Service 在 .

阿里巴巴云原生的博客 898

zookeeper收尾+dubbo前瞻

zookeeper是一个开源的分布式协调框架:数据发布订阅,负载均衡,集群,master选举。 原子性:要么同时成功,要么同是失败(分布式事务) 单一视图:无论客户端连接到哪个服务器,所看到的模型都是一样的 可靠性:一旦服务器端提交了一个事务并且获得了服务器端返回成功的标识,那么这个事务所引起的服务器端的变更会一直保留 实时性:近实时性 zookeeper不是用来存储数据的,通通过监控数...

跨过山和大海的博客 129

十年再出发,Dubbo 3.0 Preview 即将在 3 月发布

作者 | Apache Dubbo 来源|阿里巴巴云原生公众号 2011 年,阿里 B2B 团队决定将项目开源,一年时间就收获了来自不同行业的大批用户 2014 年,由于团队调整,Dubbo 暂停更新 2017 年,Dubbo 开源重启 2019 年,Dubbo 在仅用时 15 个月的情况下从 Apache 基金会毕业 2020 年,阿里内部开始 HSF 和 Dubbo 的融合 2021 年 3 月,Dubbo 3.0 Preview 即将发布 …… 从 2011 到 20.

阿里巴巴云原生的博客 1422

Dubbo 3.0 前瞻之:常用协议对比及 RPC 协议新形态探索

作者 | 郭浩(项升)  阿里巴巴经济体 RPC 框架负责人 导读:Dubbo 社区策划了【Dubbo 云原生之路】系列文章,和大家一起回顾 Apache Dubbo 产品和社区的发展,并展望未来发展。系列文章主要涵盖 Dubbo 技术解读、社区运营、应用案例解析三大部分。本文为系列第 4 篇。 前言 协议是 RPC 的基础。数据在连接上以什么格式传输,服务端如何确定收到请求的大小,同一个连接上能不能同时存在多个请求,请求如果出错了应该怎么响应……这些都是需要协议解决的问题。 从定义上讲,协.

阿里巴巴云原生的博客 4173

springcloud 版本_Dubbo 3.0 前瞻:重塑 Spring Cloud 服务治理

作者 | 小马哥导读:Dubbo 社区策划了【Dubbo 云原生之路】系列文章,和大家一起回顾 Apache Dubbo 产品和社区的发展,并展望未来发展。系列文章主要涵盖 Dubbo 技术解读、社区运营、应用案例解析三大部分。本文为系列第 3 篇。前言在 Java 微服务生态中,Spring Cloud 成为了开发人员的首选技术栈,然而随着实践的深入和运用规模的扩大,大家逐渐意识到 Spring...

weixin_39738416的博客 344

springcloud五大组件?注解_Dubbo 3.0 前瞻:重塑 Spring Cloud 服务治理

作者 | 小马哥导读:Dubbo 社区策划了【Dubbo 云原生之路】系列文章,和大家一起回顾 Apache Dubbo 产品和社区的发展,并展望未来发展。系列文章主要涵盖 Dubbo 技术解读、社区运营、应用案例解析三大部分。本文为系列第 3 篇。前言在 Java 微服务生态中,Spring Cloud 成为了开发人员的首选技术栈,然而随着实践的深入和运用规模的扩大,大家逐渐意识到 S...

weixin_39556590的博客 270

springcloud中cloud-api-common依赖个版本_Dubbo 3.0 前瞻之:重塑 Spring Cloud 服务治理

喜欢就关注我们吧!Dubbo 与开源中国共同策划【Dubbo 云原生之路】系列文章,和大家一起回顾 Apache Dubbo 产品和社区的发展,并展望未来发展。系列文章主要涵盖 Dubbo 技术解读、社区运营、应用案例解析三大部分。本篇为系列第三篇。系列文章:Spring Cloud与Service Mesh夹击,Dubbo云原生之路如何走?迈出云原生重要一步 — Dubbo 3 应用...

weixin_39609887的博客 199

java识别应用层协议_Dubbo 3.0 前瞻之:常用协议对比及 RPC 协议新形态探索

作者 | 郭浩(项升) 阿里巴巴经济体 RPC 框架负责人导读:Dubbo 社区策划了【Dubbo 云原生之路】系列文章,和大家一起回顾 Apache Dubbo 产品和社区的发展,并展望未来发展。系列文章主要涵盖 Dubbo 技术解读、社区运营、应用案例解析三大部分。本文为系列第 4 篇。前言协议是 RPC 的基础。数据在连接上以什么格式传输,服务端如何确定收到请求的大小,同一个连接上能不能同...

weixin_29218509的博客 146

springcloud中cloud-api-common依赖个版本_Dubbo 3.0前瞻之重塑Spring Cloud服务治理

Dubbo 与开源中国共同策划【Dubbo 云原生之路】系列文章,和大家一起回顾 Apache Dubbo 产品和社区的发展,并展望未来发展。系列文章主要涵盖 Dubbo 技术解读、社区运营、应用案例解析三大部分。本篇为系列第三篇。作者:小马哥(mercyblitz),Java 劝退师,《Spring Boot 编程思想》作者,Apache Dubbo PMC、Spring Cloud Aliba...

weixin_39760295的博客 333
下一篇: 面试总结:Spring工作原理
WeideZ
博客等级 码龄10年 0粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值