原创:转载需注明原创地址 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. SpringCloud集成Security安全(Eureka注册中心)

    1.说明 为了保护注册中心的服务安全, 避免恶意服务注册到Eureka, 需要对Eureka Server进行安全保护, 本文基于Spring Security方案, 为Eureka Server增加 ...

  2. Git创建本地仓库

    使用Git创建本地仓库, 可以记录文本文件变化, 这里以自己的文章为例, 利用TortoiseGit工具创建一个本地Git仓库. 1. 切换到需要创建仓库的目录下, 比如:D:\MyDoc\Devel ...

  3. js 简单版发布留言 案例

    <!DOCTYPE html>   <html lang="en">   <head>       <meta charset=" ...

  4. Pytest_用例分组(6)

    用例分组 pytest进行分组测试的方法是使用装饰器 @pytest.mark.标记名称,被标记为相同名称的用例可以看做为同一个组. 分组用例的运行方式是在执行命令中追加 -m "标记名称& ...

  5. 区别对待 .gz 文件 和 .tar.gz 文件

    #检测 tar tvf xxx.tar.gz #解压 tar zxvf #检测 gunzip -tv yyy.gz #解压 gunzip yyy.gz

  6. Java 总结 数据底层原理 【包括 ArrayList、LinkedList、hash table、HashMap、Hashtable、ConcurrentHashMap、hash code、HashSet、LinkedHashMap、LinkedHashSet】

    1.ArrayList (1)底层是由动态数组实现的[使用了List接口]. (2)动态数组是长度不固定,随着数据的增多而变长. (3)如果不指定,默认长度为10,当添加的元素超过当前数组的长度时,会 ...

  7. spring boot + redis --- 心得

    1.前言 习惯使用springMVC 配置 redis ,现在使用spring boot ,得好好总结怎么在spring boot 配置和使用 ,区别真的挺大的. 2.环境 spring boot  ...

  8. springboot集成oss阿里云存储

    一.注册阿里云 二.购买OSS 三.创建桶 设定权限,其它默认即可 四.创建目录 点击桶名,进入创建目录即可. 五.开发文档 引入依赖: <dependency> <groupId& ...

  9. 钓鱼攻击之远程加载恶意Word模版文件上线CS

    0x00 前言 利用Word文档加载附加模板时的缺陷所发起的恶意请求而达到的攻击目的,所以当目标用户点开攻击者发给他的恶意word文档就可以通过向远程服务器请求恶意模板并执行恶意模板上的恶意代码.这里 ...

  10. jmeter和JDK安装教程(Windows)

    1.JDK的安装及环境变量配置 1.JDK的下载安装 JDK官网下载地址:https://www.oracle.com/java/technologies/downloads 然后注册账号,开始下载, ...