原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11798626.html

注*** 本实例为仅适合初学者,关于dubbo和springboot以及各种工具的功能介绍就免了,读者可以自行百度,这里仅示范操作.

准备工具(本人所使用工具和版本):

  JDK1.8 + tomcat8.5 + springboot 2.2.0.RELEASE + zookeeper-3.4.14 + dubbo-admin-2.5.8 + Lombok插件(idea中搜索) + maven3.6.1

----------------分割线-----------------------------------------

开始!!!

1. 创建一个maven主项目oldhen, 目录结构和pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="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.doubleyolk</groupId>
<artifactId>oldhen</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging> <name>Double Yolk</name>
<description>A Springboot with Dubbo Project</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
</parent> <modules>
<module>model</module>
<module>common</module>
<module>provider</module>
<module>consumer</module>
<module>api</module>
</modules> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<dubbo.version>2.5.5</dubbo.version>
<zkclient.version>0.10</zkclient.version>
<lombok.version>1.18.8</lombok.version>
<spring-boot.version>2.2.0.RELEASE</spring-boot.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring-boot.version}</version>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <!-- 使用lombok实现JavaBean的get、set、toString、hashCode、equals等方法的自动生成 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency> <!-- Dubbo依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency> <!--zookeeper的客户端依赖-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>${zkclient.version}</version>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>UTF-8</encoding>
</configuration> </plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build> </project>

oldhen-pom.xml

创建完之后配置好pom.xml之后什么都不用管,下一步.

2. 创建model子模块, 目录结构和pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="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.doubleyolk</groupId>
<artifactId>model</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging> <name>model</name>
<description>Model module of oldhen</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<dubbo.version>2.5.5</dubbo.version>
<zkclient.version>0.10</zkclient.version>
<lombok.version>1.18.8</lombok.version>
<spring-boot.version>2.2.0.RELEASE</spring-boot.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <!-- 使用lombok实现JavaBean的get、set、toString、hashCode、equals等方法的自动生成 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency> </dependencies> </project>

model-pom.xml

Test实体类如下:

package com.oldhen.model.test;

import lombok.Data;

import java.io.Serializable;

/**
* TODO
* TEST 实体
* 使用lombok注解免去set/get,编译的时候会自动写进字节码文件
*/
@Data
public class Test implements Serializable {
private String id;
private String name;
}

Test.java

配置文件可以不需要.

3. 创建common子模块, 目录结构和pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="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"> <groupId>com.doubleyolk</groupId>
<artifactId>common</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging> <modelVersion>4.0.0</modelVersion> <name>common</name>
<description>Common module of oldhen</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<dubbo.version>2.5.5</dubbo.version>
<zkclient.version>0.10</zkclient.version>
<lombok.version>1.18.8</lombok.version>
<spring-boot.version>2.2.0.RELEASE</spring-boot.version>
</properties> <dependencies> <dependency>
<groupId>com.doubleyolk</groupId>
<artifactId>model</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> </dependencies> </project>

common-pom.xml

TestUtil工具类如下:

package com.oldhen.common.test;

import com.oldhen.model.test.Test;

/**
* 测试工具类
*/
public class TestUtil { private TestUtil(){} public static void Test(){
Test test = new Test();
}
}

TestUtil.java

4. 创建api子模块, 目录结构和pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="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.doubleyolk</groupId>
<artifactId>api</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging> <name>api</name>
<description>Api module of oldhen</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<dubbo.version>2.5.5</dubbo.version>
<zkclient.version>0.10</zkclient.version>
<lombok.version>1.18.8</lombok.version>
<spring-boot.version>2.2.0.RELEASE</spring-boot.version>
</properties> <dependencies> <dependency>
<groupId>com.doubleyolk</groupId>
<artifactId>model</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency> <dependency>
<groupId>com.doubleyolk</groupId>
<artifactId>common</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> </dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

api-pom.xml

5. 创建consumer(消费者)子模块, 目录结构和pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="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.doubleyolk</groupId>
<artifactId>consumer</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging> <name>consumer</name>
<description>Consumer module of oldhen</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<zkclient.version>0.10</zkclient.version>
<dubbo.version>2.5.5</dubbo.version>
</properties> <dependencies> <dependency>
<groupId>com.doubleyolk</groupId>
<artifactId>api</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency> <dependency>
<groupId>com.doubleyolk</groupId>
<artifactId>model</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency> <dependency>
<groupId>com.doubleyolk</groupId>
<artifactId>common</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency> <dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
</dependency> <!--zookeeper的客户端依赖-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>${zkclient.version}</version>
</dependency> <dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!-- alibaba的druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency> </dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

consumer-pom.xml

TestConsumer类如下:

package com.oldhen.consumer.test;

import com.oldhen.api.test.TestApi;
import com.oldhen.model.test.Test;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List; /**
* TODO
* Test consumer 层
*/
@RestController
public class TestConsumer { @Resource
TestApi testApi; @GetMapping("/test")
public List<Test> findAllTest(HttpServletRequest request){
String param = request.getParameter("param");
System.out.println("********================****************");
System.out.println("it's comming! ");
List<Test> tests = testApi.findAll();
System.out.println("********================****************");
return tests;
}
}

TestConsumer.java

启动类如下:

package com.oldhen.consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource; /**
* 启动类
*/
@ImportResource({"classpath:spring-dubbo-consumer.xml"})
@SpringBootApplication(scanBasePackages = "com.oldhen.consumer.test")
public class ConsumerApplication { public static void main(String[] args) throws InterruptedException {
SpringApplication.run(ConsumerApplication.class, args);
}
}

配置文件application.yml和消费者dubbo配置文件如下:

server:
port: 9093 spring:
datasource:
name: mysql
url: jdbc:mysql://127.0.0.1:3306/oldhen
username: root
password: root
# 使用druid数据源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
filters: stat
maxActive: 20
initialSize: 1
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20

application.yml

<?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服务名称,需要唯一指定 -->
<dubbo:application name="consumer"/> <!-- dubbo注册在zookeeper上,通过zookeeper实现服务的注册和发布以及订阅 -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" /> <!-- 使用dubbo协议和端口 -->
<dubbo:protocol name="dubbo" port="20880"/> <!-- 此处的id要和提供者那边的一致,接口使用api提供的接口即可,避免与提供者代码耦合-->
<dubbo:reference id="testApi" check="false" interface="com.oldhen.api.test.TestApi"/> <!-- dubbo注解扫描路径 -->
<dubbo:annotation package="com.oldhen.consumer.test.**"/> </beans>

spring-dubbo-consumer.xml

6. 创建provider(提供者)子模块, 目录结构和pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="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.doubleyolk</groupId>
<artifactId>provider</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging> <name>provider</name>
<description>Provider module of oldhen</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<zkclient.version>0.10</zkclient.version>
<dubbo.version>2.5.5</dubbo.version>
</properties> <dependencies> <dependency>
<groupId>com.doubleyolk</groupId>
<artifactId>model</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency> <dependency>
<groupId>com.doubleyolk</groupId>
<artifactId>api</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency> <dependency>
<groupId>com.doubleyolk</groupId>
<artifactId>common</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency> <dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
</dependency> <!--zookeeper的客户端依赖-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>${zkclient.version}</version>
</dependency> <dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!-- alibaba的druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency> </dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

provider-pom.xml

业务层代码:

package com.oldhen.provider.test.biz;

import com.alibaba.dubbo.config.annotation.Service;
import com.oldhen.api.test.TestApi;
import com.oldhen.model.test.Test;
import com.oldhen.provider.test.TestProvider; import javax.annotation.Resource;
import java.util.List; /**
* 业务层
*/
@Service
public class TestApiBiz implements TestApi { @Resource
TestProvider testProvider; @Override
public List<Test> findAll() {
// do something return testProvider.findAll();
}
}

TestApiBiz.java

建库建表语句和dao层代码:

CREATE DATABASE
IF
NOT EXISTS oldhen; CREATE TABLE oldhen_model_test ( id INT NOT NULL PRIMARY KEY, NAME VARCHAR ( 20 ) NOT NULL ) ENGINE = INNODB DEFAULT charset = utf8; INSERT INTO oldhen_model_test
VALUES
( 1, "one" );
INSERT INTO oldhen_model_test
VALUES
( 2, "two" );
INSERT INTO oldhen_model_test
VALUES
( 3, "three" );
INSERT INTO oldhen_model_test
VALUES
( 4, "four" );

data.sql

package com.oldhen.provider.test.dao;

import com.oldhen.model.test.Test;
import org.springframework.stereotype.Component; import java.util.List; /**
* TODO
* Test dao数据访问层
*/
@Component
public interface TestDao {
List<Test> findAllTest();
}

TestDao.java

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.oldhen.provider.test.dao.TestDao">
<resultMap id="test" type="com.oldhen.model.test.Test" >
<!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id -->
<!-- property:主键在pojo中的属性名 -->
<!-- column:主键在数据库中的列名 -->
<id property="id" column="id" /> <!-- 定义普通属性 -->
<result property="name" column="name" />
</resultMap>
<select id="findAllTest" resultType="com.oldhen.model.test.Test">
select mt.* from oldhen_model_test mt
</select>
</mapper>

TestDao.xml

service层代码:

package com.oldhen.provider.test;

import com.oldhen.model.test.Test;

import java.util.List;

/**
* TODO
* Test provider 服务层
*/
public interface TestProvider {
List<Test> findAll();
}

TestProvider.java

package com.oldhen.provider.test.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.oldhen.model.test.Test;
import com.oldhen.provider.test.TestProvider;
import com.oldhen.provider.test.dao.TestDao; import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List; /**
* 服务实现类
*/
@Service
public class TestProviderImpl implements TestProvider { @Resource
TestDao dao; @Override
public List<Test> findAll() {
Test test = new Test();
test.setId("1");
test.setName("hello");
List<Test> tests = new ArrayList<>();
tests.add(test);
return dao.findAllTest();
}
}

TestProviderImpl.java

启动类和配置文件:

package com.oldhen.provider;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource; /**
* 启动类
* MapperScan扫描mapperxml文件
*/
@SpringBootApplication
@MapperScan("com.oldhen.provider.test.dao")
@ImportResource({"classpath:spring-dubbo-provider.xml"})
public class ProviderApplication { public static void main(String[] args) throws InterruptedException {
SpringApplication.run(ProviderApplication.class, args);
/**
* 防止提供者程序中断或停止导致消费者无法调用
* 如果提供者主程序跑完了zookeeper也会中断(原因未知)
*/
synchronized (ProviderApplication.class){
while (true){
ProviderApplication.class.wait();
}
}
}
}
server:
port: 9099 spring:
datasource:
name: mysql
url: jdbc:mysql://127.0.0.1:3306/oldhen?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username: root
password: root
# 使用druid数据源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
filters: stat
maxActive: 20
initialSize: 1
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20
mybatis:
# type-aliases-package: domain
# 指定全局配置文件位置
# config-location: classpath:mybatis/mybatis-config.xml
# 指定sql映射文件位置
mapper-locations: classpath:mapper/*.xml

application.yml

<?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服务名称,需要唯一指定 -->
<dubbo:application name="provider"/> <!-- zookeeper注册中心的ip地址 -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" /> <!-- 扫描注解包路径,多个包用逗号分隔,不填pacakge表示扫描当前ApplicationContext中所有的类 -->
<dubbo:annotation package="com.oldhen.provider.test.impl.**" /> <!-- 使用dubbo协议并且将服务发布在20880端口 -->
<dubbo:protocol name="dubbo" port="20880" /> <!-- 定义实际的api实现类, 具体的功能实现都在在这里,此处的id要和消费者那边的一致 -->
<bean id="testProviderApiBiz" class="com.oldhen.provider.test.biz.TestApiBiz"/> <!-- 发布api接口服务, 实际引用的实现类时上面那个,消费者只要调用这个接口就能直接调用实现类的方法和功能 -->
<dubbo:service interface="com.oldhen.api.test.TestApi" ref="testProviderApiBiz"/>
</beans>

spring-dubbo-provider.xml

7. Zookeeper的配置文件:

tickTime=2000
initLimit=10
syncLimit=5
#文件存储路径,如果是linux则修改为/tmp或者对应的路径
dataDir=D:/tmp/zookeeper
#服务端口,和java中的配置一致即可
clientPort=2181

至此,准备工作已经完毕了!开始运行程序!

a) 执行zookeeper-3.4.14\bin目录下的zkServer.cmd, 本人是win系统,linux运行zkServer.sh即可;将dubbo-admin源码下载下来之后,执行mvn compile, 再执行mvn package打包,然后将打出来的war包放入tomcat中运行即可,此处不作过多讲解.

b) 数据库开起来, 执行sql文件创建数据库和数据表和插入数据;

c) 首先运行提供者的启动类;

d) 其次运行消费者的启动类;

e) 通过访问浏览器 http://192.168.137.1:9093/test/ 来查看是否返回如下数据:

[{"id":"1","name":"one"},{"id":"2","name":"two"},{"id":"3","name":"three"},{"id":"4","name":"four"}]

f) 有的话代表成功了! 没有的话请检查上述工具的版本是否对应!以及是否启动成功!

g) 具体的服务是否启动可以登录 http://127.0.0.1:9090/dubbo-admin-2.5.8 输入用户名root密码root进行登录查看

  

查看相应的服务是否启动即可!没有启动的话请检查环境(jdk版本, Zookeeper版本, dubbo-admin版本)是否正确!缺一不可,请不要随意改动pom文件,否则也可能出现各种兼容性问题导致程序无法运行!

  总结: 整体的思路就是消费者通过实现api层提供的接口来访问接口里面的方法, 这其中消费者不需要关注其他事情,只需要将自己和Zookeeper绑定起来获取Zookeeper上发布的提供者服务即可, 提供者也是通过实现api层提供的接口来实现相应的对数据库访问操作,从而返回数据给消费者,这其中它也不需要关注其他事情,只需要将自己的服务注册发布到Zookeeper上由Zookeeper来给别的服务提供服务,提供者只需要关注自己的业务实现即可,当然model层和common层独立出来可以供消费者和提供者以及api层共同使用,无需重复写JavaBean.

附上笔记图:

- oldhen    主项目
- model 实体层(提供一般的实体类编写,采用lombok来实现去set/get化)
- common 通用层(用来提供工具类或者通用的一些组件等功能)
- api 接口层(主要是用来解耦consumer和provider, 消费者和提供者同时实现api中的接口,提供者进行发布该服务给消费者获取使用)
- consumer 消费层(调用provider, 可以理解为普通的controller层)
- provider 最终提供服务层(为consumer提供服务, 主要是集成了service,mapper/dao 层以及biz(对service进行包装和业务处理的业务层))

provider可以有多个例如 : 订单服务, 用户管理服务, 商品管理服务, 抢购服务, 购物车服务, 支付服务, 评论服务, 会员服务, 搜索服务, 秒杀服务等等模块
consumer也可以针对不同的服务增加不同的消费者,例如: 订单服务消费者, 用户管理服务消费者, 商品管理服务消费者等等.

整体架构示意如下:
  前端(网站/APP) --> dubbo --> 服务层(privider中的各种服务, 通过consumer调用)
      (并列于服务层的下一级)--> 数据访问层 --> 关系型数据库管理器(mycat数据库分片) --> 多个关系型数据库(多个mysql)
      (并列于服务层的下一级)--> 缓存(Redis集群) --> 多个缓存服务(多个redis)
      (并列于服务层的下一级)--> MQ消息队列 --> 通用支撑系统(推送等)
      (并列于服务层的下一级)--> 搜索服务集群 --> 多个搜索服务
  管理后台(网站) --> dubbo --> 服务层(privider中的各种服务, 通过consumer调用)
      (并列于服务层的下一级)--> 数据访问层 --> 关系型数据库管理器(mycat数据库分片) --> 多个关系型数据库(多个mysql)
      (并列于服务层的下一级)--> 缓存(Redis集群) --> 多个缓存服务(多个redis)
      (并列于服务层的下一级)--> MQ消息队列 --> 通用支撑系统(推送等)
      (并列于服务层的下一级)--> 搜索服务集群 --> 多个搜索服

有问题可以在下方留言,可以贴上错误代码!

SpringBoot+Dubbo+ZooKeeper+Maven入门实践的更多相关文章

  1. 搭建SpringBoot+dubbo+zookeeper+maven框架(二)

    上一篇文章是关于搭建SpringBoot+dubbo+zookeeper+maven框架的,但是里面的功能还不够完善,今天就日志管理方面做一些改善. 下了demo的网友可能会发现项目在启动时会有警告: ...

  2. 搭建SpringBoot+dubbo+zookeeper+maven框架(一)

    这几天项目还没来,所以就自己试着参考网上的一些资料,搭建了一个SpringBoot+dubbo+zookeeper+maven框架,网上参考的很多资料照着他们一步一步搭建,最后很多都运行不通,很是郁闷 ...

  3. springboot+dubbo+zookeeper微服务实践demo

    微服务化越来越火,实际上是应互联网时代而生的,微服务化带来的不仅是性能上的提升,更带来了研发组织的更加便利,协作更加轻松,团队效能更高. 当然不能为了技术而技术,我们需要切合实际的对业务进行划分,降低 ...

  4. 搭建SpringBoot+dubbo+zookeeper+maven框架(四)

    今天我们完成框架的thymeleaf模板显示页面功能,页面的用户登陆,密码的AES加密解密,输错3次进行验证码验证功能,东西可能比较多,这个是我这两天在网上结合各种资源整合出来的,基本功能都已经实现, ...

  5. 搭建SpringBoot+dubbo+zookeeper+maven框架(三)

    今天我们要在原来搭建的框架基础上集成redis数据库. redis是Nosql数据库中使用较为广泛的非关系型内存数据库,redis内部是一个key-value存储系统.它支持存储的value类型相对更 ...

  6. springboot+dubbo+zookeeper+mybatis

    参考地址:https://www.cnblogs.com/gaopengfirst/p/9555240.html 首先创建一个maven项目: 再在该父项目中创建3个module,分别是:provid ...

  7. 高可用架构的实现--dubbo+zookeeper+maven+tomcat

    最近在做分布式的服务架构搭建,因为自己确实很喜欢搞这种技术类的研究,所以在公司需要的时候主动承担了这项光荣而艰巨的任务.公司搭建的架构主要目的是需要支持后端接口的多用户的高并发访问,希望能够达到每秒并 ...

  8. SpringBoot + Dubbo + zookeeper 搭建简单分布式服务

    SpringBoot + Dubbo + zookeeper 搭建简单分布式服务 详细操作及源码见: https://github.com/BillyYangOne/dubbo-springboot

  9. SpringBoot+Dubbo+Zookeeper 实例

    前言 当下Java 生态环境里面,微服务占据了非常大的份额,现在大部分新开发的 Java选型的后台程序都很奇妙的会跟微服务发生一些关系.那目前市面上主流的微服务方向主要有 Spring 家族推出的Sp ...

随机推荐

  1. 【MySQL作业】SELECT 数据查询——美和易思模糊查询应用习题

    点击打开所使用到的数据库>>> 1.根据商品名关键字查找商品信息. 查询带"美"字的商品信息: SELECT * FROM goods WHERE goodsNa ...

  2. iis站点下发布多个vue项目

    记录一下iis上某个域名下发布多个vue项目的过程,主要分为webpack打包前的配置和iis重定向的配置. vue打包配置: 1.在webpack 配置文件中(以vue.config.js为例),指 ...

  3. [学习笔记] Oracle创建用户、分配权限、设置角色

    创建用户 create user student --用户名 identified by "123456" --密码 default tablespace USERS --表空间名 ...

  4. 通过 v-once 创建低开销的静态组件

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <script s ...

  5. STM32时钟系统的配置寄存器和源码分析

    一.时钟系统 概述 时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令,时钟系统就是CPU的脉搏,决定cpu速率. STM32有多个时钟来源的选择,为什么 STM32 要有多个时钟源呢 ...

  6. Python 元类实现ORM

    ORM概念 ORM(Object Ralational Mapping,对象关系映射)用来把对象模型表示的对象映射到基于 SQL  的关系模型数据库结构中去.这样,我们在具体的操作实体对象的时候,就不 ...

  7. Shell 中的 expect 命令

    目录 expect 介绍 expect 安装 expect 语法 自动拷贝文件到远程主机 示例一 示例二 示例三 示例四 expect 介绍 借助 expect 处理交互的命令,可以将交互过程如 ss ...

  8. 总结 sql 的 并集、交集、差集

    有两个表 ,表a ,表b , create table a { age  int , name varchar(20) } ending=innodb; insert into a values(13 ...

  9. 新增访客数量MR统计之数据库准备

    关注公众号:分享电脑学习回复"百度云盘" 可以免费获取所有学习文档的代码(不定期更新)云盘目录说明:tools目录是安装包res 目录是每一个课件对应的代码和资源等doc 目录是一 ...

  10. JVM调优工具锦囊

    Arthas线上 分析诊断调优工具 以前我们要排查线上问题,通常使用的是jdk自带的调优工具和命令.最常见的就是dump线上日志,然后下载到本地,导入到jvisualvm工具中.这样操作有诸多不变,现 ...